Created
March 18, 2012 04:01
-
-
Save pamelafox/2068749 to your computer and use it in GitHub Desktop.
Zepto + FancyBox
This file contains hidden or 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
/* | |
* FancyBox - jQuery Plugin | |
* Simple and fancy lightbox alternative | |
* | |
* Examples and documentation at: http://fancybox.net | |
* | |
* Copyright (c) 2008 - 2010 Janis Skarnelis | |
* That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. | |
* | |
* Version: 1.3.4 (11/11/2010) | |
* Requires: jQuery v1.3+ | |
* | |
* Dual licensed under the MIT and GPL licenses: | |
* http://www.opensource.org/licenses/mit-license.php | |
* http://www.gnu.org/licenses/gpl.html | |
*/ | |
;(function($) { | |
var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, | |
selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], | |
ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, | |
loadingTimer, loadingFrame = 1, | |
titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }), | |
isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, | |
/* | |
* Private methods | |
*/ | |
_abort = function() { | |
loading.hide(); | |
imgPreloader.onerror = imgPreloader.onload = null; | |
if (ajaxLoader) { | |
ajaxLoader.abort(); | |
} | |
tmp.empty(); | |
}, | |
_error = function() { | |
if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { | |
loading.hide(); | |
busy = false; | |
return; | |
} | |
selectedOpts.titleShow = false; | |
selectedOpts.width = 'auto'; | |
selectedOpts.height = 'auto'; | |
tmp.html( '<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>' ); | |
_process_inline(); | |
}, | |
_start = function() { | |
var obj = selectedArray[ selectedIndex ], | |
href, | |
type, | |
title, | |
str, | |
emb, | |
ret; | |
_abort(); | |
selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); | |
ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); | |
if (ret === false) { | |
busy = false; | |
return; | |
} else if (typeof ret == 'object') { | |
selectedOpts = $.extend(selectedOpts, ret); | |
} | |
title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; | |
if (obj.nodeName && !selectedOpts.orig) { | |
selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); | |
} | |
if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { | |
title = selectedOpts.orig.attr('alt'); | |
} | |
href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; | |
if ((/^(?:javascript)/i).test(href) || href == '#') { | |
href = null; | |
} | |
if (selectedOpts.type) { | |
type = selectedOpts.type; | |
if (!href) { | |
href = selectedOpts.content; | |
} | |
} else if (selectedOpts.content) { | |
type = 'html'; | |
} else if (href) { | |
if (href.match(imgRegExp)) { | |
type = 'image'; | |
} else if (href.match(swfRegExp)) { | |
type = 'swf'; | |
} else if ($(obj).hasClass("iframe")) { | |
type = 'iframe'; | |
} else if (href.indexOf("#") === 0) { | |
type = 'inline'; | |
} else { | |
type = 'ajax'; | |
} | |
} | |
if (!type) { | |
_error(); | |
return; | |
} | |
if (type == 'inline') { | |
obj = href.substr(href.indexOf("#")); | |
type = $(obj).length > 0 ? 'inline' : 'ajax'; | |
} | |
selectedOpts.type = type; | |
selectedOpts.href = href; | |
selectedOpts.title = title; | |
if (selectedOpts.autoDimensions) { | |
if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { | |
selectedOpts.width = 'auto'; | |
selectedOpts.height = 'auto'; | |
} else { | |
selectedOpts.autoDimensions = false; | |
} | |
} | |
if (selectedOpts.modal) { | |
selectedOpts.overlayShow = true; | |
selectedOpts.hideOnOverlayClick = false; | |
selectedOpts.hideOnContentClick = false; | |
selectedOpts.enableEscapeButton = false; | |
selectedOpts.showCloseButton = false; | |
} | |
selectedOpts.padding = parseInt(selectedOpts.padding, 10); | |
selectedOpts.margin = parseInt(selectedOpts.margin, 10); | |
tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); | |
$('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { | |
$(this).replaceWith(content.children()); | |
}); | |
switch (type) { | |
case 'html' : | |
tmp.html( selectedOpts.content ); | |
_process_inline(); | |
break; | |
case 'inline' : | |
if ( $(obj).parent().is('#fancybox-content') === true) { | |
busy = false; | |
return; | |
} | |
$('<div class="fancybox-inline-tmp" />') | |
.hide() | |
.insertBefore( $(obj) ) | |
.bind('fancybox-cleanup', function() { | |
$(this).replaceWith(content.children()); | |
}).bind('fancybox-cancel', function() { | |
$(this).replaceWith(tmp.children()); | |
}); | |
$(obj).appendTo(tmp); | |
_process_inline(); | |
break; | |
case 'image': | |
busy = false; | |
$.fancybox.showActivity(); | |
imgPreloader = new Image(); | |
imgPreloader.onerror = function() { | |
_error(); | |
}; | |
imgPreloader.onload = function() { | |
busy = true; | |
imgPreloader.onerror = imgPreloader.onload = null; | |
_process_image(); | |
}; | |
imgPreloader.src = href; | |
break; | |
case 'swf': | |
selectedOpts.scrolling = 'no'; | |
str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"><param name="movie" value="' + href + '"></param>'; | |
emb = ''; | |
$.each(selectedOpts.swf, function(name, val) { | |
str += '<param name="' + name + '" value="' + val + '"></param>'; | |
emb += ' ' + name + '="' + val + '"'; | |
}); | |
str += '<embed src="' + href + '" type="application/x-shockwave-flash" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"' + emb + '></embed></object>'; | |
tmp.html(str); | |
_process_inline(); | |
break; | |
case 'ajax': | |
busy = false; | |
$.fancybox.showActivity(); | |
selectedOpts.ajax.win = selectedOpts.ajax.success; | |
ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { | |
url : href, | |
data : selectedOpts.ajax.data || {}, | |
error : function(XMLHttpRequest, textStatus, errorThrown) { | |
if ( XMLHttpRequest.status > 0 ) { | |
_error(); | |
} | |
}, | |
success : function(data, textStatus, XMLHttpRequest) { | |
var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; | |
if (o.status == 200) { | |
if ( typeof selectedOpts.ajax.win == 'function' ) { | |
ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); | |
if (ret === false) { | |
loading.hide(); | |
return; | |
} else if (typeof ret == 'string' || typeof ret == 'object') { | |
data = ret; | |
} | |
} | |
tmp.html( data ); | |
_process_inline(); | |
} | |
} | |
})); | |
break; | |
case 'iframe': | |
_show(); | |
break; | |
} | |
}, | |
_process_inline = function() { | |
var | |
w = selectedOpts.width, | |
h = selectedOpts.height; | |
if (w.toString().indexOf('%') > -1) { | |
w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; | |
} else { | |
w = w == 'auto' ? 'auto' : w + 'px'; | |
} | |
if (h.toString().indexOf('%') > -1) { | |
h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; | |
} else { | |
h = h == 'auto' ? 'auto' : h + 'px'; | |
} | |
tmp.wrapInner('<div style="width:' + w + ';height:' + h + ';overflow: ' + (selectedOpts.scrolling == 'auto' ? 'auto' : (selectedOpts.scrolling == 'yes' ? 'scroll' : 'hidden')) + ';position:relative;"></div>'); | |
selectedOpts.width = tmp.width(); | |
selectedOpts.height = tmp.height(); | |
_show(); | |
}, | |
_process_image = function() { | |
selectedOpts.width = imgPreloader.width; | |
selectedOpts.height = imgPreloader.height; | |
$("<img />").attr({ | |
'id' : 'fancybox-img', | |
'src' : imgPreloader.src, | |
'alt' : selectedOpts.title | |
}).appendTo( tmp ); | |
_show(); | |
}, | |
_show = function() { | |
var pos, equal; | |
loading.hide(); | |
if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { | |
$.event.trigger('fancybox-cancel'); | |
busy = false; | |
return; | |
} | |
busy = true; | |
$(content.add( overlay )).unbind(); | |
$(window).unbind("resize.fb scroll.fb"); | |
$(document).unbind('keydown.fb'); | |
if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { | |
wrap.css('height', wrap.height()); | |
} | |
currentArray = selectedArray; | |
currentIndex = selectedIndex; | |
currentOpts = selectedOpts; | |
if (currentOpts.overlayShow) { | |
overlay.css({ | |
'background-color' : currentOpts.overlayColor, | |
'opacity' : currentOpts.overlayOpacity, | |
'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', | |
'height' : $(document).height() | |
}); | |
if (!overlay.is(':visible')) { | |
if (isIE6) { | |
$('select:not(#fancybox-tmp select)').filter(function() { | |
return this.style.visibility !== 'hidden'; | |
}).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { | |
this.style.visibility = 'inherit'; | |
}); | |
} | |
overlay.show(); | |
} | |
} else { | |
overlay.hide(); | |
} | |
final_pos = _get_zoom_to(); | |
_process_title(); | |
if (wrap.is(":visible")) { | |
$( close.add( nav_left ).add( nav_right ) ).hide(); | |
pos = wrap.position(), | |
start_pos = { | |
top : pos.top, | |
left : pos.left, | |
width : wrap.width(), | |
height : wrap.height() | |
}; | |
equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); | |
content.fadeTo(currentOpts.changeFade, 0.3, function() { | |
var finish_resizing = function() { | |
content.html( tmp.children() ).fadeTo(currentOpts.changeFade, 1, _finish); | |
}; | |
$.event.trigger('fancybox-change'); | |
content | |
.empty() | |
.removeAttr('filter') | |
.css({ | |
'border-width' : currentOpts.padding, | |
'width' : final_pos.width - currentOpts.padding * 2, | |
'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 | |
}); | |
if (equal) { | |
finish_resizing(); | |
} else { | |
fx.prop = 0; | |
$(fx).animate({prop: 1}, { | |
duration : currentOpts.changeSpeed, | |
easing : currentOpts.easingChange, | |
step : _draw, | |
complete : finish_resizing | |
}); | |
} | |
}); | |
return; | |
} | |
wrap.removeAttr("style"); | |
content.css('border-width', currentOpts.padding); | |
if (currentOpts.transitionIn == 'elastic') { | |
start_pos = _get_zoom_from(); | |
content.html( tmp.children() ); | |
wrap.show(); | |
if (currentOpts.opacity) { | |
final_pos.opacity = 0; | |
} | |
fx.prop = 0; | |
$(fx).animate({prop: 1}, { | |
duration : currentOpts.speedIn, | |
easing : currentOpts.easingIn, | |
step : _draw, | |
complete : _finish | |
}); | |
return; | |
} | |
if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { | |
title.show(); | |
} | |
content | |
.css({ | |
'width' : final_pos.width - currentOpts.padding * 2, | |
'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 | |
}) | |
.html( tmp.children() ); | |
wrap | |
.css(final_pos) | |
.fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); | |
}, | |
_format_title = function(title) { | |
if (title && title.length) { | |
if (currentOpts.titlePosition == 'float') { | |
return '<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">' + title + '</td><td id="fancybox-title-float-right"></td></tr></table>'; | |
} | |
return '<div id="fancybox-title-' + currentOpts.titlePosition + '">' + title + '</div>'; | |
} | |
return false; | |
}, | |
_process_title = function() { | |
titleStr = currentOpts.title || ''; | |
titleHeight = 0; | |
title | |
.empty() | |
.removeAttr('style') | |
.removeClass(); | |
if (currentOpts.titleShow === false) { | |
title.hide(); | |
return; | |
} | |
titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); | |
if (!titleStr || titleStr === '') { | |
title.hide(); | |
return; | |
} | |
title | |
.addClass('fancybox-title-' + currentOpts.titlePosition) | |
.html( titleStr ) | |
.appendTo( 'body' ) | |
.show(); | |
switch (currentOpts.titlePosition) { | |
case 'inside': | |
title | |
.css({ | |
'width' : final_pos.width - (currentOpts.padding * 2), | |
'marginLeft' : currentOpts.padding, | |
'marginRight' : currentOpts.padding | |
}); | |
titleHeight = title.outerHeight(true); | |
title.appendTo( outer ); | |
final_pos.height += titleHeight; | |
break; | |
case 'over': | |
title | |
.css({ | |
'marginLeft' : currentOpts.padding, | |
'width' : final_pos.width - (currentOpts.padding * 2), | |
'bottom' : currentOpts.padding | |
}) | |
.appendTo( outer ); | |
break; | |
case 'float': | |
title | |
.css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) | |
.appendTo( wrap ); | |
break; | |
default: | |
title | |
.css({ | |
'width' : final_pos.width - (currentOpts.padding * 2), | |
'paddingLeft' : currentOpts.padding, | |
'paddingRight' : currentOpts.padding | |
}) | |
.appendTo( wrap ); | |
break; | |
} | |
title.hide(); | |
}, | |
_set_navigation = function() { | |
if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { | |
$(document).bind('keydown.fb', function(e) { | |
if (e.keyCode == 27 && currentOpts.enableEscapeButton) { | |
e.preventDefault(); | |
$.fancybox.close(); | |
} else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { | |
e.preventDefault(); | |
$.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); | |
} | |
}); | |
} | |
if (!currentOpts.showNavArrows) { | |
nav_left.hide(); | |
nav_right.hide(); | |
return; | |
} | |
if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { | |
nav_left.show(); | |
} | |
if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { | |
nav_right.show(); | |
} | |
}, | |
_finish = function () { | |
if (!$.support.opacity) { | |
content.get(0).style.removeAttribute('filter'); | |
wrap.get(0).style.removeAttribute('filter'); | |
} | |
if (selectedOpts.autoDimensions) { | |
content.css('height', 'auto'); | |
} | |
wrap.css('height', 'auto'); | |
if (titleStr && titleStr.length) { | |
title.show(); | |
} | |
if (currentOpts.showCloseButton) { | |
close.show(); | |
} | |
_set_navigation(); | |
if (currentOpts.hideOnContentClick) { | |
content.bind('click', $.fancybox.close); | |
} | |
if (currentOpts.hideOnOverlayClick) { | |
overlay.bind('click', $.fancybox.close); | |
} | |
$(window).bind("resize.fb", $.fancybox.resize); | |
if (currentOpts.centerOnScroll) { | |
$(window).bind("scroll.fb", $.fancybox.center); | |
} | |
if (currentOpts.type == 'iframe') { | |
$('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content); | |
} | |
wrap.show(); | |
busy = false; | |
$.fancybox.center(); | |
currentOpts.onComplete(currentArray, currentIndex, currentOpts); | |
_preload_images(); | |
}, | |
_preload_images = function() { | |
var href, | |
objNext; | |
if ((currentArray.length -1) > currentIndex) { | |
href = currentArray[ currentIndex + 1 ].href; | |
if (typeof href !== 'undefined' && href.match(imgRegExp)) { | |
objNext = new Image(); | |
objNext.src = href; | |
} | |
} | |
if (currentIndex > 0) { | |
href = currentArray[ currentIndex - 1 ].href; | |
if (typeof href !== 'undefined' && href.match(imgRegExp)) { | |
objNext = new Image(); | |
objNext.src = href; | |
} | |
} | |
}, | |
_draw = function(pos) { | |
var dim = { | |
width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), | |
height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), | |
top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), | |
left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) | |
}; | |
if (typeof final_pos.opacity !== 'undefined') { | |
dim.opacity = pos < 0.5 ? 0.5 : pos; | |
} | |
wrap.css(dim); | |
content.css({ | |
'width' : dim.width - currentOpts.padding * 2, | |
'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 | |
}); | |
}, | |
_get_viewport = function() { | |
return [ | |
$(window).width() - (currentOpts.margin * 2), | |
$(window).height() - (currentOpts.margin * 2), | |
$(document).scrollLeft() + currentOpts.margin, | |
$(document).scrollTop() + currentOpts.margin | |
]; | |
}, | |
_get_zoom_to = function () { | |
var view = _get_viewport(), | |
to = {}, | |
resize = currentOpts.autoScale, | |
double_padding = currentOpts.padding * 2, | |
ratio; | |
if (currentOpts.width.toString().indexOf('%') > -1) { | |
to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); | |
} else { | |
to.width = currentOpts.width + double_padding; | |
} | |
if (currentOpts.height.toString().indexOf('%') > -1) { | |
to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); | |
} else { | |
to.height = currentOpts.height + double_padding; | |
} | |
if (resize && (to.width > view[0] || to.height > view[1])) { | |
if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { | |
ratio = (currentOpts.width ) / (currentOpts.height ); | |
if ((to.width ) > view[0]) { | |
to.width = view[0]; | |
to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); | |
} | |
if ((to.height) > view[1]) { | |
to.height = view[1]; | |
to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); | |
} | |
} else { | |
to.width = Math.min(to.width, view[0]); | |
to.height = Math.min(to.height, view[1]); | |
} | |
} | |
to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); | |
to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); | |
return to; | |
}, | |
_get_obj_pos = function(obj) { | |
var pos = obj.offset(); | |
pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; | |
pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; | |
pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; | |
pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; | |
pos.width = obj.width(); | |
pos.height = obj.height(); | |
return pos; | |
}, | |
_get_zoom_from = function() { | |
var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, | |
from = {}, | |
pos, | |
view; | |
if (orig && orig.length) { | |
pos = _get_obj_pos(orig); | |
from = { | |
width : pos.width + (currentOpts.padding * 2), | |
height : pos.height + (currentOpts.padding * 2), | |
top : pos.top - currentOpts.padding - 20, | |
left : pos.left - currentOpts.padding - 20 | |
}; | |
} else { | |
view = _get_viewport(); | |
from = { | |
width : currentOpts.padding * 2, | |
height : currentOpts.padding * 2, | |
top : parseInt(view[3] + view[1] * 0.5, 10), | |
left : parseInt(view[2] + view[0] * 0.5, 10) | |
}; | |
} | |
return from; | |
}, | |
_animate_loading = function() { | |
if (!loading.is(':visible')){ | |
clearInterval(loadingTimer); | |
return; | |
} | |
$('div', loading).css('top', (loadingFrame * -40) + 'px'); | |
loadingFrame = (loadingFrame + 1) % 12; | |
}; | |
/* | |
* Public methods | |
*/ | |
$.fn.fancybox = function(options) { | |
if (!$(this).length) { | |
return this; | |
} | |
$(this) | |
.data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) | |
.unbind('click.fb') | |
.bind('click.fb', function(e) { | |
e.preventDefault(); | |
if (busy) { | |
return; | |
} | |
busy = true; | |
$(this).blur(); | |
selectedArray = []; | |
selectedIndex = 0; | |
var rel = $(this).attr('rel') || ''; | |
if (!rel || rel == '' || rel === 'nofollow') { | |
selectedArray.push(this); | |
} else { | |
selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); | |
selectedIndex = selectedArray.index( this ); | |
} | |
_start(); | |
return; | |
}); | |
return this; | |
}; | |
$.fancybox = function(obj) { | |
var opts; | |
if (busy) { | |
return; | |
} | |
busy = true; | |
opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; | |
selectedArray = []; | |
selectedIndex = parseInt(opts.index, 10) || 0; | |
if ($.isArray(obj)) { | |
for (var i = 0, j = obj.length; i < j; i++) { | |
if (typeof obj[i] == 'object') { | |
$(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); | |
} else { | |
obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); | |
} | |
} | |
selectedArray = jQuery.merge(selectedArray, obj); | |
} else { | |
if (typeof obj == 'object') { | |
$(obj).data('fancybox', $.extend({}, opts, obj)); | |
} else { | |
obj = $({}).data('fancybox', $.extend({content : obj}, opts)); | |
} | |
selectedArray.push(obj); | |
} | |
if (selectedIndex > selectedArray.length || selectedIndex < 0) { | |
selectedIndex = 0; | |
} | |
_start(); | |
}; | |
$.fancybox.showActivity = function() { | |
clearInterval(loadingTimer); | |
loading.show(); | |
loadingTimer = setInterval(_animate_loading, 66); | |
}; | |
$.fancybox.hideActivity = function() { | |
loading.hide(); | |
}; | |
$.fancybox.next = function() { | |
return $.fancybox.pos( currentIndex + 1); | |
}; | |
$.fancybox.prev = function() { | |
return $.fancybox.pos( currentIndex - 1); | |
}; | |
$.fancybox.pos = function(pos) { | |
if (busy) { | |
return; | |
} | |
pos = parseInt(pos); | |
selectedArray = currentArray; | |
if (pos > -1 && pos < currentArray.length) { | |
selectedIndex = pos; | |
_start(); | |
} else if (currentOpts.cyclic && currentArray.length > 1) { | |
selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; | |
_start(); | |
} | |
return; | |
}; | |
$.fancybox.cancel = function() { | |
if (busy) { | |
return; | |
} | |
busy = true; | |
$.event.trigger('fancybox-cancel'); | |
_abort(); | |
selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); | |
busy = false; | |
}; | |
// Note: within an iframe use - parent.$.fancybox.close(); | |
$.fancybox.close = function() { | |
if (busy || wrap.is(':hidden')) { | |
return; | |
} | |
busy = true; | |
if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { | |
busy = false; | |
return; | |
} | |
_abort(); | |
$(close.add( nav_left ).add( nav_right )).hide(); | |
$(content.add( overlay )).unbind(); | |
$(window).unbind("resize.fb scroll.fb"); | |
$(document).unbind('keydown.fb'); | |
content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); | |
if (currentOpts.titlePosition !== 'inside') { | |
title.empty(); | |
} | |
wrap.stop(); | |
function _cleanup() { | |
overlay.fadeOut('fast'); | |
title.empty().hide(); | |
wrap.hide(); | |
$('#fancybox-overlay, #fancybox-inline-tmp').trigger('fancybox-cleanup'); | |
content.empty(); | |
currentOpts.onClosed(currentArray, currentIndex, currentOpts); | |
currentArray = selectedOpts = []; | |
currentIndex = selectedIndex = 0; | |
currentOpts = selectedOpts = {}; | |
busy = false; | |
} | |
if (currentOpts.transitionOut == 'elastic') { | |
start_pos = _get_zoom_from(); | |
var pos = wrap.position(); | |
final_pos = { | |
top : pos.top , | |
left : pos.left, | |
width : wrap.width(), | |
height : wrap.height() | |
}; | |
if (currentOpts.opacity) { | |
final_pos.opacity = 1; | |
} | |
title.empty().hide(); | |
fx.prop = 1; | |
$(fx).animate({ prop: 0 }, { | |
duration : currentOpts.speedOut, | |
easing : currentOpts.easingOut, | |
step : _draw, | |
complete : _cleanup | |
}); | |
} else { | |
wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); | |
} | |
}; | |
$.fancybox.resize = function() { | |
if (overlay.is(':visible')) { | |
overlay.css('height', $(document).height()); | |
} | |
$.fancybox.center(true); | |
}; | |
$.fancybox.center = function() { | |
var view, align; | |
if (busy) { | |
return; | |
} | |
align = arguments[0] === true ? 1 : 0; | |
view = _get_viewport(); | |
if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { | |
return; | |
} | |
wrap.stop() | |
.animate({ | |
'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), | |
'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) | |
}, typeof arguments[0] == 'number' ? arguments[0] : 200); | |
}; | |
$.fancybox.init = function() { | |
if ($("#fancybox-wrap").length) { | |
return; | |
} | |
$('body').append( | |
tmp = $('<div id="fancybox-tmp"></div>'), | |
loading = $('<div id="fancybox-loading"><div></div></div>'), | |
overlay = $('<div id="fancybox-overlay"></div>'), | |
wrap = $('<div id="fancybox-wrap"></div>') | |
); | |
outer = $('<div id="fancybox-outer"></div>') | |
.append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>') | |
.appendTo( wrap ); | |
outer.append( | |
content = $('<div id="fancybox-content"></div>'), | |
close = $('<a id="fancybox-close"></a>'), | |
title = $('<div id="fancybox-title"></div>'), | |
nav_left = $('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'), | |
nav_right = $('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>') | |
); | |
close.click($.fancybox.close); | |
loading.click($.fancybox.cancel); | |
nav_left.click(function(e) { | |
e.preventDefault(); | |
$.fancybox.prev(); | |
}); | |
nav_right.click(function(e) { | |
e.preventDefault(); | |
$.fancybox.next(); | |
}); | |
if ($.fn.mousewheel) { | |
wrap.bind('mousewheel.fb', function(e, delta) { | |
if (busy) { | |
e.preventDefault(); | |
} else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { | |
e.preventDefault(); | |
$.fancybox[ delta > 0 ? 'prev' : 'next'](); | |
} | |
}); | |
} | |
if (!$.support.opacity) { | |
wrap.addClass('fancybox-ie'); | |
} | |
if (isIE6) { | |
loading.addClass('fancybox-ie6'); | |
wrap.addClass('fancybox-ie6'); | |
$('<iframe id="fancybox-hide-sel-frame" src="' + (/^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank' ) + '" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(outer); | |
} | |
}; | |
$.fn.fancybox.defaults = { | |
padding : 10, | |
margin : 40, | |
opacity : false, | |
modal : false, | |
cyclic : false, | |
scrolling : 'auto', // 'auto', 'yes' or 'no' | |
width : 560, | |
height : 340, | |
autoScale : true, | |
autoDimensions : true, | |
centerOnScroll : false, | |
ajax : {}, | |
swf : { wmode: 'transparent' }, | |
hideOnOverlayClick : true, | |
hideOnContentClick : false, | |
overlayShow : true, | |
overlayOpacity : 0.7, | |
overlayColor : '#777', | |
titleShow : true, | |
titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' | |
titleFormat : null, | |
titleFromAlt : false, | |
transitionIn : 'fade', // 'elastic', 'fade' or 'none' | |
transitionOut : 'fade', // 'elastic', 'fade' or 'none' | |
speedIn : 300, | |
speedOut : 300, | |
changeSpeed : 300, | |
changeFade : 'fast', | |
easingIn : 'swing', | |
easingOut : 'swing', | |
showCloseButton : true, | |
showNavArrows : true, | |
enableEscapeButton : true, | |
enableKeyboardNav : true, | |
onStart : function(){}, | |
onCancel : function(){}, | |
onComplete : function(){}, | |
onCleanup : function(){}, | |
onClosed : function(){}, | |
onError : function(){} | |
}; | |
$(document).ready(function() { | |
$.fancybox.init(); | |
}); | |
})(window.jQuery || window.Zepto); |
This file contains hidden or 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) { | |
if (!fragmentRE.test(html)) return document.createTextNode(html); | |
name = 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.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($, 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; | |
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.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); | |
} | |
if (duration > 0) this.one(endEvent, wrappedCallback); | |
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($){ | |
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: '[email protected]' | |
// }, | |
// { | |
// 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) { | |
origShow.call(this); | |
if (speed === undefined) speed = 0; | |
else this.css('opacity', 0); | |
return anim(this, speed, 1, '1,1', callback); | |
}; | |
$.fn.hide = function(speed, callback) { | |
if (speed === undefined) return origHide.call(this); | |
else return hide(this, speed, '0,0', callback); | |
} | |
$.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