Created
April 17, 2012 05:04
-
-
Save pamelafox/2403573 to your computer and use it in GitHub Desktop.
Zepto Port (Bootstrap-friendly, Plugin-friendly, etc)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function(undefined){ | |
if (String.prototype.trim === undefined) // fix for iOS 3.2 | |
String.prototype.trim = function(){ return this.replace(/^\s+/, '').replace(/\s+$/, '') }; | |
// For iOS 3.x | |
// from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce | |
if (Array.prototype.reduce === undefined) | |
Array.prototype.reduce = function(fun){ | |
if(this === void 0 || this === null) throw new TypeError(); | |
var t = Object(this), len = t.length >>> 0, k = 0, accumulator; | |
if(typeof fun != 'function') throw new TypeError(); | |
if(len == 0 && arguments.length == 1) throw new TypeError(); | |
if(arguments.length >= 2) | |
accumulator = arguments[1]; | |
else | |
do{ | |
if(k in t){ | |
accumulator = t[k++]; | |
break; | |
} | |
if(++k >= len) throw new TypeError(); | |
} while (true); | |
while (k < len){ | |
if(k in t) accumulator = fun.call(undefined, accumulator, t[k], k, t); | |
k++; | |
} | |
return accumulator; | |
}; | |
})(); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
var Zepto = (function() { | |
var undefined, key, $$, classList, emptyArray = [], slice = emptyArray.slice, | |
document = window.document, | |
elementDisplay = {}, classCache = {}, | |
getComputedStyle = document.defaultView.getComputedStyle, | |
cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, | |
fragmentRE = /^\s*<(\w+)[^>]*>/, | |
elementTypes = [1, 9, 11], | |
adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ], | |
table = document.createElement('table'), | |
tableRow = document.createElement('tr'), | |
containers = { | |
'tr': document.createElement('tbody'), | |
'tbody': table, 'thead': table, 'tfoot': table, | |
'td': tableRow, 'th': tableRow, | |
'*': document.createElement('div') | |
}, | |
readyRE = /complete|loaded|interactive/, | |
classSelectorRE = /^\.([\w-]+)$/, | |
idSelectorRE = /^#([\w-]+)$/, | |
tagSelectorRE = /^[\w-]+$/; | |
function isF(value) { return ({}).toString.call(value) == "[object Function]" } | |
function isO(value) { return value instanceof Object } | |
function isA(value) { return value instanceof Array } | |
function likeArray(obj) { return typeof obj.length == 'number' } | |
function compact(array) { return array.filter(function(item){ return item !== undefined && item !== null }) } | |
function flatten(array) { return array.length > 0 ? [].concat.apply([], array) : array } | |
function camelize(str) { return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } | |
function dasherize(str){ | |
return str.replace(/::/g, '/') | |
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') | |
.replace(/([a-z\d])([A-Z])/g, '$1_$2') | |
.replace(/_/g, '-') | |
.toLowerCase(); | |
} | |
function uniq(array) { return array.filter(function(item,index,array){ return array.indexOf(item) == index }) } | |
function classRE(name){ | |
return name in classCache ? | |
classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')); | |
} | |
function maybeAddPx(name, value) { return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value; } | |
function defaultDisplay(nodeName) { | |
var element, display; | |
if (!elementDisplay[nodeName]) { | |
element = document.createElement(nodeName); | |
document.body.appendChild(element); | |
display = getComputedStyle(element, '').getPropertyValue("display"); | |
element.parentNode.removeChild(element); | |
display == "none" && (display = "block"); | |
elementDisplay[nodeName] = display; | |
} | |
return elementDisplay[nodeName]; | |
} | |
function fragment(html, name) { | |
if (name === undefined) name = fragmentRE.test(html) && RegExp.$1; | |
if (!(name in containers)) name = '*'; | |
var container = containers[name]; | |
container.innerHTML = '' + html; | |
return slice.call(container.childNodes); | |
} | |
function Z(dom, selector){ | |
dom = dom || emptyArray; | |
dom.__proto__ = Z.prototype; | |
dom.selector = selector || ''; | |
return dom; | |
} | |
function $(selector, context){ | |
if (!selector) return Z(); | |
if (context !== undefined) return $(context).find(selector); | |
else if (isF(selector)) return $(document).ready(selector); | |
else if (selector instanceof Z) return selector; | |
else { | |
var dom; | |
if (isA(selector)) dom = compact(selector); | |
else if (elementTypes.indexOf(selector.nodeType) >= 0 || selector === window) | |
dom = [selector], selector = null; | |
else if (fragmentRE.test(selector)) | |
dom = fragment(selector.trim(), RegExp.$1), selector = null; | |
else if (selector.nodeType && selector.nodeType == 3) dom = [selector]; | |
else dom = $$(document, selector); | |
return Z(dom, selector); | |
} | |
} | |
$.extend = function(target){ | |
var args, deep=true; | |
if ( typeof target === 'boolean' ) { | |
target = arguments[1]; | |
args = slice.call(arguments, 2); | |
} else { | |
deep = false; | |
args = slice.call(arguments, 1); | |
} | |
args.forEach(function(source) { | |
for (var key in source) { | |
if ( $.isObject(source[key]) && deep && !source.nodeName ) { | |
target[key] = $.isObject(target[key]) ? target[key] : {}; | |
$.extend(true, target[key], source[key]); | |
} else { | |
target[key] = source[key]; | |
} | |
} | |
}) | |
return target; | |
} | |
function attemptQuerySelectorAll(element, selector) { | |
try { | |
var results = element.querySelectorAll(selector); | |
return slice.call(results); | |
} catch(e) { | |
return [selector]; | |
} | |
} | |
$.qsa = $$ = function(element, selector){ | |
var found; | |
if (element === document && idSelectorRE.test(selector)) { | |
found = element.getElementById(RegExp.$1); | |
return found && [found] || []; | |
} else if (classSelectorRE.test(selector)) { | |
return slice.call(element.getElementsByClassName(RegExp.$1)); | |
} else if (tagSelectorRE.test(selector)) { | |
return slice.call(element.getElementsByTagName(selector)); | |
} else { | |
return attemptQuerySelectorAll(element, selector); | |
} | |
} | |
function filtered(nodes, selector){ | |
return selector === undefined ? $(nodes) : $(nodes).filter(selector); | |
} | |
function funcArg(context, arg, idx, payload){ | |
return isF(arg) ? arg.call(context, idx, payload) : arg; | |
} | |
$.isFunction = isF; | |
$.isObject = isO; | |
$.isArray = isA; | |
$.map = function(elements, callback) { | |
var value, values = [], i, key; | |
if (likeArray(elements)) | |
for (i = 0; i < elements.length; i++) { | |
value = callback(elements[i], i); | |
if (value != null) values.push(value); | |
} | |
else | |
for (key in elements) { | |
value = callback(elements[key], key); | |
if (value != null) values.push(value); | |
} | |
return flatten(values); | |
} | |
$.each = function(elements, callback) { | |
var i, key; | |
if (likeArray(elements)) | |
for(i = 0; i < elements.length; i++) { | |
if(callback.call(elements[i], i, elements[i]) === false) return elements; | |
} | |
else | |
for(key in elements) { | |
if(callback.call(elements[key], key, elements[key]) === false) return elements; | |
} | |
return elements; | |
} | |
$.fn = { | |
forEach: emptyArray.forEach, | |
reduce: emptyArray.reduce, | |
push: emptyArray.push, | |
indexOf: emptyArray.indexOf, | |
concat: emptyArray.concat, | |
map: function(fn){ | |
return $.map(this, function(el, i){ return fn.call(el, i, el) }); | |
}, | |
slice: function(){ | |
return $(slice.apply(this, arguments)); | |
}, | |
ready: function(callback){ | |
if (readyRE.test(document.readyState)) callback($); | |
else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false); | |
return this; | |
}, | |
get: function(idx){ return idx === undefined ? this : this[idx] }, | |
size: function(){ return this.length }, | |
remove: function () { | |
return this.each(function () { | |
if (this.parentNode != null) { | |
this.parentNode.removeChild(this); | |
} | |
}); | |
}, | |
each: function(callback){ | |
this.forEach(function(el, idx){ callback.call(el, idx, el) }); | |
return this; | |
}, | |
filter: function(selector){ | |
return $([].filter.call(this, function(element){ | |
if (selector === ':visible') { | |
var width = element.offsetWidth; | |
var height = element.offsetHeight; | |
var isHidden = (width === 0 && height === 0) || $(element).css("display") === "none"; | |
return !isHidden; | |
} | |
return element.parentNode && $$(element.parentNode, selector).indexOf(element) >= 0; | |
})); | |
}, | |
end: function(){ | |
return this.prevObject || $(); | |
}, | |
andSelf:function(){ | |
return this.add(this.prevObject || $()) | |
}, | |
add:function(selector,context){ | |
return $(uniq(this.concat($(selector,context)))); | |
}, | |
is: function(selector){ | |
return this.length > 0 && $(this[0]).filter(selector).length > 0; | |
}, | |
not: function(selector){ | |
var nodes=[]; | |
if (isF(selector) && selector.call !== undefined) | |
this.each(function(idx){ | |
if (!selector.call(this,idx)) nodes.push(this); | |
}); | |
else { | |
var excludes = typeof selector == 'string' ? this.filter(selector) : | |
(likeArray(selector) && isF(selector.item)) ? slice.call(selector) : $(selector); | |
this.forEach(function(el){ | |
if (excludes.indexOf(el) < 0) nodes.push(el); | |
}); | |
} | |
return $(nodes); | |
}, | |
eq: function(idx){ | |
return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1); | |
}, | |
first: function(){ var el = this[0]; return el && !isO(el) ? el : $(el) }, | |
last: function(){ var el = this[this.length - 1]; return el && !isO(el) ? el : $(el) }, | |
find: function(selector){ | |
var result; | |
if (this.length == 1) result = $$(this[0], selector); | |
else result = this.map(function(){ return $$(this, selector) }); | |
return $(result); | |
}, | |
closest: function(selector, context){ | |
var node = this[0], candidates = $$(context || document, selector); | |
if (!candidates.length) node = null; | |
while (node && candidates.indexOf(node) < 0) | |
node = node !== context && node !== document && node.parentNode; | |
return $(node); | |
}, | |
parents: function(selector){ | |
var ancestors = [], nodes = this; | |
while (nodes.length > 0) | |
nodes = $.map(nodes, function(node){ | |
if ((node = node.parentNode) && node !== document && ancestors.indexOf(node) < 0) { | |
ancestors.push(node); | |
return node; | |
} | |
}); | |
return filtered(ancestors, selector); | |
}, | |
parent: function(selector){ | |
return filtered(uniq(this.pluck('parentNode')), selector); | |
}, | |
children: function(selector){ | |
return filtered(this.map(function(){ return slice.call(this.children) }), selector); | |
}, | |
siblings: function(selector){ | |
return filtered(this.map(function(i, el){ | |
return slice.call(el.parentNode.children).filter(function(child){ return child!==el }); | |
}), selector); | |
}, | |
empty: function(){ return this.each(function(){ this.innerHTML = '' }) }, | |
pluck: function(property){ return this.map(function(){ return this[property] }) }, | |
show: function(){ | |
return this.each(function() { | |
this.style.display == "none" && (this.style.display = null); | |
if (getComputedStyle(this, '').getPropertyValue("display") == "none") { | |
this.style.display = defaultDisplay(this.nodeName) | |
} | |
}) | |
}, | |
replaceWith: function(newContent) { | |
return this.each(function() { | |
$(this).before(newContent).remove(); | |
}); | |
}, | |
wrap: function(newContent) { | |
return this.each(function() { | |
$(this).wrapAll($(newContent)[0].cloneNode(false)); | |
}); | |
}, | |
wrapAll: function(newContent) { | |
if (this[0]) { | |
$(this[0]).before(newContent = $(newContent)); | |
newContent.append(this); | |
} | |
return this; | |
}, | |
unwrap: function(){ | |
this.parent().each(function(){ | |
$(this).replaceWith($(this).children()); | |
}); | |
return this; | |
}, | |
hide: function(){ | |
return this.css("display", "none") | |
}, | |
toggle: function(setting){ | |
return (setting === undefined ? this.css("display") == "none" : setting) ? this.show() : this.hide(); | |
}, | |
prev: function(){ return $(this.pluck('previousElementSibling')) }, | |
next: function(){ return $(this.pluck('nextElementSibling')) }, | |
html: function(html){ | |
return html === undefined ? | |
(this.length > 0 ? this[0].innerHTML : null) : | |
this.each(function (idx) { | |
var originHtml = this.innerHTML; | |
$(this).empty().append( funcArg(this, html, idx, originHtml) ); | |
}); | |
}, | |
text: function(text){ | |
return text === undefined ? | |
(this.length > 0 ? this[0].textContent : null) : | |
this.each(function(){ this.textContent = text }); | |
}, | |
attr: function(name, value){ | |
var res; | |
return (typeof name == 'string' && value === undefined) ? | |
(this.length == 0 ? undefined : | |
(name == 'value' && this[0].nodeName == 'INPUT') ? this.val() : | |
(!(res = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : res | |
) : | |
this.each(function(idx){ | |
if (isO(name)) for (key in name) this.setAttribute(key, name[key]) | |
else this.setAttribute(name, funcArg(this, value, idx, this.getAttribute(name))); | |
}); | |
}, | |
removeAttr: function(name) { | |
return this.each(function() { this.removeAttribute(name); }); | |
}, | |
data: function(name, value){ | |
return this.attr('data-' + name, value); | |
}, | |
val: function(value){ | |
return (value === undefined) ? | |
(this.length > 0 ? this[0].value : null) : | |
this.each(function(idx){ | |
this.value = funcArg(this, value, idx, this.value); | |
}); | |
}, | |
offset: function(){ | |
if(this.length==0) return null; | |
var obj = this[0].getBoundingClientRect(); | |
return { | |
left: obj.left + window.pageXOffset, | |
top: obj.top + window.pageYOffset, | |
width: obj.width, | |
height: obj.height | |
}; | |
}, | |
css: function(property, value){ | |
if (value === undefined && typeof property == 'string') { | |
return( | |
this.length == 0 | |
? undefined | |
: this[0].style[camelize(property)] || getComputedStyle(this[0], '').getPropertyValue(property) | |
); | |
} | |
var css = ''; | |
for (key in property) css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'; | |
if (typeof property == 'string') css = dasherize(property) + ":" + maybeAddPx(property, value); | |
return this.each(function() { this.style.cssText += ';' + css }); | |
}, | |
index: function(element){ | |
return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]); | |
}, | |
hasClass: function(name){ | |
if (this.length < 1) return false; | |
else return classRE(name).test(this[0].className); | |
}, | |
addClass: function(name){ | |
return this.each(function(idx) { | |
classList = []; | |
var cls = this.className, newName = funcArg(this, name, idx, cls); | |
newName.split(/\s+/g).forEach(function(klass) { | |
if (!$(this).hasClass(klass)) { | |
classList.push(klass) | |
} | |
}, this); | |
classList.length && (this.className += (cls ? " " : "") + classList.join(" ")) | |
}); | |
}, | |
removeClass: function(name){ | |
return this.each(function(idx) { | |
if(name === undefined) | |
return this.className = ''; | |
classList = this.className; | |
funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass) { | |
classList = classList.replace(classRE(klass), " ") | |
}); | |
this.className = classList.trim() | |
}); | |
}, | |
toggleClass: function(name, when){ | |
return this.each(function(idx){ | |
var newName = funcArg(this, name, idx, this.className); | |
(when === undefined ? !$(this).hasClass(newName) : when) ? | |
$(this).addClass(newName) : $(this).removeClass(newName); | |
}); | |
} | |
}; | |
'filter,add,not,eq,first,last,find,closest,parents,parent,children,siblings'.split(',').forEach(function(property){ | |
var fn = $.fn[property]; | |
$.fn[property] = function() { | |
var ret = fn.apply(this, arguments); | |
ret.prevObject = this; | |
return ret; | |
} | |
}); | |
['width', 'height'].forEach(function(dimension){ | |
$.fn[dimension] = function(value) { | |
var offset, Dimension = dimension.replace(/./, function(m) { return m[0].toUpperCase() }); | |
if (value === undefined) return this[0] == window ? window['inner' + Dimension] : | |
this[0] == document ? document.documentElement['offset' + Dimension] : | |
(offset = this.offset()) && offset[dimension]; | |
else return this.each(function(idx){ | |
var el = $(this); | |
el.css(dimension, funcArg(this, value, idx, el[dimension]())); | |
}); | |
} | |
}); | |
function insert(operator, target, node) { | |
var parent = (operator % 2) ? target : target.parentNode; | |
parent && parent.insertBefore(node, | |
!operator ? target.nextSibling : // after | |
operator == 1 ? parent.firstChild : // prepend | |
operator == 2 ? target : // before | |
null); // append | |
} | |
function traverseNode (node, fun) { | |
fun(node); | |
for (var key in node.childNodes) { | |
traverseNode(node.childNodes[key], fun); | |
} | |
} | |
adjacencyOperators.forEach(function(key, operator) { | |
$.fn[key] = function(){ | |
var nodes = $.map(arguments, function(html) { | |
return isO(html) ? html : fragment(html); | |
}); | |
if (nodes.length < 1) return this; | |
var size = this.length, copyByClone = size > 1, inReverse = operator < 2; | |
return this.each(function(index, target){ | |
for (var i = 0; i < nodes.length; i++) { | |
var node = nodes[inReverse ? nodes.length-i-1 : i]; | |
traverseNode(node, function (node) { | |
if (node.nodeName != null && node.nodeName.toUpperCase() === 'SCRIPT' && (!node.type || node.type === 'text/javascript')) { | |
window['eval'].call(window, node.innerHTML); | |
} | |
}); | |
if (copyByClone && index < size - 1) node = node.cloneNode(true); | |
insert(operator, target, node); | |
} | |
}); | |
}; | |
var reverseKey = (operator % 2) ? key+'To' : 'insert'+(operator ? 'Before' : 'After'); | |
$.fn[reverseKey] = function(html) { | |
$(html)[key](this); | |
return this; | |
}; | |
}); | |
Z.prototype = $.fn; | |
return $; | |
})(); | |
window.Zepto = Zepto; | |
'$' in window || (window.$ = Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($){ | |
var $$ = $.qsa, handlers = {}, _zid = 1, specialEvents={}; | |
specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'; | |
function zid(element) { | |
return element._zid || (element._zid = _zid++); | |
} | |
function findHandlers(element, event, fn, selector) { | |
event = parse(event); | |
if (event.ns) var matcher = matcherFor(event.ns); | |
return (handlers[zid(element)] || []).filter(function(handler) { | |
return handler | |
&& (!event.e || handler.e == event.e) | |
&& (!event.ns || matcher.test(handler.ns)) | |
&& (!fn || handler.fn == fn) | |
&& (!selector || handler.sel == selector); | |
}); | |
} | |
function parse(event) { | |
var parts = ('' + event).split('.'); | |
return {e: parts[0], ns: parts.slice(1).sort().join(' ')}; | |
} | |
function matcherFor(ns) { | |
return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)'); | |
} | |
function eachEvent(events, fn, iterator){ | |
if ($.isObject(events)) $.each(events, iterator); | |
else events.split(/\s/).forEach(function(type){ iterator(type, fn) }); | |
} | |
function add(element, events, fn, selector, getDelegate){ | |
var id = zid(element), set = (handlers[id] || (handlers[id] = [])); | |
eachEvent(events, fn, function(event, fn){ | |
var delegate = getDelegate && getDelegate(fn, event), | |
callback = delegate || fn; | |
var proxyfn = function (event) { | |
if (callback) { | |
var result = callback.apply(element, [event].concat(event.data)); | |
if (result === false) event.preventDefault(); | |
return result; | |
} | |
}; | |
var handler = $.extend(parse(event), {fn: fn, proxy: proxyfn, sel: selector, del: delegate, i: set.length}); | |
set.push(handler); | |
if (element.addEventListener) { | |
element.addEventListener(handler.e, proxyfn, false); | |
} | |
}); | |
} | |
function remove(element, events, fn, selector){ | |
var id = zid(element); | |
eachEvent(events || '', fn, function(event, fn){ | |
findHandlers(element, event, fn, selector).forEach(function(handler) { | |
delete handlers[id][handler.i]; | |
element.removeEventListener(handler.e, handler.proxy, false); | |
}); | |
}); | |
} | |
$.event = { add: add, remove: remove } | |
$.fn.bind = function(event, callback){ | |
return this.each(function(){ | |
add(this, event, callback); | |
}); | |
}; | |
$.fn.unbind = function(event, callback){ | |
return this.each(function(){ | |
remove(this, event, callback); | |
}); | |
}; | |
$.fn.one = function(event, callback){ | |
return this.each(function(i, element){ | |
add(this, event, callback, null, function(fn, type){ | |
return function(){ | |
var result = fn && fn.apply(element, arguments); | |
remove(element, type, fn); | |
return result; | |
} | |
}); | |
}); | |
}; | |
var returnTrue = function(){return true}, | |
returnFalse = function(){return false}, | |
eventMethods = { | |
preventDefault: 'isDefaultPrevented', | |
stopImmediatePropagation: 'isImmediatePropagationStopped', | |
stopPropagation: 'isPropagationStopped' | |
}; | |
function createProxy(event) { | |
var proxy = $.extend({originalEvent: event}, event); | |
$.each(eventMethods, function(name, predicate) { | |
proxy[name] = function(){ | |
this[predicate] = returnTrue; | |
return event[name].apply(event, arguments); | |
}; | |
proxy[predicate] = returnFalse; | |
}) | |
return proxy; | |
} | |
// emulates the 'defaultPrevented' property for browsers that have none | |
function fix(event) { | |
if (!('defaultPrevented' in event)) { | |
event.defaultPrevented = false; | |
var prevent = event.preventDefault; | |
event.preventDefault = function() { | |
this.defaultPrevented = true; | |
prevent.call(this); | |
} | |
} | |
} | |
$.fn.delegate = function(selector, event, callback){ | |
return this.each(function(i, element){ | |
add(element, event, callback, selector, function(fn){ | |
return function(e){ | |
var evt, match = $(e.target).closest(selector, element).get(0); | |
if (match) { | |
evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element}); | |
return fn.apply(match, [evt].concat([].slice.call(arguments, 1))); | |
} | |
} | |
}); | |
}); | |
}; | |
$.fn.undelegate = function(selector, event, callback){ | |
return this.each(function(){ | |
remove(this, event, callback, selector); | |
}); | |
} | |
$.fn.live = function(event, callback){ | |
$(document.body).delegate(this.selector, event, callback); | |
return this; | |
}; | |
$.fn.die = function(event, callback){ | |
$(document.body).undelegate(this.selector, event, callback); | |
return this; | |
}; | |
$.fn.on = function(event, selector, callback){ | |
return selector === undefined || $.isFunction(selector) ? | |
this.bind(event, selector) : this.delegate(selector, event, callback); | |
}; | |
$.fn.off = function(event, selector, callback){ | |
return selector === undefined || $.isFunction(selector) ? | |
this.unbind(event, selector) : this.undelegate(selector, event, callback); | |
}; | |
$.fn.trigger = function(event, data){ | |
if (typeof event == 'string') event = $.Event(event); | |
fix(event); | |
event.data = data; | |
return this.each(function(){ | |
if (this.dispatchEvent) { | |
try { | |
this.dispatchEvent(event); | |
} catch(e) {} | |
} | |
}); | |
}; | |
// triggers event handlers on current element just as if an event occurred, | |
// doesn't trigger an actual event, doesn't bubble | |
$.fn.triggerHandler = function(event, data){ | |
var e, result; | |
this.each(function(i, element){ | |
e = createProxy(typeof event == 'string' ? $.Event(event) : event); | |
e.data = data; e.target = element; | |
$.each(findHandlers(element, event.type || event), function(i, handler){ | |
result = handler.proxy(e); | |
if (e.isImmediatePropagationStopped()) return false; | |
}); | |
}); | |
return result; | |
}; | |
// shortcut methods for `.bind(event, fn)` for each event type | |
('focusin focusout load resize scroll unload click dblclick '+ | |
'mousedown mouseup mousemove mouseover mouseout '+ | |
'change select keydown keypress keyup error').split(' ').forEach(function(event) { | |
$.fn[event] = function(callback){ return this.bind(event, callback) }; | |
}); | |
['focus', 'blur'].forEach(function(name) { | |
$.fn[name] = function(callback) { | |
if (callback) this.bind(name, callback); | |
else if (this.length) try { this.get(0)[name]() } catch(e){}; | |
return this; | |
}; | |
}); | |
$.Event = function(type, props) { | |
var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true; | |
if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name]); | |
event.initEvent(type, bubbles, true, null, null, null, null, null, null, null, null, null, null, null, null); | |
return event; | |
}; | |
})(Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($){ | |
function detect(ua){ | |
var os = (this.os = {}), browser = (this.browser = {}), | |
webkit = ua.match(/WebKit\/([\d.]+)/), | |
android = ua.match(/(Android)\s+([\d.]+)/), | |
ipad = ua.match(/(iPad).*OS\s([\d_]+)/), | |
iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/), | |
webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/), | |
touchpad = webos && ua.match(/TouchPad/), | |
blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); | |
if (webkit) browser.version = webkit[1]; | |
browser.webkit = !!webkit; | |
if (android) os.android = true, os.version = android[2]; | |
if (iphone) os.ios = true, os.version = iphone[2].replace(/_/g, '.'), os.iphone = true; | |
if (ipad) os.ios = true, os.version = ipad[2].replace(/_/g, '.'), os.ipad = true; | |
if (webos) os.webos = true, os.version = webos[2]; | |
if (touchpad) os.touchpad = true; | |
if (blackberry) os.blackberry = true, os.version = blackberry[2]; | |
} | |
// ### $.os | |
// | |
// Object containing information about browser platform | |
// | |
// *Example:* | |
// | |
// $.os.ios // => true if running on Apple iOS | |
// $.os.android // => true if running on Android | |
// $.os.webos // => true if running on HP/Palm WebOS | |
// $.os.touchpad // => true if running on a HP TouchPad | |
// $.os.version // => string with a version number, e.g. | |
// "4.0", "3.1.1", "2.1", etc. | |
// $.os.iphone // => true if running on iPhone | |
// $.os.ipad // => true if running on iPad | |
// $.os.blackberry // => true if running on BlackBerry | |
// | |
// ### $.browser | |
// | |
// *Example:* | |
// | |
// $.browser.webkit // => true if the browser is WebKit-based | |
// $.browser.version // => WebKit version string | |
detect.call($, navigator.userAgent); | |
// make available to unit tests | |
$.__detect = detect; | |
})(Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($){ | |
var jsonpID = 0, | |
isObject = $.isObject, | |
document = window.document, | |
key, | |
name; | |
// trigger a custom event and return false if it was cancelled | |
function triggerAndReturn(context, eventName, data) { | |
var event = $.Event(eventName); | |
$(context).trigger(event, data); | |
return !event.defaultPrevented; | |
} | |
// trigger an Ajax "global" event | |
function triggerGlobal(settings, context, eventName, data) { | |
if (settings.global) return triggerAndReturn(context || document, eventName, data); | |
} | |
// Number of active Ajax requests | |
$.active = 0; | |
function ajaxStart(settings) { | |
if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart'); | |
} | |
function ajaxStop(settings) { | |
if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop'); | |
} | |
// triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable | |
function ajaxBeforeSend(xhr, settings) { | |
var context = settings.context; | |
if (settings.beforeSend.call(context, xhr, settings) === false || | |
triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) | |
return false; | |
triggerGlobal(settings, context, 'ajaxSend', [xhr, settings]); | |
} | |
function ajaxSuccess(data, xhr, settings) { | |
var context = settings.context, status = 'success'; | |
settings.success.call(context, data, status, xhr); | |
triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]); | |
ajaxComplete(status, xhr, settings); | |
} | |
// type: "timeout", "error", "abort", "parsererror" | |
function ajaxError(error, type, xhr, settings) { | |
var context = settings.context; | |
settings.error.call(context, xhr, type, error); | |
triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error]); | |
ajaxComplete(type, xhr, settings); | |
} | |
// status: "success", "notmodified", "error", "timeout", "abort", "parsererror" | |
function ajaxComplete(status, xhr, settings) { | |
var context = settings.context; | |
settings.complete.call(context, xhr, status); | |
triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]); | |
ajaxStop(settings); | |
} | |
// Empty function, used as default callback | |
function empty() {} | |
// ### $.ajaxJSONP | |
// | |
// Load JSON from a server in a different domain (JSONP) | |
// | |
// *Arguments:* | |
// | |
// options — object that configure the request, | |
// see avaliable options below | |
// | |
// *Avaliable options:* | |
// | |
// url — url to which the request is sent | |
// success — callback that is executed if the request succeeds | |
// error — callback that is executed if the server drops error | |
// context — in which context to execute the callbacks in | |
// | |
// *Example:* | |
// | |
// $.ajaxJSONP({ | |
// url: 'http://example.com/projects?callback=?', | |
// success: function (data) { | |
// projects.push(json); | |
// } | |
// }); | |
// | |
$.ajaxJSONP = function(options){ | |
var callbackName = 'jsonp' + (++jsonpID), | |
script = document.createElement('script'), | |
abort = function(){ | |
$(script).remove(); | |
if (callbackName in window) window[callbackName] = empty; | |
ajaxComplete(xhr, options, 'abort'); | |
}, | |
xhr = { abort: abort }, abortTimeout; | |
window[callbackName] = function(data){ | |
clearTimeout(abortTimeout); | |
$(script).remove(); | |
delete window[callbackName]; | |
ajaxSuccess(data, xhr, options); | |
}; | |
script.src = options.url.replace(/=\?/, '=' + callbackName); | |
$('head').append(script); | |
if (options.timeout > 0) abortTimeout = setTimeout(function(){ | |
xhr.abort(); | |
ajaxComplete(xhr, options, 'timeout'); | |
}, options.timeout); | |
return xhr; | |
}; | |
// ### $.ajaxSettings | |
// | |
// AJAX settings | |
// | |
$.ajaxSettings = { | |
// Default type of request | |
type: 'GET', | |
// Callback that is executed before request | |
beforeSend: empty, | |
// Callback that is executed if the request succeeds | |
success: empty, | |
// Callback that is executed the the server drops error | |
error: empty, | |
// Callback that is executed on request complete (both: error and success) | |
complete: empty, | |
// The context for the callbacks | |
context: null, | |
// Whether to trigger "global" Ajax events | |
global: true, | |
// Transport | |
xhr: function () { | |
return new window.XMLHttpRequest(); | |
}, | |
// MIME types mapping | |
accepts: { | |
script: 'text/javascript, application/javascript', | |
json: 'application/json', | |
xml: 'application/xml, text/xml', | |
html: 'text/html', | |
text: 'text/plain' | |
}, | |
// Custom fields | |
xhrFields: {}, | |
// Whether the request is to another domain | |
crossDomain: false, | |
// Default timeout | |
timeout: 0 | |
}; | |
// ### $.ajax | |
// | |
// Perform AJAX request | |
// | |
// *Arguments:* | |
// | |
// options — object that configure the request, | |
// see avaliable options below | |
// | |
// *Avaliable options:* | |
// | |
// type ('GET') — type of request GET / POST | |
// url (window.location) — url to which the request is sent | |
// data — data to send to server, | |
// can be string or object | |
// dataType ('json') — what response type you accept from | |
// the server: | |
// 'json', 'xml', 'html', or 'text' | |
// timeout (0) — request timeout | |
// beforeSend — callback that is executed before | |
// request send | |
// complete — callback that is executed on request | |
// complete (both: error and success) | |
// success — callback that is executed if | |
// the request succeeds | |
// error — callback that is executed if | |
// the server drops error | |
// context — in which context to execute the | |
// callbacks in | |
// | |
// *Example:* | |
// | |
// $.ajax({ | |
// type: 'POST', | |
// url: '/projects', | |
// data: { name: 'Zepto.js' }, | |
// dataType: 'html', | |
// timeout: 100, | |
// context: $('body'), | |
// success: function (data) { | |
// this.append(data); | |
// }, | |
// error: function (xhr, type) { | |
// alert('Error!'); | |
// } | |
// }); | |
// | |
$.ajax = function(options){ | |
var settings = $.extend({}, options || {}); | |
for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]; | |
ajaxStart(settings); | |
if (!settings.crossDomain) settings.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(settings.url) && | |
RegExp.$2 != window.location.host; | |
if (/=\?/.test(settings.url)) return $.ajaxJSONP(settings); | |
if (!settings.url) settings.url = window.location.toString(); | |
if (settings.data && !settings.contentType) settings.contentType = 'application/x-www-form-urlencoded'; | |
if (isObject(settings.data)) settings.data = $.param(settings.data); | |
if (settings.type.match(/get/i) && settings.data) { | |
var queryString = settings.data; | |
if (settings.url.match(/\?.*=/)) { | |
queryString = '&' + queryString; | |
} else if (queryString[0] != '?') { | |
queryString = '?' + queryString; | |
} | |
settings.url += queryString; | |
} | |
var mime = settings.accepts[settings.dataType], | |
baseHeaders = { }, | |
protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, | |
xhr = $.ajaxSettings.xhr(), abortTimeout; | |
if (!settings.crossDomain) baseHeaders['X-Requested-With'] = 'XMLHttpRequest'; | |
if (mime) baseHeaders['Accept'] = mime; | |
settings.headers = $.extend(baseHeaders, settings.headers || {}); | |
xhr.onreadystatechange = function(){ | |
if (xhr.readyState == 4) { | |
clearTimeout(abortTimeout); | |
var result, error = false; | |
if ((xhr.status >= 200 && xhr.status < 300) || (xhr.status == 0 && protocol == 'file:')) { | |
if (mime == 'application/json' && !(/^\s*$/.test(xhr.responseText))) { | |
try { result = JSON.parse(xhr.responseText); } | |
catch (e) { error = e; } | |
} | |
else result = xhr.responseText; | |
if (error) ajaxError(error, 'parsererror', xhr, settings); | |
else ajaxSuccess(result, xhr, settings); | |
} else { | |
ajaxError(null, 'error', xhr, settings); | |
} | |
} | |
}; | |
xhr.open(settings.type, settings.url, true); | |
//if (settings.withCredentials) xhr.withCredentials = true; | |
if (settings.xhrFields) { | |
for (var field in settings.xhrFields) { | |
xhr[field] = settings.xhrFields[field]; | |
} | |
} | |
if (settings.contentType) settings.headers['Content-Type'] = settings.contentType; | |
for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]); | |
if (ajaxBeforeSend(xhr, settings) === false) { | |
xhr.abort(); | |
return false; | |
} | |
if (settings.timeout > 0) abortTimeout = setTimeout(function(){ | |
xhr.onreadystatechange = empty; | |
xhr.abort(); | |
ajaxError(null, 'timeout', xhr, settings); | |
}, settings.timeout); | |
if (settings.data === '') settings.data = null; | |
xhr.send(settings.data); | |
return xhr; | |
}; | |
// ### $.get | |
// | |
// Load data from the server using a GET request | |
// | |
// *Arguments:* | |
// | |
// url — url to which the request is sent | |
// success — callback that is executed if the request succeeds | |
// | |
// *Example:* | |
// | |
// $.get( | |
// '/projects/42', | |
// function (data) { | |
// $('body').append(data); | |
// } | |
// ); | |
// | |
$.get = function(url, success){ return $.ajax({ url: url, success: success }) }; | |
// ### $.post | |
// | |
// Load data from the server using POST request | |
// | |
// *Arguments:* | |
// | |
// url — url to which the request is sent | |
// [data] — data to send to server, can be string or object | |
// [success] — callback that is executed if the request succeeds | |
// [dataType] — type of expected response | |
// 'json', 'xml', 'html', or 'text' | |
// | |
// *Example:* | |
// | |
// $.post( | |
// '/projects', | |
// { name: 'Zepto.js' }, | |
// function (data) { | |
// $('body').append(data); | |
// }, | |
// 'html' | |
// ); | |
// | |
$.post = function(url, data, success, dataType){ | |
if ($.isFunction(data)) dataType = dataType || success, success = data, data = null; | |
return $.ajax({ type: 'POST', url: url, data: data, success: success, dataType: dataType }); | |
}; | |
// ### $.getJSON | |
// | |
// Load JSON from the server using GET request | |
// | |
// *Arguments:* | |
// | |
// url — url to which the request is sent | |
// success — callback that is executed if the request succeeds | |
// | |
// *Example:* | |
// | |
// $.getJSON( | |
// '/projects/42', | |
// function (json) { | |
// projects.push(json); | |
// } | |
// ); | |
// | |
$.getJSON = function(url, success){ | |
return $.ajax({ url: url, success: success, dataType: 'json' }); | |
}; | |
// ### $.fn.load | |
// | |
// Load data from the server into an element | |
// | |
// *Arguments:* | |
// | |
// url — url to which the request is sent | |
// [success] — callback that is executed if the request succeeds | |
// | |
// *Examples:* | |
// | |
// $('#project_container').get( | |
// '/projects/42', | |
// function () { | |
// alert('Project was successfully loaded'); | |
// } | |
// ); | |
// | |
// $('#project_comments').get( | |
// '/projects/42 #comments', | |
// function () { | |
// alert('Comments was successfully loaded'); | |
// } | |
// ); | |
// | |
$.fn.load = function(url, success){ | |
if (!this.length) return this; | |
var self = this, parts = url.split(/\s/), selector; | |
if (parts.length > 1) url = parts[0], selector = parts[1]; | |
$.get(url, function(response){ | |
self.html(selector ? | |
$(document.createElement('div')).html(response).find(selector).html() | |
: response); | |
success && success.call(self); | |
}); | |
return this; | |
}; | |
var escape = encodeURIComponent; | |
function serialize(params, obj, traditional, scope){ | |
var array = $.isArray(obj); | |
$.each(obj, function(key, value) { | |
if (scope) key = traditional ? scope : scope + '[' + (array ? '' : key) + ']'; | |
// handle data in serializeArray() format | |
if (!scope && array) params.add(value.name, value.value); | |
// recurse into nested objects | |
else if (traditional ? $.isArray(value) : isObject(value)) | |
serialize(params, value, traditional, key); | |
else params.add(key, value); | |
}); | |
} | |
// ### $.param | |
// | |
// Encode object as a string of URL-encoded key-value pairs | |
// | |
// *Arguments:* | |
// | |
// obj — object to serialize | |
// [traditional] — perform shallow serialization | |
// | |
// *Example:* | |
// | |
// $.param( { name: 'Zepto.js', version: '0.6' } ); | |
// | |
$.param = function(obj, traditional){ | |
var params = []; | |
params.add = function(k, v){ this.push(escape(k) + '=' + escape(v)) }; | |
serialize(params, obj, traditional); | |
return params.join('&').replace('%20', '+'); | |
}; | |
})(Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function ($) { | |
// ### $.fn.serializeArray | |
// | |
// Encode a set of form elements as an array of names and values | |
// | |
// *Example:* | |
// | |
// $('#login_form').serializeArray(); | |
// | |
// returns | |
// | |
// [ | |
// { | |
// name: 'email', | |
// value: 'koss@nocorp.me' | |
// }, | |
// { | |
// name: 'password', | |
// value: '123456' | |
// } | |
// ] | |
// | |
$.fn.serializeArray = function () { | |
var result = [], el; | |
$( Array.prototype.slice.call(this.get(0).elements) ).each(function () { | |
el = $(this); | |
var type = el.attr('type'); | |
if ( | |
!this.disabled && type != 'submit' && type != 'reset' && type != 'button' && | |
((type != 'radio' && type != 'checkbox') || this.checked) | |
) { | |
result.push({ | |
name: el.attr('name'), | |
value: el.val() | |
}); | |
} | |
}); | |
return result; | |
}; | |
// ### $.fn.serialize | |
// | |
// | |
// Encode a set of form elements as a string for submission | |
// | |
// *Example:* | |
// | |
// $('#login_form').serialize(); | |
// | |
// returns | |
// | |
// "email=koss%40nocorp.me&password=123456" | |
// | |
$.fn.serialize = function () { | |
var result = []; | |
this.serializeArray().forEach(function (elm) { | |
result.push( encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value) ); | |
}); | |
return result.join('&'); | |
}; | |
// ### $.fn.submit | |
// | |
// Bind or trigger the submit event for a form | |
// | |
// *Examples:* | |
// | |
// To bind a handler for the submit event: | |
// | |
// $('#login_form').submit(function (e) { | |
// alert('Form was submitted!'); | |
// e.preventDefault(); | |
// }); | |
// | |
// To trigger form submit: | |
// | |
// $('#login_form').submit(); | |
// | |
$.fn.submit = function (callback) { | |
if (callback) this.bind('submit', callback) | |
else if (this.length) { | |
var event = $.Event('submit'); | |
this.eq(0).trigger(event); | |
if (!event.defaultPrevented) this.get(0).submit() | |
} | |
return this; | |
} | |
})(Zepto); | |
(function($) { | |
var data = {}, dataAttr = $.fn.data, | |
uuid = $.uuid = +new Date(), | |
exp = $.expando = 'Zepto' + uuid; | |
function getData(node, name) { | |
var id = node[exp], store = id && data[id]; | |
return name === undefined ? store || setData(node) : | |
(store && store[name]) || dataAttr.call($(node), name); | |
} | |
function setData(node, name, value) { | |
var id = node[exp] || (node[exp] = ++uuid), | |
store = data[id] || (data[id] = {}); | |
if (name !== undefined) store[name] = value; | |
return store; | |
}; | |
$.fn.data = function(name, value) { | |
return value === undefined ? | |
this.length == 0 ? undefined : getData(this[0], name) : | |
this.each(function(idx){ | |
setData(this, name, $.isFunction(value) ? | |
value.call(this, idx, getData(this, name)) : value); | |
}); | |
}; | |
})(Zepto); | |
(function($) { | |
// Used by dateinput | |
$.expr = {':': {}}; | |
// Used by bootstrap | |
$.support = { | |
opacity: true | |
}; | |
// Used by dateinput | |
$.fn.clone = function() { | |
var ret = $(); | |
this.each(function(){ | |
ret.push(this.cloneNode(true)); | |
}); | |
return ret; | |
}; | |
// Used by util.js | |
// Create scrollLeft and scrollTop methods | |
["Left", "Top"].forEach(function(name, i) { | |
var method = "scroll" + name; | |
function isWindow( obj ) { | |
return obj && typeof obj === "object" && "setInterval" in obj; | |
} | |
function getWindow( elem ) { | |
return isWindow( elem ) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; | |
} | |
$.fn[ method ] = function( val ) { | |
var elem, win; | |
if ( val === undefined ) { | |
elem = this[ 0 ]; | |
if ( !elem ) { | |
return null; | |
} | |
win = getWindow( elem ); | |
// Return the scroll offset | |
return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : | |
win.document.documentElement[ method ] || | |
win.document.body[ method ] : | |
elem[ method ]; | |
} | |
// Set the scroll offset | |
this.each(function() { | |
win = getWindow( this ); | |
if ( win ) { | |
var xCoord = !i ? val : $( win ).scrollLeft(); | |
var yCoord = i ? val : $( win ).scrollTop(); | |
win.scrollTo(xCoord, yCoord); | |
} else { | |
this[ method ] = val; | |
} | |
}); | |
} | |
}); | |
// Used by colorslider.js | |
['width', 'height'].forEach(function(dimension) { | |
var offset, Dimension = dimension.replace(/./, function(m) { return m[0].toUpperCase() }); | |
$.fn['outer' + Dimension] = function(margin) { | |
var elem = this; | |
if (elem) { | |
var size = elem[dimension](); | |
var sides = {'width': ['left', 'right'], 'height': ['top', 'bottom']}; | |
sides[dimension].forEach(function(side) { | |
if (margin) size += parseInt(elem.css('margin-' + side), 10); | |
}); | |
return size; | |
} else { | |
return null; | |
} | |
}; | |
}); | |
// Used by bootstrap | |
$.proxy = function( fn, context ) { | |
if ( typeof context === "string" ) { | |
var tmp = fn[ context ]; | |
context = fn; | |
fn = tmp; | |
} | |
// Quick check to determine if target is callable, in the spec | |
// this throws a TypeError, but we will just return undefined. | |
if ( !$.isFunction( fn ) ) { | |
return undefined; | |
} | |
// Simulated bind | |
var args = Array.prototype.slice.call( arguments, 2 ), | |
proxy = function() { | |
return fn.apply( context, args.concat( Array.prototype.slice.call( arguments ) ) ); | |
}; | |
// Set the guid of unique handler to the same of original handler, so it can be removed | |
proxy.guid = fn.guid = fn.guid || proxy.guid || $.guid++; | |
return proxy; | |
}; | |
// Used by timeago | |
var nativeTrim = String.prototype.trim; | |
$.trim = function(str, characters){ | |
if (!characters && nativeTrim) { | |
return nativeTrim.call(str); | |
} | |
characters = defaultToWhiteSpace(characters); | |
return str.replace(new RegExp('\^[' + characters + ']+|[' + characters + ']+$', 'g'), ''); | |
}; | |
// Functionality | |
$.fn.preload = function() { | |
this.each(function(){ | |
$('<img/>')[0].src = this; | |
}); | |
}; | |
// Used by util.js | |
var rtable = /^t(?:able|d|h)$/i, | |
rroot = /^(?:body|html)$/i; | |
$.fn.position = function() { | |
if ( !this[0] ) { | |
return null; | |
} | |
var elem = this[0], | |
// Get *real* offsetParent | |
offsetParent = this.offsetParent(), | |
// Get correct offsets | |
offset = this.offset(), | |
parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); | |
// Subtract element margins | |
// note: when an element has margin: auto the offsetLeft and marginLeft | |
// are the same in Safari causing offset.left to incorrectly be 0 | |
offset.top -= parseFloat( $(elem).css("margin-top") ) || 0; | |
offset.left -= parseFloat( $(elem).css("margin-left") ) || 0; | |
// Add offsetParent borders | |
parentOffset.top += parseFloat( $(offsetParent[0]).css("border-top-width") ) || 0; | |
parentOffset.left += parseFloat( $(offsetParent[0]).css("border-left-width") ) || 0; | |
// Subtract the two offsets | |
return { | |
top: offset.top - parentOffset.top, | |
left: offset.left - parentOffset.left | |
}; | |
}; | |
$.fn.offsetParent = function() { | |
var ret = $(); | |
this.each(function(){ | |
var offsetParent = this.offsetParent || document.body; | |
while ( offsetParent && (!rroot.test(offsetParent.nodeName) && $(offsetParent).css("position") === "static") ) { | |
offsetParent = offsetParent.offsetParent; | |
} | |
ret.push(offsetParent); | |
}); | |
return ret; | |
}; | |
// For dateinput | |
Event.prototype.isDefaultPrevented = function() { | |
return this.defaultPrevented; | |
}; | |
})(Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($, undefined){ | |
var prefix = '', eventPrefix, endEventName, endAnimationName, | |
vendors = {Webkit: 'webkit', Moz: '', O: 'o', ms: 'MS'}, | |
document = window.document, testEl = document.createElement('div'), | |
supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i; | |
cachedAnimation = {}; | |
function downcase(str) { return str.toLowerCase() } | |
function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : downcase(name) }; | |
$.each(vendors, function(vendor, event){ | |
if (testEl.style[vendor + 'TransitionProperty'] !== undefined) { | |
prefix = '-' + downcase(vendor) + '-'; | |
eventPrefix = event; | |
return false; | |
} | |
}); | |
$.fx = { | |
off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined), | |
cssPrefix: prefix, | |
transitionEnd: normalizeEvent('TransitionEnd'), | |
animationEnd: normalizeEvent('AnimationEnd') | |
}; | |
$.fn.animate = function(properties, duration, ease, callback){ | |
if ($.isObject(duration)) | |
ease = duration.easing, callback = duration.complete, duration = duration.duration; | |
if (duration) duration = duration / 1000; | |
return this.anim(properties, duration, ease, callback); | |
}; | |
$.fn.stop = function(){ | |
if (cachedAnimation.callback && cachedAnimation.endEvent) { | |
this.one(cachedAnimation.endEvent, cachedAnimation.callback); | |
} | |
cachedAnimation = {}; | |
return this; | |
} | |
$.fn.anim = function(properties, duration, ease, callback){ | |
var transforms, cssProperties = {}, key, that = this, wrappedCallback, endEvent = $.fx.transitionEnd; | |
if (duration === undefined) duration = 0.4; | |
if ($.fx.off) duration = 0; | |
if (typeof properties == 'string') { | |
// keyframe animation | |
cssProperties[prefix + 'animation-name'] = properties; | |
cssProperties[prefix + 'animation-duration'] = duration + 's'; | |
endEvent = $.fx.animationEnd; | |
} else { | |
// CSS transitions | |
for (key in properties) | |
if (supportedTransforms.test(key)) { | |
transforms || (transforms = []); | |
transforms.push(key + '(' + properties[key] + ')'); | |
} | |
else cssProperties[key] = properties[key]; | |
if (transforms) cssProperties[prefix + 'transform'] = transforms.join(' '); | |
if (!$.fx.off) cssProperties[prefix + 'transition'] = 'all ' + duration + 's ' + (ease || ''); | |
} | |
wrappedCallback = function(){ | |
var props = {}; | |
props[prefix + 'transition'] = props[prefix + 'animation-name'] = 'none'; | |
$(this).css(props); | |
callback && callback.call(this); | |
} | |
cachedAnimation.endEvent = endEvent; | |
cachedAnimation.callback = callback; | |
if (duration > 0) this.one(cachedAnimation.endEvent, cachedAnimation.callback); | |
setTimeout(function() { | |
that.css(cssProperties); | |
if (duration <= 0) setTimeout(function() { | |
that.each(function(){ wrappedCallback.call(this) }); | |
}, 0); | |
}, 0); | |
return this; | |
}; | |
testEl = null; | |
})(Zepto); | |
// Zepto.js | |
// (c) 2010, 2011 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($, undefined){ | |
var document = window.document, docElem = document.documentElement, | |
origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle, | |
speeds = { _default: 400, fast: 200, slow: 600 }; | |
function translateSpeed(speed) { | |
return typeof speed == 'number' ? speed : (speeds[speed] || speeds._default); | |
} | |
function anim(el, speed, opacity, scale, callback) { | |
if (typeof speed == 'function' && !callback) callback = speed, speed = undefined; | |
var props = { opacity: opacity }; | |
if (scale) { | |
if ($.fx.transforms3d) props.scale3d = scale + ',1'; | |
else props.scale = scale; | |
el.css($.fx.cssPrefix + 'transform-origin', '0 0'); | |
} | |
return el.anim(props, translateSpeed(speed) / 1000, null, callback); | |
} | |
function hide(el, speed, scale, callback) { | |
return anim(el, speed, 0, scale, function(){ | |
origHide.call($(this)); | |
callback && callback.call(this); | |
}); | |
} | |
$.fn.show = function(speed, callback) { | |
if (speed || speed === 0) { | |
origShow.call(this); | |
this.css('opacity', 0); | |
return anim(this, speed, 1, '1,1', callback); | |
} else { | |
origShow.call(this); | |
} | |
}; | |
$.fn.hide = function(speed, callback) { | |
if (speed || speed === 0) { | |
return hide(this, speed, '0,0', callback); | |
} else { | |
return origHide.call(this); | |
} | |
} | |
$.fn.toggle = function(speed, callback) { | |
if (speed === undefined || typeof speed == 'boolean') return origToggle.call(this, speed); | |
else return this[this.css('display') == 'none' ? 'show' : 'hide'](speed, callback); | |
}; | |
$.fn.fadeTo = function(speed, opacity, callback) { | |
return anim(this, speed, opacity, null, callback); | |
}; | |
$.fn.fadeIn = function(speed, callback) { | |
var target = this.css('opacity') | |
if (target > 0) this.css('opacity', 0) | |
else target = 1 | |
return origShow.call(this).fadeTo(speed, target, callback); | |
}; | |
$.fn.fadeOut = function(speed, callback) { | |
return hide(this, speed, null, callback); | |
}; | |
$.fn.fadeToggle = function(speed, callback) { | |
var hidden = this.css('opacity') == 0 || this.css('display') == 'none'; | |
return this[hidden ? 'fadeIn' : 'fadeOut'](speed, callback); | |
}; | |
$.extend($.fx, { | |
speeds: speeds, | |
// feature detection for 3D transforms adapted from Modernizr | |
transforms3d: (function(props){ | |
var ret = false; | |
$.each(props, function(i, prop){ | |
if (docElem.style[prop] !== undefined) { | |
ret = i != 1 || webkitTransforms3d(); | |
return false; | |
} | |
}); | |
return ret; | |
})('perspectiveProperty WebkitPerspective MozPerspective OPerspective msPerspective'.split(' ')) | |
}); | |
function webkitTransforms3d() { | |
var ret, div = document.createElement('div'), | |
testEl = document.createElement('div'), | |
css = '@media (-webkit-transform-3d){#zeptotest{left:9px;position:absolute}}', | |
style = ['­', '<style>', css, '</style>'].join(''); | |
div.innerHTML += style; | |
testEl.id = 'zeptotest'; | |
div.appendChild(testEl); | |
docElem.appendChild(div); | |
ret = testEl.offsetLeft === 9; | |
div.parentNode.removeChild(div); | |
return ret; | |
} | |
})(Zepto); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment