Windows NT DGPENSV2LPKMN 10.0 build 14393 (Windows Server 2016) AMD64
Apache/2.4.46 (Win64) OpenSSL/1.1.1h PHP/7.3.25
: 172.16.0.66 | : 172.16.0.254
Cant Read [ /etc/named.conf ]
7.3.25
SYSTEM
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
[ A ]
[ C ]
[ D ]
C: /
xampp7 /
htdocs /
dashboard /
javascripts /
[ HOME SHELL ]
Name
Size
Permission
Action
all.js
183.97
KB
-rw-rw-rw-
modernizr.js
50.16
KB
-rw-rw-rw-
Delete
Unzip
Zip
${this.title}
Close
Code Editor : all.js
/* * Foundation Responsive Library * http://foundation.zurb.com * Copyright 2013, ZURB * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ (function ($, window, document, undefined) { 'use strict'; // Used to retrieve Foundation media queries from CSS. if($('head').has('.foundation-mq-small').length === 0) { $('head').append('<meta class="foundation-mq-small">'); } if($('head').has('.foundation-mq-medium').length === 0) { $('head').append('<meta class="foundation-mq-medium">'); } if($('head').has('.foundation-mq-large').length === 0) { $('head').append('<meta class="foundation-mq-large">'); } if($('head').has('.foundation-mq-xlarge').length === 0) { $('head').append('<meta class="foundation-mq-xlarge">'); } if($('head').has('.foundation-mq-xxlarge').length === 0) { $('head').append('<meta class="foundation-mq-xxlarge">'); } // Embed FastClick (this should be removed later) function FastClick(layer){'use strict';var oldOnClick,self=this;this.trackingClick=false;this.trackingClickStart=0;this.targetElement=null;this.touchStartX=0;this.touchStartY=0;this.lastTouchIdentifier=0;this.touchBoundary=10;this.layer=layer;if(!layer||!layer.nodeType){throw new TypeError('Layer must be a document node');}this.onClick=function(){return FastClick.prototype.onClick.apply(self,arguments)};this.onMouse=function(){return FastClick.prototype.onMouse.apply(self,arguments)};this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(self,arguments)};this.onTouchMove=function(){return FastClick.prototype.onTouchMove.apply(self,arguments)};this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(self,arguments)};this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(self,arguments)};if(FastClick.notNeeded(layer)){return}if(this.deviceIsAndroid){layer.addEventListener('mouseover',this.onMouse,true);layer.addEventListener('mousedown',this.onMouse,true);layer.addEventListener('mouseup',this.onMouse,true)}layer.addEventListener('click',this.onClick,true);layer.addEventListener('touchstart',this.onTouchStart,false);layer.addEventListener('touchmove',this.onTouchMove,false);layer.addEventListener('touchend',this.onTouchEnd,false);layer.addEventListener('touchcancel',this.onTouchCancel,false);if(!Event.prototype.stopImmediatePropagation){layer.removeEventListener=function(type,callback,capture){var rmv=Node.prototype.removeEventListener;if(type==='click'){rmv.call(layer,type,callback.hijacked||callback,capture)}else{rmv.call(layer,type,callback,capture)}};layer.addEventListener=function(type,callback,capture){var adv=Node.prototype.addEventListener;if(type==='click'){adv.call(layer,type,callback.hijacked||(callback.hijacked=function(event){if(!event.propagationStopped){callback(event)}}),capture)}else{adv.call(layer,type,callback,capture)}}}if(typeof layer.onclick==='function'){oldOnClick=layer.onclick;layer.addEventListener('click',function(event){oldOnClick(event)},false);layer.onclick=null}}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf('Android')>0;FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent);FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&(/OS 4_\d(_\d)?/).test(navigator.userAgent);FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&(/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);FastClick.prototype.needsClick=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'button':case'select':case'textarea':if(target.disabled){return true}break;case'input':if((this.deviceIsIOS&&target.type==='file')||target.disabled){return true}break;case'label':case'video':return true}return(/\bneedsclick\b/).test(target.className)};FastClick.prototype.needsFocus=function(target){'use strict';switch(target.nodeName.toLowerCase()){case'textarea':case'select':return true;case'input':switch(target.type){case'button':case'checkbox':case'file':case'image':case'radio':case'submit':return false}return!target.disabled&&!target.readOnly;default:return(/\bneedsfocus\b/).test(target.className)}};FastClick.prototype.sendClick=function(targetElement,event){'use strict';var clickEvent,touch;if(document.activeElement&&document.activeElement!==targetElement){document.activeElement.blur()}touch=event.changedTouches[0];clickEvent=document.createEvent('MouseEvents');clickEvent.initMouseEvent('click',true,true,window,1,touch.screenX,touch.screenY,touch.clientX,touch.clientY,false,false,false,false,0,null);clickEvent.forwardedTouchEvent=true;targetElement.dispatchEvent(clickEvent)};FastClick.prototype.focus=function(targetElement){'use strict';var length;if(this.deviceIsIOS&&targetElement.setSelectionRange){length=targetElement.value.length;targetElement.setSelectionRange(length,length)}else{targetElement.focus()}};FastClick.prototype.updateScrollParent=function(targetElement){'use strict';var scrollParent,parentElement;scrollParent=targetElement.fastClickScrollParent;if(!scrollParent||!scrollParent.contains(targetElement)){parentElement=targetElement;do{if(parentElement.scrollHeight>parentElement.offsetHeight){scrollParent=parentElement;targetElement.fastClickScrollParent=parentElement;break}parentElement=parentElement.parentElement}while(parentElement)}if(scrollParent){scrollParent.fastClickLastScrollTop=scrollParent.scrollTop}};FastClick.prototype.getTargetElementFromEventTarget=function(eventTarget){'use strict';if(eventTarget.nodeType===Node.TEXT_NODE){return eventTarget.parentNode}return eventTarget};FastClick.prototype.onTouchStart=function(event){'use strict';var targetElement,touch,selection;if(event.targetTouches.length>1){return true}targetElement=this.getTargetElementFromEventTarget(event.target);touch=event.targetTouches[0];if(this.deviceIsIOS){selection=window.getSelection();if(selection.rangeCount&&!selection.isCollapsed){return true}if(!this.deviceIsIOS4){if(touch.identifier===this.lastTouchIdentifier){event.preventDefault();return false}this.lastTouchIdentifier=touch.identifier;this.updateScrollParent(targetElement)}}this.trackingClick=true;this.trackingClickStart=event.timeStamp;this.targetElement=targetElement;this.touchStartX=touch.pageX;this.touchStartY=touch.pageY;if((event.timeStamp-this.lastClickTime)<200){event.preventDefault()}return true};FastClick.prototype.touchHasMoved=function(event){'use strict';var touch=event.changedTouches[0],boundary=this.touchBoundary;if(Math.abs(touch.pageX-this.touchStartX)>boundary||Math.abs(touch.pageY-this.touchStartY)>boundary){return true}return false};FastClick.prototype.onTouchMove=function(event){'use strict';if(!this.trackingClick){return true}if(this.targetElement!==this.getTargetElementFromEventTarget(event.target)||this.touchHasMoved(event)){this.trackingClick=false;this.targetElement=null}return true};FastClick.prototype.findControl=function(labelElement){'use strict';if(labelElement.control!==undefined){return labelElement.control}if(labelElement.htmlFor){return document.getElementById(labelElement.htmlFor)}return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea')};FastClick.prototype.onTouchEnd=function(event){'use strict';var forElement,trackingClickStart,targetTagName,scrollParent,touch,targetElement=this.targetElement;if(!this.trackingClick){return true}if((event.timeStamp-this.lastClickTime)<200){this.cancelNextClick=true;return true}this.lastClickTime=event.timeStamp;trackingClickStart=this.trackingClickStart;this.trackingClick=false;this.trackingClickStart=0;if(this.deviceIsIOSWithBadTarget){touch=event.changedTouches[0];targetElement=document.elementFromPoint(touch.pageX-window.pageXOffset,touch.pageY-window.pageYOffset)||targetElement;targetElement.fastClickScrollParent=this.targetElement.fastClickScrollParent}targetTagName=targetElement.tagName.toLowerCase();if(targetTagName==='label'){forElement=this.findControl(targetElement);if(forElement){this.focus(targetElement);if(this.deviceIsAndroid){return false}targetElement=forElement}}else if(this.needsFocus(targetElement)){if((event.timeStamp-trackingClickStart)>100||(this.deviceIsIOS&&window.top!==window&&targetTagName==='input')){this.targetElement=null;return false}this.focus(targetElement);if(!this.deviceIsIOS4||targetTagName!=='select'){this.targetElement=null;event.preventDefault()}return false}if(this.deviceIsIOS&&!this.deviceIsIOS4){scrollParent=targetElement.fastClickScrollParent;if(scrollParent&&scrollParent.fastClickLastScrollTop!==scrollParent.scrollTop){return true}}if(!this.needsClick(targetElement)){event.preventDefault();this.sendClick(targetElement,event)}return false};FastClick.prototype.onTouchCancel=function(){'use strict';this.trackingClick=false;this.targetElement=null};FastClick.prototype.onMouse=function(event){'use strict';if(!this.targetElement){return true}if(event.forwardedTouchEvent){return true}if(!event.cancelable){return true}if(!this.needsClick(this.targetElement)||this.cancelNextClick){if(event.stopImmediatePropagation){event.stopImmediatePropagation()}else{event.propagationStopped=true}event.stopPropagation();event.preventDefault();return false}return true};FastClick.prototype.onClick=function(event){'use strict';var permitted;if(this.trackingClick){this.targetElement=null;this.trackingClick=false;return true}if(event.target.type==='submit'&&event.detail===0){return true}permitted=this.onMouse(event);if(!permitted){this.targetElement=null}return permitted};FastClick.prototype.destroy=function(){'use strict';var layer=this.layer;if(this.deviceIsAndroid){layer.removeEventListener('mouseover',this.onMouse,true);layer.removeEventListener('mousedown',this.onMouse,true);layer.removeEventListener('mouseup',this.onMouse,true)}layer.removeEventListener('click',this.onClick,true);layer.removeEventListener('touchstart',this.onTouchStart,false);layer.removeEventListener('touchmove',this.onTouchMove,false);layer.removeEventListener('touchend',this.onTouchEnd,false);layer.removeEventListener('touchcancel',this.onTouchCancel,false)};FastClick.notNeeded=function(layer){'use strict';var metaViewport;if(typeof window.ontouchstart==='undefined'){return true}if((/Chrome\/[0-9]+/).test(navigator.userAgent)){if(FastClick.prototype.deviceIsAndroid){metaViewport=document.querySelector('meta[name=viewport]');if(metaViewport&&metaViewport.content.indexOf('user-scalable=no')!==-1){return true}}else{return true}}if(layer.style.msTouchAction==='none'){return true}return false};FastClick.attach=function(layer){'use strict';return new FastClick(layer)};if(typeof define!=='undefined'&&define.amd){define(function(){'use strict';return FastClick})}else if(typeof module!=='undefined'&&module.exports){module.exports=FastClick.attach;module.exports.FastClick=FastClick}else{window.FastClick=FastClick} // Enable FastClick if(typeof FastClick !== 'undefined') { FastClick.attach(document.body); } // private Fast Selector wrapper, // returns jQuery object. Only use where // getElementById is not available. var S = function (selector, context) { if (typeof selector === 'string') { if (context) { return $(context.querySelectorAll(selector)); } return $(document.querySelectorAll(selector)); } return $(selector, context); }; /* https://github.com/paulirish/matchMedia.js */ window.matchMedia = window.matchMedia || (function( doc, undefined ) { "use strict"; var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, // fakeBody required for <FF4 when executed in <head> fakeBody = doc.createElement( "body" ), div = doc.createElement( "div" ); div.id = "mq-test-1"; div.style.cssText = "position:absolute;top:-100em"; fakeBody.style.background = "none"; fakeBody.appendChild(div); return function(q){ div.innerHTML = "­<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>"; docElem.insertBefore( fakeBody, refNode ); bool = div.offsetWidth === 42; docElem.removeChild( fakeBody ); return { matches: bool, media: q }; }; }( document )); /* * jquery.requestAnimationFrame * https://github.com/gnarf37/jquery-requestAnimationFrame * Requires jQuery 1.8+ * * Copyright (c) 2012 Corey Frang * Licensed under the MIT license. */ (function( $ ) { // requestAnimationFrame polyfill adapted from Erik Möller // fixes from Paul Irish and Tino Zijdel // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating var animating, lastTime = 0, vendors = ['webkit', 'moz'], requestAnimationFrame = window.requestAnimationFrame, cancelAnimationFrame = window.cancelAnimationFrame; for(; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { requestAnimationFrame = window[ vendors[lastTime] + "RequestAnimationFrame" ]; cancelAnimationFrame = cancelAnimationFrame || window[ vendors[lastTime] + "CancelAnimationFrame" ] || window[ vendors[lastTime] + "CancelRequestAnimationFrame" ]; } function raf() { if ( animating ) { requestAnimationFrame( raf ); jQuery.fx.tick(); } } if ( requestAnimationFrame ) { // use rAF window.requestAnimationFrame = requestAnimationFrame; window.cancelAnimationFrame = cancelAnimationFrame; jQuery.fx.timer = function( timer ) { if ( timer() && jQuery.timers.push( timer ) && !animating ) { animating = true; raf(); } }; jQuery.fx.stop = function() { animating = false; }; } else { // polyfill window.requestAnimationFrame = function( callback, element ) { var currTime = new Date().getTime(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ), id = window.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall ); lastTime = currTime + timeToCall; return id; }; window.cancelAnimationFrame = function(id) { clearTimeout(id); }; } }( jQuery )); function removeQuotes (string) { if (typeof string === 'string' || string instanceof String) { string = string.replace(/^[\\/'"]+|(;\s?})+|[\\/'"]+$/g, ''); } return string; } window.Foundation = { name : 'Foundation', version : '5.0.0', media_queries : { small : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), medium : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), large : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), xlarge: S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), xxlarge: S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') }, stylesheet : $('<style></style>').appendTo('head')[0].sheet, init : function (scope, libraries, method, options, response) { var library_arr, args = [scope, method, options, response], responses = []; // check RTL this.rtl = /rtl/i.test(S('html').attr('dir')); // set foundation global scope this.scope = scope || this.scope; if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { if (this.libs.hasOwnProperty(libraries)) { responses.push(this.init_lib(libraries, args)); } } else { for (var lib in this.libs) { responses.push(this.init_lib(lib, libraries)); } } return scope; }, init_lib : function (lib, args) { if (this.libs.hasOwnProperty(lib)) { this.patch(this.libs[lib]); if (args && args.hasOwnProperty(lib)) { return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); } return this.libs[lib].init.apply(this.libs[lib], args); } return function () {}; }, patch : function (lib) { lib.scope = this.scope; lib['data_options'] = this.lib_methods.data_options; lib['bindings'] = this.lib_methods.bindings; lib['S'] = S; lib.rtl = this.rtl; }, inherit : function (scope, methods) { var methods_arr = methods.split(' '); for (var i = methods_arr.length - 1; i >= 0; i--) { if (this.lib_methods.hasOwnProperty(methods_arr[i])) { this.libs[scope.name][methods_arr[i]] = this.lib_methods[methods_arr[i]]; } } }, random_str : function (length) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); if (!length) { length = Math.floor(Math.random() * chars.length); } var str = ''; for (var i = 0; i < length; i++) { str += chars[Math.floor(Math.random() * chars.length)]; } return str; }, libs : {}, // methods that can be inherited in libraries lib_methods : { throttle : function(fun, delay) { var timer = null; return function () { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function () { fun.apply(context, args); }, delay); }; }, // parses data-options attribute data_options : function (el) { var opts = {}, ii, p, opts_arr, opts_len, data_options = el.data('options'); if (typeof data_options === 'object') { return data_options; } opts_arr = (data_options || ':').split(';'), opts_len = opts_arr.length; function isNumber (o) { return ! isNaN (o-0) && o !== null && o !== "" && o !== false && o !== true; } function trim(str) { if (typeof str === 'string') return $.trim(str); return str; } // parse options for (ii = opts_len - 1; ii >= 0; ii--) { p = opts_arr[ii].split(':'); if (/true/i.test(p[1])) p[1] = true; if (/false/i.test(p[1])) p[1] = false; if (isNumber(p[1])) p[1] = parseInt(p[1], 10); if (p.length === 2 && p[0].length > 0) { opts[trim(p[0])] = trim(p[1]); } } return opts; }, delay : function (fun, delay) { return setTimeout(fun, delay); }, // test for empty object or array empty : function (obj) { if (obj.length && obj.length > 0) return false; if (obj.length && obj.length === 0) return true; for (var key in obj) { if (hasOwnProperty.call(obj, key)) return false; } return true; }, register_media : function(media, media_class) { if(Foundation.media_queries[media] === undefined) { $('head').append('<meta class="' + media_class + '">'); Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); } }, addCustomRule : function(rule, media) { if(media === undefined) { Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); } else { var query = Foundation.media_queries[media]; if(query !== undefined) { Foundation.stylesheet.insertRule('@media ' + Foundation.media_queries[media] + '{ ' + rule + ' }'); } } }, loaded : function (image, callback) { function loaded () { callback(image[0]); } function bindLoad () { this.one('load', loaded); if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { var src = this.attr( 'src' ), param = src.match( /\?/ ) ? '&' : '?'; param += 'random=' + (new Date()).getTime(); this.attr('src', src + param); } } if (!image.attr('src')) { loaded(); return; } if (image[0].complete || image[0].readyState === 4) { loaded(); } else { bindLoad.call(image); } }, bindings : function (method, options) { var self = this, should_bind_events = !S(this).data(this.name + '-init'); if (typeof method === 'string') { return this[method].call(this); } if (S(this.scope).is('[data-' + this.name +']')) { S(this.scope).data(this.name + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope)))); if (should_bind_events) { this.events(this.scope); } } else { S('[data-' + this.name + ']', this.scope).each(function () { var should_bind_events = !S(this).data(self.name + '-init'); S(this).data(self.name + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this)))); if (should_bind_events) { self.events(this); } }); } } } }; $.fn.foundation = function () { var args = Array.prototype.slice.call(arguments, 0); return this.each(function () { Foundation.init.apply(Foundation, [this].concat(args)); return this; }); }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.abide = { name : 'abide', version : '5.0.0', settings : { focus_on_invalid : true, timeout : 1000, patterns : { alpha: /[a-zA-Z]+/, alpha_numeric : /[a-zA-Z0-9]+/, integer: /-?\d+/, number: /-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?/, // generic password: upper-case, lower-case, number/special character, and min 8 characters password : /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, // amex, visa, diners card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, cvv : /^([0-9]){3,4}$/, // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, url: /(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?/, // abc.de domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/, datetime: /([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))/, // YYYY-MM-DD date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))/, // HH:MM:SS time : /(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}/, dateISO: /\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/, // MM/DD/YYYY month_day_year : /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/, // #FFF or #FFFFFF color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ } }, timer : null, init : function (scope, method, options) { this.bindings(method, options); }, events : function (scope) { var self = this, form = $(scope).attr('novalidate', 'novalidate'), settings = form.data('abide-init'); form .off('.abide') .on('submit.fndtn.abide validate.fndtn.abide', function (e) { var is_ajax = /ajax/i.test($(this).attr('data-abide')); return self.validate($(this).find('input, textarea, select').get(), e, is_ajax); }) .find('input, textarea, select') .off('.abide') .on('blur.fndtn.abide change.fndtn.abide', function (e) { self.validate([this], e); }) .on('keydown.fndtn.abide', function (e) { var settings = $(this).closest('form').data('abide-init'); clearTimeout(self.timer); self.timer = setTimeout(function () { self.validate([this], e); }.bind(this), settings.timeout); }); }, validate : function (els, e, is_ajax) { var validations = this.parse_patterns(els), validation_count = validations.length, form = $(els[0]).closest('form'), submit_event = /submit/.test(e.type); for (var i=0; i < validation_count; i++) { if (!validations[i] && (submit_event || is_ajax)) { if (this.settings.focus_on_invalid) els[i].focus(); form.trigger('invalid'); $(els[i]).closest('form').attr('data-invalid', ''); return false; } } if (submit_event || is_ajax) { form.trigger('valid'); } form.removeAttr('data-invalid'); if (is_ajax) return false; return true; }, parse_patterns : function (els) { var count = els.length, el_patterns = []; for (var i = count - 1; i >= 0; i--) { el_patterns.push(this.pattern(els[i])); } return this.check_validation_and_apply_styles(el_patterns); }, pattern : function (el) { var type = el.getAttribute('type'), required = typeof el.getAttribute('required') === 'string'; if (this.settings.patterns.hasOwnProperty(type)) { return [el, this.settings.patterns[type], required]; } var pattern = el.getAttribute('pattern') || ''; if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { return [el, this.settings.patterns[pattern], required]; } else if (pattern.length > 0) { return [el, new RegExp(pattern), required]; } pattern = /.*/; return [el, pattern, required]; }, check_validation_and_apply_styles : function (el_patterns) { var count = el_patterns.length, validations = []; for (var i = count - 1; i >= 0; i--) { var el = el_patterns[i][0], required = el_patterns[i][2], value = el.value, is_equal = el.getAttribute('data-equalto'), is_radio = el.type === "radio", valid_length = (required) ? (el.value.length > 0) : true; if (is_radio && required) { validations.push(this.valid_radio(el, required)); } else if (is_equal && required) { validations.push(this.valid_equal(el, required)); } else { if (el_patterns[i][1].test(value) && valid_length || !required && el.value.length < 1) { $(el).removeAttr('data-invalid').parent().removeClass('error'); validations.push(true); } else { $(el).attr('data-invalid', '').parent().addClass('error'); validations.push(false); } } } return validations; }, valid_radio : function (el, required) { var name = el.getAttribute('name'), group = document.getElementsByName(name), count = group.length, valid = false; for (var i=0; i < count; i++) { if (group[i].checked) valid = true; } for (var i=0; i < count; i++) { if (valid) { $(group[i]).removeAttr('data-invalid').parent().removeClass('error'); } else { $(group[i]).attr('data-invalid', '').parent().addClass('error'); } } return valid; }, valid_equal: function(el, required) { var from = document.getElementById(el.getAttribute('data-equalto')).value, to = el.value, valid = (from === to); if (valid) { $(el).removeAttr('data-invalid').parent().removeClass('error'); } else { $(el).attr('data-invalid', '').parent().addClass('error'); } return valid; } }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.accordion = { name : 'accordion', version : '5.0.1', settings : { active_class: 'active', toggleable: true }, init : function (scope, method, options) { this.bindings(method, options); }, events : function () { $(this.scope).off('.accordion').on('click.fndtn.accordion', '[data-accordion] > dd > a', function (e) { var accordion = $(this).parent(), target = $('#' + this.href.split('#')[1]), siblings = $('> dd > .content', target.closest('[data-accordion]')), settings = accordion.parent().data('accordion-init'), active = $('> dd > .content.' + settings.active_class, accordion.parent()); e.preventDefault(); if (active[0] == target[0] && settings.toggleable) { return target.toggleClass(settings.active_class); } siblings.removeClass(settings.active_class); target.addClass(settings.active_class); }); }, off : function () {}, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.alert = { name : 'alert', version : '5.0.0', settings : { animation: 'fadeOut', speed: 300, // fade out speed callback: function (){} }, init : function (scope, method, options) { this.bindings(method, options); }, events : function () { $(this.scope).off('.alert').on('click.fndtn.alert', '[data-alert] a.close', function (e) { var alertBox = $(this).closest("[data-alert]"), settings = alertBox.data('alert-init'); e.preventDefault(); alertBox[settings.animation](settings.speed, function () { $(this).trigger('closed').remove(); settings.callback(); }); }); }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.clearing = { name : 'clearing', version: '5.0.0', settings : { templates : { viewing : '<a href="#" class="clearing-close">×</a>' + '<div class="visible-img" style="display: none"><img src="//:0">' + '<p class="clearing-caption"></p><a href="#" class="clearing-main-prev"><span></span></a>' + '<a href="#" class="clearing-main-next"><span></span></a></div>' }, // comma delimited list of selectors that, on click, will close clearing, // add 'div.clearing-blackout, div.visible-img' to close on background click close_selectors : '.clearing-close', // event initializers and locks init : false, locked : false }, init : function (scope, method, options) { var self = this; Foundation.inherit(this, 'throttle loaded'); this.bindings(method, options); if ($(this.scope).is('[data-clearing]')) { this.assemble($('li', this.scope)); } else { $('[data-clearing]', this.scope).each(function () { self.assemble($('li', this)); }); } }, events : function (scope) { var self = this; $(this.scope) .off('.clearing') .on('click.fndtn.clearing', 'ul[data-clearing] li', function (e, current, target) { var current = current || $(this), target = target || current, next = current.next('li'), settings = current.closest('[data-clearing]').data('clearing-init'), image = $(e.target); e.preventDefault(); if (!settings) { self.init(); settings = current.closest('[data-clearing]').data('clearing-init'); } // if clearing is open and the current image is // clicked, go to the next image in sequence if (target.hasClass('visible') && current[0] === target[0] && next.length > 0 && self.is_open(current)) { target = next; image = $('img', target); } // set current and target to the clicked li if not otherwise defined. self.open(image, current, target); self.update_paddles(target); }) .on('click.fndtn.clearing', '.clearing-main-next', function (e) { self.nav(e, 'next') }) .on('click.fndtn.clearing', '.clearing-main-prev', function (e) { self.nav(e, 'prev') }) .on('click.fndtn.clearing', this.settings.close_selectors, function (e) { Foundation.libs.clearing.close(e, this) }) .on('keydown.fndtn.clearing', function (e) { self.keydown(e) }); $(window).off('.clearing').on('resize.fndtn.clearing', function () { self.resize() }); this.swipe_events(scope); }, swipe_events : function (scope) { var self = this; $(this.scope) .on('touchstart.fndtn.clearing', '.visible-img', function(e) { if (!e.touches) { e = e.originalEvent; } var data = { start_page_x: e.touches[0].pageX, start_page_y: e.touches[0].pageY, start_time: (new Date()).getTime(), delta_x: 0, is_scrolling: undefined }; $(this).data('swipe-transition', data); e.stopPropagation(); }) .on('touchmove.fndtn.clearing', '.visible-img', function(e) { if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if(e.touches.length > 1 || e.scale && e.scale !== 1) return; var data = $(this).data('swipe-transition'); if (typeof data === 'undefined') { data = {}; } data.delta_x = e.touches[0].pageX - data.start_page_x; if ( typeof data.is_scrolling === 'undefined') { data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); } if (!data.is_scrolling && !data.active) { e.preventDefault(); var direction = (data.delta_x < 0) ? 'next' : 'prev'; data.active = true; self.nav(e, direction); } }) .on('touchend.fndtn.clearing', '.visible-img', function(e) { $(this).data('swipe-transition', {}); e.stopPropagation(); }); }, assemble : function ($li) { var $el = $li.parent(); if ($el.parent().hasClass('carousel')) return; $el.after('<div id="foundationClearingHolder"></div>'); var holder = $('#foundationClearingHolder'), settings = $el.data('clearing-init'), grid = $el.detach(), data = { grid: '<div class="carousel">' + grid[0].outerHTML + '</div>', viewing: settings.templates.viewing }, wrapper = '<div class="clearing-assembled"><div>' + data.viewing + data.grid + '</div></div>'; return holder.after(wrapper).remove(); }, open : function ($image, current, target) { var root = target.closest('.clearing-assembled'), container = $('div', root).first(), visible_image = $('.visible-img', container), image = $('img', visible_image).not($image); if (!this.locked()) { // set the image to the selected thumbnail image .attr('src', this.load($image)) .css('visibility', 'hidden'); this.loaded(image, function () { image.css('visibility', 'visible'); // toggle the gallery root.addClass('clearing-blackout'); container.addClass('clearing-container'); visible_image.show(); this.fix_height(target) .caption($('.clearing-caption', visible_image), $image) .center(image) .shift(current, target, function () { target.siblings().removeClass('visible'); target.addClass('visible'); }); }.bind(this)); } }, close : function (e, el) { e.preventDefault(); var root = (function (target) { if (/blackout/.test(target.selector)) { return target; } else { return target.closest('.clearing-blackout'); } }($(el))), container, visible_image; if (el === e.target && root) { container = $('div', root).first(); visible_image = $('.visible-img', container); this.settings.prev_index = 0; $('ul[data-clearing]', root) .attr('style', '').closest('.clearing-blackout') .removeClass('clearing-blackout'); container.removeClass('clearing-container'); visible_image.hide(); } return false; }, is_open : function (current) { return current.parent().prop('style').length > 0; }, keydown : function (e) { var clearing = $('ul[data-clearing]', '.clearing-blackout'); if (e.which === 39) this.go(clearing, 'next'); if (e.which === 37) this.go(clearing, 'prev'); if (e.which === 27) $('a.clearing-close').trigger('click'); }, nav : function (e, direction) { var clearing = $('ul[data-clearing]', '.clearing-blackout'); e.preventDefault(); this.go(clearing, direction); }, resize : function () { var image = $('img', '.clearing-blackout .visible-img'); if (image.length) { this.center(image); } }, // visual adjustments fix_height : function (target) { var lis = target.parent().children(), self = this; lis.each(function () { var li = $(this), image = li.find('img'); if (li.height() > image.outerHeight()) { li.addClass('fix-height'); } }) .closest('ul') .width(lis.length * 100 + '%'); return this; }, update_paddles : function (target) { var visible_image = target .closest('.carousel') .siblings('.visible-img'); if (target.next().length > 0) { $('.clearing-main-next', visible_image) .removeClass('disabled'); } else { $('.clearing-main-next', visible_image) .addClass('disabled'); } if (target.prev().length > 0) { $('.clearing-main-prev', visible_image) .removeClass('disabled'); } else { $('.clearing-main-prev', visible_image) .addClass('disabled'); } }, center : function (target) { if (!this.rtl) { target.css({ marginLeft : -(target.outerWidth() / 2), marginTop : -(target.outerHeight() / 2) }); } else { target.css({ marginRight : -(target.outerWidth() / 2), marginTop : -(target.outerHeight() / 2) }); } return this; }, // image loading and preloading load : function ($image) { if ($image[0].nodeName === "A") { var href = $image.attr('href'); } else { var href = $image.parent().attr('href'); } this.preload($image); if (href) return href; return $image.attr('src'); }, preload : function ($image) { this .img($image.closest('li').next()) .img($image.closest('li').prev()); }, img : function (img) { if (img.length) { var new_img = new Image(), new_a = $('a', img); if (new_a.length) { new_img.src = new_a.attr('href'); } else { new_img.src = $('img', img).attr('src'); } } return this; }, // image caption caption : function (container, $image) { var caption = $image.data('caption'); if (caption) { container .html(caption) .show(); } else { container .text('') .hide(); } return this; }, // directional methods go : function ($ul, direction) { var current = $('.visible', $ul), target = current[direction](); if (target.length) { $('img', target) .trigger('click', [current, target]); } }, shift : function (current, target, callback) { var clearing = target.parent(), old_index = this.settings.prev_index || target.index(), direction = this.direction(clearing, current, target), left = parseInt(clearing.css('left'), 10), width = target.outerWidth(), skip_shift; // we use jQuery animate instead of CSS transitions because we // need a callback to unlock the next animation if (target.index() !== old_index && !/skip/.test(direction)){ if (/left/.test(direction)) { this.lock(); clearing.animate({left : left + width}, 300, this.unlock()); } else if (/right/.test(direction)) { this.lock(); clearing.animate({left : left - width}, 300, this.unlock()); } } else if (/skip/.test(direction)) { // the target image is not adjacent to the current image, so // do we scroll right or not skip_shift = target.index() - this.settings.up_count; this.lock(); if (skip_shift > 0) { clearing.animate({left : -(skip_shift * width)}, 300, this.unlock()); } else { clearing.animate({left : 0}, 300, this.unlock()); } } callback(); }, direction : function ($el, current, target) { var lis = $('li', $el), li_width = lis.outerWidth() + (lis.outerWidth() / 4), up_count = Math.floor($('.clearing-container').outerWidth() / li_width) - 1, target_index = lis.index(target), response; this.settings.up_count = up_count; if (this.adjacent(this.settings.prev_index, target_index)) { if ((target_index > up_count) && target_index > this.settings.prev_index) { response = 'right'; } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) { response = 'left'; } else { response = false; } } else { response = 'skip'; } this.settings.prev_index = target_index; return response; }, adjacent : function (current_index, target_index) { for (var i = target_index + 1; i >= target_index - 1; i--) { if (i === current_index) return true; } return false; }, // lock management lock : function () { this.settings.locked = true; }, unlock : function () { this.settings.locked = false; }, locked : function () { return this.settings.locked; }, off : function () { $(this.scope).off('.fndtn.clearing'); $(window).off('.fndtn.clearing'); }, reflow : function () { this.init(); } }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.dropdown = { name : 'dropdown', version : '5.0.0', settings : { active_class: 'open', is_hover: false, opened: function(){}, closed: function(){} }, init : function (scope, method, options) { Foundation.inherit(this, 'throttle'); this.bindings(method, options); }, events : function (scope) { var self = this; $(this.scope) .off('.dropdown') .on('click.fndtn.dropdown', '[data-dropdown]', function (e) { var settings = $(this).data('dropdown-init'); e.preventDefault(); if (!settings.is_hover || Modernizr.touch) self.toggle($(this)); }) .on('mouseenter.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { var $this = $(this); clearTimeout(self.timeout); if ($this.data('dropdown')) { var dropdown = $('#' + $this.data('dropdown')), target = $this; } else { var dropdown = $this; target = $("[data-dropdown='" + dropdown.attr('id') + "']"); } var settings = target.data('dropdown-init'); if (settings.is_hover) self.open.apply(self, [dropdown, target]); }) .on('mouseleave.fndtn.dropdown', '[data-dropdown], [data-dropdown-content]', function (e) { var $this = $(this); self.timeout = setTimeout(function () { if ($this.data('dropdown')) { var settings = $this.data('dropdown-init'); if (settings.is_hover) self.close.call(self, $('#' + $this.data('dropdown'))); } else { var target = $('[data-dropdown="' + $(this).attr('id') + '"]'), settings = target.data('dropdown-init'); if (settings.is_hover) self.close.call(self, $this); } }.bind(this), 150); }) .on('click.fndtn.dropdown', function (e) { var parent = $(e.target).closest('[data-dropdown-content]'); if ($(e.target).data('dropdown') || $(e.target).parent().data('dropdown')) { return; } if (!($(e.target).data('revealId')) && (parent.length > 0 && ($(e.target).is('[data-dropdown-content]') || $.contains(parent.first()[0], e.target)))) { e.stopPropagation(); return; } self.close.call(self, $('[data-dropdown-content]')); }) .on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened) .on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed); $(window) .off('.dropdown') .on('resize.fndtn.dropdown', self.throttle(function () { self.resize.call(self); }, 50)).trigger('resize'); }, close: function (dropdown) { var self = this; dropdown.each(function () { if ($(this).hasClass(self.settings.active_class)) { $(this) .css(Foundation.rtl ? 'right':'left', '-99999px') .removeClass(self.settings.active_class); $(this).trigger('closed'); } }); }, open: function (dropdown, target) { this .css(dropdown .addClass(this.settings.active_class), target); dropdown.trigger('opened'); }, toggle : function (target) { var dropdown = $('#' + target.data('dropdown')); if (dropdown.length === 0) { // No dropdown found, not continuing return; } this.close.call(this, $('[data-dropdown-content]').not(dropdown)); if (dropdown.hasClass(this.settings.active_class)) { this.close.call(this, dropdown); } else { this.close.call(this, $('[data-dropdown-content]')) this.open.call(this, dropdown, target); } }, resize : function () { var dropdown = $('[data-dropdown-content].open'), target = $("[data-dropdown='" + dropdown.attr('id') + "']"); if (dropdown.length && target.length) { this.css(dropdown, target); } }, css : function (dropdown, target) { var offset_parent = dropdown.offsetParent(), position = target.offset(); position.top -= offset_parent.offset().top; position.left -= offset_parent.offset().left; if (this.small()) { dropdown.css({ position : 'absolute', width: '95%', 'max-width': 'none', top: position.top + target.outerHeight() }); dropdown.css(Foundation.rtl ? 'right':'left', '2.5%'); } else { if (!Foundation.rtl && $(window).width() > dropdown.outerWidth() + target.offset().left) { var left = position.left; if (dropdown.hasClass('right')) { dropdown.removeClass('right'); } } else { if (!dropdown.hasClass('right')) { dropdown.addClass('right'); } var left = position.left - (dropdown.outerWidth() - target.outerWidth()); } dropdown.attr('style', '').css({ position : 'absolute', top: position.top + target.outerHeight(), left: left }); } return dropdown; }, small : function () { return matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches; }, off: function () { $(this.scope).off('.fndtn.dropdown'); $('html, body').off('.fndtn.dropdown'); $(window).off('.fndtn.dropdown'); $('[data-dropdown-content]').off('.fndtn.dropdown'); this.settings.init = false; }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.interchange = { name : 'interchange', version : '5.0.0', cache : {}, images_loaded : false, nodes_loaded : false, settings : { load_attr : 'interchange', named_queries : { 'default' : Foundation.media_queries.small, small : Foundation.media_queries.small, medium : Foundation.media_queries.medium, large : Foundation.media_queries.large, xlarge : Foundation.media_queries.xlarge, xxlarge: Foundation.media_queries.xxlarge, landscape : 'only screen and (orientation: landscape)', portrait : 'only screen and (orientation: portrait)', retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)' }, directives : { replace: function (el, path, trigger) { // The trigger argument, if called within the directive, fires // an event named after the directive on the element, passing // any parameters along to the event that you pass to trigger. // // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c) // // This allows you to bind a callback like so: // $('#interchangeContainer').on('replace', function (e, a, b, c) { // console.log($(this).html(), a, b, c); // }); if (/IMG/.test(el[0].nodeName)) { var orig_path = el[0].src; if (new RegExp(path, 'i').test(orig_path)) return; el[0].src = path; return trigger(el[0].src); } var last_path = el.data('interchange-last-path'); if (last_path == path) return; return $.get(path, function (response) { el.html(response); el.data('interchange-last-path', path); trigger(); }); } } }, init : function (scope, method, options) { Foundation.inherit(this, 'throttle'); this.data_attr = 'data-' + this.settings.load_attr; this.bindings(method, options); this.load('images'); this.load('nodes'); }, events : function () { var self = this; $(window) .off('.interchange') .on('resize.fndtn.interchange', self.throttle(function () { self.resize.call(self); }, 50)); return this; }, resize : function () { var cache = this.cache; if(!this.images_loaded || !this.nodes_loaded) { setTimeout($.proxy(this.resize, this), 50); return; } for (var uuid in cache) { if (cache.hasOwnProperty(uuid)) { var passed = this.results(uuid, cache[uuid]); if (passed) { this.settings.directives[passed .scenario[1]](passed.el, passed.scenario[0], function () { if (arguments[0] instanceof Array) { var args = arguments[0]; } else { var args = Array.prototype.slice.call(arguments, 0); } passed.el.trigger(passed.scenario[1], args); }); } } } }, results : function (uuid, scenarios) { var count = scenarios.length; if (count > 0) { var el = this.S('[data-uuid="' + uuid + '"]'); for (var i = count - 1; i >= 0; i--) { var mq, rule = scenarios[i][2]; if (this.settings.named_queries.hasOwnProperty(rule)) { mq = matchMedia(this.settings.named_queries[rule]); } else { mq = matchMedia(rule); } if (mq.matches) { return {el: el, scenario: scenarios[i]}; } } } return false; }, load : function (type, force_update) { if (typeof this['cached_' + type] === 'undefined' || force_update) { this['update_' + type](); } return this['cached_' + type]; }, update_images : function () { var images = this.S('img[' + this.data_attr + ']'), count = images.length, loaded_count = 0, data_attr = this.data_attr; this.cache = {}; this.cached_images = []; this.images_loaded = (count === 0); for (var i = count - 1; i >= 0; i--) { loaded_count++; if (images[i]) { var str = images[i].getAttribute(data_attr) || ''; if (str.length > 0) { this.cached_images.push(images[i]); } } if(loaded_count === count) { this.images_loaded = true; this.enhance('images'); } } return this; }, update_nodes : function () { var nodes = this.S('[' + this.data_attr + ']:not(img)'), count = nodes.length, loaded_count = 0, data_attr = this.data_attr; this.cached_nodes = []; // Set nodes_loaded to true if there are no nodes // this.nodes_loaded = false; this.nodes_loaded = (count === 0); for (var i = count - 1; i >= 0; i--) { loaded_count++; var str = nodes[i].getAttribute(data_attr) || ''; if (str.length > 0) { this.cached_nodes.push(nodes[i]); } if(loaded_count === count) { this.nodes_loaded = true; this.enhance('nodes'); } } return this; }, enhance : function (type) { var count = this['cached_' + type].length; for (var i = count - 1; i >= 0; i--) { this.object($(this['cached_' + type][i])); } return $(window).trigger('resize'); }, parse_params : function (path, directive, mq) { return [this.trim(path), this.convert_directive(directive), this.trim(mq)]; }, convert_directive : function (directive) { var trimmed = this.trim(directive); if (trimmed.length > 0) { return trimmed; } return 'replace'; }, object : function(el) { var raw_arr = this.parse_data_attr(el), scenarios = [], count = raw_arr.length; if (count > 0) { for (var i = count - 1; i >= 0; i--) { var split = raw_arr[i].split(/\((.*?)(\))$/); if (split.length > 1) { var cached_split = split[0].split(','), params = this.parse_params(cached_split[0], cached_split[1], split[1]); scenarios.push(params); } } } return this.store(el, scenarios); }, uuid : function (separator) { var delim = separator || "-"; function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + delim + S4() + delim + S4() + delim + S4() + delim + S4() + S4() + S4()); }, store : function (el, scenarios) { var uuid = this.uuid(), current_uuid = el.data('uuid'); if (current_uuid) return this.cache[current_uuid]; el.attr('data-uuid', uuid); return this.cache[uuid] = scenarios; }, trim : function(str) { if (typeof str === 'string') { return $.trim(str); } return str; }, parse_data_attr : function (el) { var raw = el.data(this.settings.load_attr).split(/\[(.*?)\]/), count = raw.length, output = []; for (var i = count - 1; i >= 0; i--) { if (raw[i].replace(/[\W\d]+/, '').length > 4) { output.push(raw[i]); } } return output; }, reflow : function () { this.load('images', true); this.load('nodes', true); } }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; var Modernizr = Modernizr || false; Foundation.libs.joyride = { name : 'joyride', version : '5.0.0', defaults : { expose : false, // turn on or off the expose feature modal : true, // Whether to cover page with modal during the tour tip_location : 'bottom', // 'top' or 'bottom' in relation to parent nub_position : 'auto', // override on a per tooltip bases scroll_speed : 1500, // Page scrolling speed in milliseconds, 0 = no scroll animation scroll_animation : 'linear', // supports 'swing' and 'linear', extend with jQuery UI. timer : 0, // 0 = no timer , all other numbers = timer in milliseconds start_timer_on_click : true, // true or false - true requires clicking the first button start the timer start_offset : 0, // the index of the tooltip you want to start on (index of the li) next_button : true, // true or false to control whether a next button is used tip_animation : 'fade', // 'pop' or 'fade' in each tip pause_after : [], // array of indexes where to pause the tour after exposed : [], // array of expose elements tip_animation_fade_speed: 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition cookie_monster : false, // true or false to control whether cookies are used cookie_name : 'joyride', // Name the cookie you'll use cookie_domain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com' cookie_expires : 365, // set when you would like the cookie to expire. tip_container : 'body', // Where will the tip be attached tip_location_patterns : { top: ['bottom'], bottom: [], // bottom should not need to be repositioned left: ['right', 'top', 'bottom'], right: ['left', 'top', 'bottom'] }, post_ride_callback : function (){}, // A method to call once the tour closes (canceled or complete) post_step_callback : function (){}, // A method to call after each step pre_step_callback : function (){}, // A method to call before each step pre_ride_callback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element) post_expose_callback : function (){}, // A method to call after an element has been exposed template : { // HTML segments for tip layout link : '<a href="#close" class="joyride-close-tip">×</a>', timer : '<div class="joyride-timer-indicator-wrap"><span class="joyride-timer-indicator"></span></div>', tip : '<div class="joyride-tip-guide"><span class="joyride-nub"></span></div>', wrapper : '<div class="joyride-content-wrapper"></div>', button : '<a href="#" class="small button joyride-next-tip"></a>', modal : '<div class="joyride-modal-bg"></div>', expose : '<div class="joyride-expose-wrapper"></div>', expose_cover: '<div class="joyride-expose-cover"></div>' }, expose_add_class : '' // One or more space-separated class names to be added to exposed element }, init : function (scope, method, options) { Foundation.inherit(this, 'throttle delay'); this.settings = this.defaults; this.bindings(method, options) }, events : function () { var self = this; $(this.scope) .off('.joyride') .on('click.fndtn.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) { e.preventDefault(); if (this.settings.$li.next().length < 1) { this.end(); } else if (this.settings.timer > 0) { clearTimeout(this.settings.automate); this.hide(); this.show(); this.startTimer(); } else { this.hide(); this.show(); } }.bind(this)) .on('click.fndtn.joyride', '.joyride-close-tip', function (e) { e.preventDefault(); this.end(); }.bind(this)); $(window) .off('.joyride') .on('resize.fndtn.joyride', self.throttle(function () { if ($('[data-joyride]').length > 0 && self.settings.$next_tip) { if (self.settings.exposed.length > 0) { var $els = $(self.settings.exposed); $els.each(function () { var $this = $(this); self.un_expose($this); self.expose($this); }); } if (self.is_phone()) { self.pos_phone(); } else { self.pos_default(false, true); } } }, 100)); }, start : function () { var self = this, $this = $('[data-joyride]', this.scope), integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'], int_settings_count = integer_settings.length; if (!$this.length > 0) return; if (!this.settings.init) this.events(); this.settings = $this.data('joyride-init'); // non configureable settings this.settings.$content_el = $this; this.settings.$body = $(this.settings.tip_container); this.settings.body_offset = $(this.settings.tip_container).position(); this.settings.$tip_content = this.settings.$content_el.find('> li'); this.settings.paused = false; this.settings.attempts = 0; // can we create cookies? if (typeof $.cookie !== 'function') { this.settings.cookie_monster = false; } // generate the tips and insert into dom. if (!this.settings.cookie_monster || this.settings.cookie_monster && $.cookie(this.settings.cookie_name) === null) { this.settings.$tip_content.each(function (index) { var $this = $(this); this.settings = $.extend({}, self.defaults, self.data_options($this)) // Make sure that settings parsed from data_options are integers where necessary for (var i = int_settings_count - 1; i >= 0; i--) { self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10); } self.create({$li : $this, index : index}); }); // show first tip if (!this.settings.start_timer_on_click && this.settings.timer > 0) { this.show('init'); this.startTimer(); } else { this.show('init'); } } }, resume : function () { this.set_li(); this.show(); }, tip_template : function (opts) { var $blank, content; opts.tip_class = opts.tip_class || ''; $blank = $(this.settings.template.tip).addClass(opts.tip_class); content = $.trim($(opts.li).html()) + this.button_text(opts.button_text) + this.settings.template.link + this.timer_instance(opts.index); $blank.append($(this.settings.template.wrapper)); $blank.first().attr('data-index', opts.index); $('.joyride-content-wrapper', $blank).append(content); return $blank[0]; }, timer_instance : function (index) { var txt; if ((index === 0 && this.settings.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) { txt = ''; } else { txt = $(this.settings.template.timer)[0].outerHTML; } return txt; }, button_text : function (txt) { if (this.settings.next_button) { txt = $.trim(txt) || 'Next'; txt = $(this.settings.template.button).append(txt)[0].outerHTML; } else { txt = ''; } return txt; }, create : function (opts) { var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'), tipClass = opts.$li.attr('class'), $tip_content = $(this.tip_template({ tip_class : tipClass, index : opts.index, button_text : buttonText, li : opts.$li })); $(this.settings.tip_container).append($tip_content); }, show : function (init) { var $timer = null; // are we paused? if (this.settings.$li === undefined || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) { // don't go to the next li if the tour was paused if (this.settings.paused) { this.settings.paused = false; } else { this.set_li(init); } this.settings.attempts = 0; if (this.settings.$li.length && this.settings.$target.length > 0) { if (init) { //run when we first start this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip); if (this.settings.modal) { this.show_modal(); } } this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip); if (this.settings.modal && this.settings.expose) { this.expose(); } this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li)); this.settings.timer = parseInt(this.settings.timer, 10); this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location]; // scroll if not modal if (!/body/i.test(this.settings.$target.selector)) { this.scroll_to(); } if (this.is_phone()) { this.pos_phone(true); } else { this.pos_default(true); } $timer = this.settings.$next_tip.find('.joyride-timer-indicator'); if (/pop/i.test(this.settings.tip_animation)) { $timer.width(0); if (this.settings.timer > 0) { this.settings.$next_tip.show(); this.delay(function () { $timer.animate({ width: $timer.parent().width() }, this.settings.timer, 'linear'); }.bind(this), this.settings.tip_animation_fade_speed); } else { this.settings.$next_tip.show(); } } else if (/fade/i.test(this.settings.tip_animation)) { $timer.width(0); if (this.settings.timer > 0) { this.settings.$next_tip .fadeIn(this.settings.tip_animation_fade_speed) .show(); this.delay(function () { $timer.animate({ width: $timer.parent().width() }, this.settings.timer, 'linear'); }.bind(this), this.settings.tip_animation_fadeSpeed); } else { this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed); } } this.settings.$current_tip = this.settings.$next_tip; // skip non-existant targets } else if (this.settings.$li && this.settings.$target.length < 1) { this.show(); } else { this.end(); } } else { this.settings.paused = true; } }, is_phone : function () { return matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches; }, hide : function () { if (this.settings.modal && this.settings.expose) { this.un_expose(); } if (!this.settings.modal) { $('.joyride-modal-bg').hide(); } // Prevent scroll bouncing...wait to remove from layout this.settings.$current_tip.css('visibility', 'hidden'); setTimeout($.proxy(function() { this.hide(); this.css('visibility', 'visible'); }, this.settings.$current_tip), 0); this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip); }, set_li : function (init) { if (init) { this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset); this.set_next_tip(); this.settings.$current_tip = this.settings.$next_tip; } else { this.settings.$li = this.settings.$li.next(); this.set_next_tip(); } this.set_target(); }, set_next_tip : function () { this.settings.$next_tip = $(".joyride-tip-guide").eq(this.settings.$li.index()); this.settings.$next_tip.data('closed', ''); }, set_target : function () { var cl = this.settings.$li.attr('data-class'), id = this.settings.$li.attr('data-id'), $sel = function () { if (id) { return $(document.getElementById(id)); } else if (cl) { return $('.' + cl).first(); } else { return $('body'); } }; this.settings.$target = $sel(); }, scroll_to : function () { var window_half, tipOffset; window_half = $(window).height() / 2; tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()); if (tipOffset > 0) { $('html, body').animate({ scrollTop: tipOffset }, this.settings.scroll_speed, 'swing'); } }, paused : function () { return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1); }, restart : function () { this.hide(); this.settings.$li = undefined; this.show('init'); }, pos_default : function (init, resizing) { var half_fold = Math.ceil($(window).height() / 2), tip_position = this.settings.$next_tip.offset(), $nub = this.settings.$next_tip.find('.joyride-nub'), nub_width = Math.ceil($nub.outerWidth() / 2), nub_height = Math.ceil($nub.outerHeight() / 2), toggle = init || false; // tip must not be "display: none" to calculate position if (toggle) { this.settings.$next_tip.css('visibility', 'hidden'); this.settings.$next_tip.show(); } if (typeof resizing === 'undefined') { resizing = false; } if (!/body/i.test(this.settings.$target.selector)) { if (this.bottom()) { var leftOffset = this.settings.$target.offset().left; if (Foundation.rtl) { leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset; } this.settings.$next_tip.css({ top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight()), left: leftOffset}); this.nub_position($nub, this.settings.tip_settings.nub_position, 'top'); } else if (this.top()) { var leftOffset = this.settings.$target.offset().left; if (Foundation.rtl) { leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset; } this.settings.$next_tip.css({ top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height), left: leftOffset}); this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom'); } else if (this.right()) { this.settings.$next_tip.css({ top: this.settings.$target.offset().top, left: (this.outerWidth(this.settings.$target) + this.settings.$target.offset().left + nub_width)}); this.nub_position($nub, this.settings.tip_settings.nub_position, 'left'); } else if (this.left()) { this.settings.$next_tip.css({ top: this.settings.$target.offset().top, left: (this.settings.$target.offset().left - this.outerWidth(this.settings.$next_tip) - nub_width)}); this.nub_position($nub, this.settings.tip_settings.nub_position, 'right'); } if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) { $nub.removeClass('bottom') .removeClass('top') .removeClass('right') .removeClass('left'); this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts]; this.settings.attempts++; this.pos_default(); } } else if (this.settings.$li.length) { this.pos_modal($nub); } if (toggle) { this.settings.$next_tip.hide(); this.settings.$next_tip.css('visibility', 'visible'); } }, pos_phone : function (init) { var tip_height = this.settings.$next_tip.outerHeight(), tip_offset = this.settings.$next_tip.offset(), target_height = this.settings.$target.outerHeight(), $nub = $('.joyride-nub', this.settings.$next_tip), nub_height = Math.ceil($nub.outerHeight() / 2), toggle = init || false; $nub.removeClass('bottom') .removeClass('top') .removeClass('right') .removeClass('left'); if (toggle) { this.settings.$next_tip.css('visibility', 'hidden'); this.settings.$next_tip.show(); } if (!/body/i.test(this.settings.$target.selector)) { if (this.top()) { this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height}); $nub.addClass('bottom'); } else { this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height}); $nub.addClass('top'); } } else if (this.settings.$li.length) { this.pos_modal($nub); } if (toggle) { this.settings.$next_tip.hide(); this.settings.$next_tip.css('visibility', 'visible'); } }, pos_modal : function ($nub) { this.center(); $nub.hide(); this.show_modal(); }, show_modal : function () { if (!this.settings.$next_tip.data('closed')) { var joyridemodalbg = $('.joyride-modal-bg'); if (joyridemodalbg.length < 1) { $('body').append(this.settings.template.modal).show(); } if (/pop/i.test(this.settings.tip_animation)) { joyridemodalbg.show(); } else { joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed); } } }, expose : function () { var expose, exposeCover, el, origCSS, origClasses, randId = 'expose-'+Math.floor(Math.random()*10000); if (arguments.length > 0 && arguments[0] instanceof $) { el = arguments[0]; } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ el = this.settings.$target; } else { return false; } if(el.length < 1){ if(window.console){ console.error('element not valid', el); } return false; } expose = $(this.settings.template.expose); this.settings.$body.append(expose); expose.css({ top: el.offset().top, left: el.offset().left, width: el.outerWidth(true), height: el.outerHeight(true) }); exposeCover = $(this.settings.template.expose_cover); origCSS = { zIndex: el.css('z-index'), position: el.css('position') }; origClasses = el.attr('class') == null ? '' : el.attr('class'); el.css('z-index',parseInt(expose.css('z-index'))+1); if (origCSS.position == 'static') { el.css('position','relative'); } el.data('expose-css',origCSS); el.data('orig-class', origClasses); el.attr('class', origClasses + ' ' + this.settings.expose_add_class); exposeCover.css({ top: el.offset().top, left: el.offset().left, width: el.outerWidth(true), height: el.outerHeight(true) }); if (this.settings.modal) this.show_modal(); this.settings.$body.append(exposeCover); expose.addClass(randId); exposeCover.addClass(randId); el.data('expose', randId); this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el); this.add_exposed(el); }, un_expose : function () { var exposeId, el, expose , origCSS, origClasses, clearAll = false; if (arguments.length > 0 && arguments[0] instanceof $) { el = arguments[0]; } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ el = this.settings.$target; } else { return false; } if(el.length < 1){ if (window.console) { console.error('element not valid', el); } return false; } exposeId = el.data('expose'); expose = $('.' + exposeId); if (arguments.length > 1) { clearAll = arguments[1]; } if (clearAll === true) { $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); } else { expose.remove(); } origCSS = el.data('expose-css'); if (origCSS.zIndex == 'auto') { el.css('z-index', ''); } else { el.css('z-index', origCSS.zIndex); } if (origCSS.position != el.css('position')) { if(origCSS.position == 'static') {// this is default, no need to set it. el.css('position', ''); } else { el.css('position', origCSS.position); } } origClasses = el.data('orig-class'); el.attr('class', origClasses); el.removeData('orig-classes'); el.removeData('expose'); el.removeData('expose-z-index'); this.remove_exposed(el); }, add_exposed: function(el){ this.settings.exposed = this.settings.exposed || []; if (el instanceof $ || typeof el === 'object') { this.settings.exposed.push(el[0]); } else if (typeof el == 'string') { this.settings.exposed.push(el); } }, remove_exposed: function(el){ var search, count; if (el instanceof $) { search = el[0] } else if (typeof el == 'string'){ search = el; } this.settings.exposed = this.settings.exposed || []; count = this.settings.exposed.length; for (var i=0; i < count; i++) { if (this.settings.exposed[i] == search) { this.settings.exposed.splice(i, 1); return; } } }, center : function () { var $w = $(window); this.settings.$next_tip.css({ top : ((($w.height() - this.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()), left : ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft()) }); return true; }, bottom : function () { return /bottom/i.test(this.settings.tip_settings.tip_location); }, top : function () { return /top/i.test(this.settings.tip_settings.tip_location); }, right : function () { return /right/i.test(this.settings.tip_settings.tip_location); }, left : function () { return /left/i.test(this.settings.tip_settings.tip_location); }, corners : function (el) { var w = $(window), window_half = w.height() / 2, //using this to calculate since scroll may not have finished yet. tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()), right = w.width() + w.scrollLeft(), offsetBottom = w.height() + tipOffset, bottom = w.height() + w.scrollTop(), top = w.scrollTop(); if (tipOffset < top) { if (tipOffset < 0) { top = 0; } else { top = tipOffset; } } if (offsetBottom > bottom) { bottom = offsetBottom; } return [ el.offset().top < top, right < el.offset().left + el.outerWidth(), bottom < el.offset().top + el.outerHeight(), w.scrollLeft() > el.offset().left ]; }, visible : function (hidden_corners) { var i = hidden_corners.length; while (i--) { if (hidden_corners[i]) return false; } return true; }, nub_position : function (nub, pos, def) { if (pos === 'auto') { nub.addClass(def); } else { nub.addClass(pos); } }, startTimer : function () { if (this.settings.$li.length) { this.settings.automate = setTimeout(function () { this.hide(); this.show(); this.startTimer(); }.bind(this), this.settings.timer); } else { clearTimeout(this.settings.automate); } }, end : function () { if (this.settings.cookie_monster) { $.cookie(this.settings.cookie_name, 'ridden', { expires: this.settings.cookie_expires, domain: this.settings.cookie_domain }); } if (this.settings.timer > 0) { clearTimeout(this.settings.automate); } if (this.settings.modal && this.settings.expose) { this.un_expose(); } this.settings.$next_tip.data('closed', true); $('.joyride-modal-bg').hide(); this.settings.$current_tip.hide(); this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip); this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip); $('.joyride-tip-guide').remove(); }, off : function () { $(this.scope).off('.joyride'); $(window).off('.joyride'); $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); $('.joyride-tip-guide, .joyride-modal-bg').remove(); clearTimeout(this.settings.automate); this.settings = {}; }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.magellan = { name : 'magellan', version : '5.0.0', settings : { active_class: 'active', threshold: 0 }, init : function (scope, method, options) { this.fixed_magellan = $("[data-magellan-expedition]"); this.set_threshold(); this.last_destination = $('[data-magellan-destination]').last(); this.events(); }, events : function () { var self = this; $(this.scope) .off('.magellan') .on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) { var $destination = $(this), $expedition = $destination.closest('[data-magellan-expedition]'), active_class = $expedition.attr('data-magellan-active-class') || self.settings.active_class; $destination .closest('[data-magellan-expedition]') .find('[data-magellan-arrival]') .not($destination) .removeClass(active_class); $destination.addClass(active_class); }); this.fixed_magellan .off('.magellan') .on('update-position.fndtn.magellan', function() { var $el = $(this); }) .trigger('update-position'); $(window) .off('.magellan') .on('resize.fndtn.magellan', function() { this.fixed_magellan.trigger('update-position'); }.bind(this)) .on('scroll.fndtn.magellan', function() { var windowScrollTop = $(window).scrollTop(); self.fixed_magellan.each(function() { var $expedition = $(this); if (typeof $expedition.data('magellan-top-offset') === 'undefined') { $expedition.data('magellan-top-offset', $expedition.offset().top); } if (typeof $expedition.data('magellan-fixed-position') === 'undefined') { $expedition.data('magellan-fixed-position', false); } var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset"); var attr = $expedition.attr('data-magellan-top-offset'); if ($expedition.data("magellan-fixed-position") != fixed_position) { $expedition.data("magellan-fixed-position", fixed_position); if (fixed_position) { $expedition.addClass('fixed'); $expedition.css({position:"fixed", top:0}); } else { $expedition.removeClass('fixed'); $expedition.css({position:"", top:""}); } if (fixed_position && typeof attr != 'undefined' && attr != false) { $expedition.css({position:"fixed", top:attr + "px"}); } } }); }); if (this.last_destination.length > 0) { $(window).on('scroll.fndtn.magellan', function (e) { var windowScrollTop = $(window).scrollTop(), scrolltopPlusHeight = windowScrollTop + $(window).height(), lastDestinationTop = Math.ceil(self.last_destination.offset().top); $('[data-magellan-destination]').each(function () { var $destination = $(this), destination_name = $destination.attr('data-magellan-destination'), topOffset = $destination.offset().top - $destination.outerHeight(true) - windowScrollTop; if (topOffset <= self.settings.threshold) { $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival'); } // In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) { $('[data-magellan-arrival]').last().trigger('arrival'); } }); }); } }, set_threshold : function () { if (typeof this.settings.threshold !== 'number') { this.settings.threshold = (this.fixed_magellan.length > 0) ? this.fixed_magellan.outerHeight(true) : 0; } }, off : function () { $(this.scope).off('.fndtn.magellan'); $(window).off('.fndtn.magellan'); }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.offcanvas = { name : 'offcanvas', version : '5.0.0', settings : {}, init : function (scope, method, options) { this.events(); }, events : function () { $(this.scope).off('.offcanvas') .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { e.preventDefault(); $(this).closest('.off-canvas-wrap').toggleClass('move-right'); }) .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { e.preventDefault(); $(".off-canvas-wrap").removeClass("move-right"); }) .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { e.preventDefault(); $(this).closest(".off-canvas-wrap").toggleClass("move-left"); }) .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { e.preventDefault(); $(".off-canvas-wrap").removeClass("move-left"); }); }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; var noop = function() {}; var Orbit = function(el, settings) { // Don't reinitialize plugin if (el.hasClass(settings.slides_container_class)) { return this; } var self = this, container, slides_container = el, number_container, bullets_container, timer_container, idx = 0, animate, timer, locked = false, adjust_height_after = false; slides_container.children().first().addClass(settings.active_slide_class); self.update_slide_number = function(index) { if (settings.slide_number) { number_container.find('span:first').text(parseInt(index)+1); number_container.find('span:last').text(slides_container.children().length); } if (settings.bullets) { bullets_container.children().removeClass(settings.bullets_active_class); $(bullets_container.children().get(index)).addClass(settings.bullets_active_class); } }; self.update_active_link = function(index) { var link = $('a[data-orbit-link="'+slides_container.children().eq(index).attr('data-orbit-slide')+'"]'); link.parents('ul').find('[data-orbit-link]').removeClass(settings.bullets_active_class); link.addClass(settings.bullets_active_class); }; self.build_markup = function() { slides_container.wrap('<div class="'+settings.container_class+'"></div>'); container = slides_container.parent(); slides_container.addClass(settings.slides_container_class); if (settings.navigation_arrows) { container.append($('<a href="#"><span></span></a>').addClass(settings.prev_class)); container.append($('<a href="#"><span></span></a>').addClass(settings.next_class)); } if (settings.timer) { timer_container = $('<div>').addClass(settings.timer_container_class); timer_container.append('<span>'); timer_container.append($('<div>').addClass(settings.timer_progress_class)); timer_container.addClass(settings.timer_paused_class); container.append(timer_container); } if (settings.slide_number) { number_container = $('<div>').addClass(settings.slide_number_class); number_container.append('<span></span> ' + settings.slide_number_text + ' <span></span>'); container.append(number_container); } if (settings.bullets) { bullets_container = $('<ol>').addClass(settings.bullets_container_class); container.append(bullets_container); bullets_container.wrap('<div class="orbit-bullets-container"></div>'); slides_container.children().each(function(idx, el) { var bullet = $('<li>').attr('data-orbit-slide', idx); bullets_container.append(bullet); }); } if (settings.stack_on_small) { container.addClass(settings.stack_on_small_class); } self.update_slide_number(0); self.update_active_link(0); }; self._goto = function(next_idx, start_timer) { // if (locked) {return false;} if (next_idx === idx) {return false;} if (typeof timer === 'object') {timer.restart();} var slides = slides_container.children(); var dir = 'next'; locked = true; if (next_idx < idx) {dir = 'prev';} if (next_idx >= slides.length) {next_idx = 0;} else if (next_idx < 0) {next_idx = slides.length - 1;} var current = $(slides.get(idx)); var next = $(slides.get(next_idx)); current.css('zIndex', 2); current.removeClass(settings.active_slide_class); next.css('zIndex', 4).addClass(settings.active_slide_class); slides_container.trigger('before-slide-change.fndtn.orbit'); settings.before_slide_change(); self.update_active_link(next_idx); var callback = function() { var unlock = function() { idx = next_idx; locked = false; if (start_timer === true) {timer = self.create_timer(); timer.start();} self.update_slide_number(idx); slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); settings.after_slide_change(idx, slides.length); }; if (slides_container.height() != next.height() && settings.variable_height) { slides_container.animate({'height': next.height()}, 250, 'linear', unlock); } else { unlock(); } }; if (slides.length === 1) {callback(); return false;} var start_animation = function() { if (dir === 'next') {animate.next(current, next, callback);} if (dir === 'prev') {animate.prev(current, next, callback);} }; if (next.height() > slides_container.height() && settings.variable_height) { slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); } else { start_animation(); } }; self.next = function(e) { e.stopImmediatePropagation(); e.preventDefault(); self._goto(idx + 1); }; self.prev = function(e) { e.stopImmediatePropagation(); e.preventDefault(); self._goto(idx - 1); }; self.link_custom = function(e) { e.preventDefault(); var link = $(this).attr('data-orbit-link'); if ((typeof link === 'string') && (link = $.trim(link)) != "") { var slide = container.find('[data-orbit-slide='+link+']'); if (slide.index() != -1) {self._goto(slide.index());} } }; self.link_bullet = function(e) { var index = $(this).attr('data-orbit-slide'); if ((typeof index === 'string') && (index = $.trim(index)) != "") { self._goto(parseInt(index)); } } self.timer_callback = function() { self._goto(idx + 1, true); } self.compute_dimensions = function() { var current = $(slides_container.children().get(idx)); var h = current.height(); if (!settings.variable_height) { slides_container.children().each(function(){ if ($(this).height() > h) { h = $(this).height(); } }); } slides_container.height(h); }; self.create_timer = function() { var t = new Timer( container.find('.'+settings.timer_container_class), settings, self.timer_callback ); return t; }; self.stop_timer = function() { if (typeof timer === 'object') timer.stop(); }; self.toggle_timer = function() { var t = container.find('.'+settings.timer_container_class); if (t.hasClass(settings.timer_paused_class)) { if (typeof timer === 'undefined') {timer = self.create_timer();} timer.start(); } else { if (typeof timer === 'object') {timer.stop();} } }; self.init = function() { self.build_markup(); if (settings.timer) {timer = self.create_timer(); timer.start();} animate = new FadeAnimation(settings, slides_container); if (settings.animation === 'slide') animate = new SlideAnimation(settings, slides_container); container.on('click', '.'+settings.next_class, self.next); container.on('click', '.'+settings.prev_class, self.prev); container.on('click', '[data-orbit-slide]', self.link_bullet); container.on('click', self.toggle_timer); if (settings.swipe) { container.on('touchstart.fndtn.orbit', function(e) { if (!e.touches) {e = e.originalEvent;} var data = { start_page_x: e.touches[0].pageX, start_page_y: e.touches[0].pageY, start_time: (new Date()).getTime(), delta_x: 0, is_scrolling: undefined }; container.data('swipe-transition', data); e.stopPropagation(); }) .on('touchmove.fndtn.orbit', function(e) { if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if(e.touches.length > 1 || e.scale && e.scale !== 1) return; var data = container.data('swipe-transition'); if (typeof data === 'undefined') {data = {};} data.delta_x = e.touches[0].pageX - data.start_page_x; if ( typeof data.is_scrolling === 'undefined') { data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); } if (!data.is_scrolling && !data.active) { e.preventDefault(); var direction = (data.delta_x < 0) ? (idx+1) : (idx-1); data.active = true; self._goto(direction); } }) .on('touchend.fndtn.orbit', function(e) { container.data('swipe-transition', {}); e.stopPropagation(); }) } container.on('mouseenter.fndtn.orbit', function(e) { if (settings.timer && settings.pause_on_hover) { self.stop_timer(); } }) .on('mouseleave.fndtn.orbit', function(e) { if (settings.timer && settings.resume_on_mouseout) { timer.start(); } }); $(document).on('click', '[data-orbit-link]', self.link_custom); $(window).on('resize', self.compute_dimensions); $(window).on('load', self.compute_dimensions); $(window).on('load', function(){ container.prev('.preloader').css('display', 'none'); }); slides_container.trigger('ready.fndtn.orbit'); }; self.init(); }; var Timer = function(el, settings, callback) { var self = this, duration = settings.timer_speed, progress = el.find('.'+settings.timer_progress_class), start, timeout, left = -1; this.update_progress = function(w) { var new_progress = progress.clone(); new_progress.attr('style', ''); new_progress.css('width', w+'%'); progress.replaceWith(new_progress); progress = new_progress; }; this.restart = function() { clearTimeout(timeout); el.addClass(settings.timer_paused_class); left = -1; self.update_progress(0); }; this.start = function() { if (!el.hasClass(settings.timer_paused_class)) {return true;} left = (left === -1) ? duration : left; el.removeClass(settings.timer_paused_class); start = new Date().getTime(); progress.animate({'width': '100%'}, left, 'linear'); timeout = setTimeout(function() { self.restart(); callback(); }, left); el.trigger('timer-started.fndtn.orbit') }; this.stop = function() { if (el.hasClass(settings.timer_paused_class)) {return true;} clearTimeout(timeout); el.addClass(settings.timer_paused_class); var end = new Date().getTime(); left = left - (end - start); var w = 100 - ((left / duration) * 100); self.update_progress(w); el.trigger('timer-stopped.fndtn.orbit'); }; }; var SlideAnimation = function(settings, container) { var duration = settings.animation_speed; var is_rtl = ($('html[dir=rtl]').length === 1); var margin = is_rtl ? 'marginRight' : 'marginLeft'; var animMargin = {}; animMargin[margin] = '0%'; this.next = function(current, next, callback) { current.animate({marginLeft:'-100%'}, duration); next.animate(animMargin, duration, function() { current.css(margin, '100%'); callback(); }); }; this.prev = function(current, prev, callback) { current.animate({marginLeft:'100%'}, duration); prev.css(margin, '-100%'); prev.animate(animMargin, duration, function() { current.css(margin, '100%'); callback(); }); }; }; var FadeAnimation = function(settings, container) { var duration = settings.animation_speed; var is_rtl = ($('html[dir=rtl]').length === 1); var margin = is_rtl ? 'marginRight' : 'marginLeft'; this.next = function(current, next, callback) { next.css({'margin':'0%', 'opacity':'0.01'}); next.animate({'opacity':'1'}, duration, 'linear', function() { current.css('margin', '100%'); callback(); }); }; this.prev = function(current, prev, callback) { prev.css({'margin':'0%', 'opacity':'0.01'}); prev.animate({'opacity':'1'}, duration, 'linear', function() { current.css('margin', '100%'); callback(); }); }; }; Foundation.libs = Foundation.libs || {}; Foundation.libs.orbit = { name: 'orbit', version: '5.0.0', settings: { animation: 'slide', timer_speed: 10000, pause_on_hover: true, resume_on_mouseout: false, animation_speed: 500, stack_on_small: false, navigation_arrows: true, slide_number: true, slide_number_text: 'of', container_class: 'orbit-container', stack_on_small_class: 'orbit-stack-on-small', next_class: 'orbit-next', prev_class: 'orbit-prev', timer_container_class: 'orbit-timer', timer_paused_class: 'paused', timer_progress_class: 'orbit-progress', slides_container_class: 'orbit-slides-container', bullets_container_class: 'orbit-bullets', bullets_active_class: 'active', slide_number_class: 'orbit-slide-number', caption_class: 'orbit-caption', active_slide_class: 'active', orbit_transition_class: 'orbit-transitioning', bullets: true, timer: true, variable_height: false, swipe: true, before_slide_change: noop, after_slide_change: noop }, init: function (scope, method, options) { var self = this; if (typeof method === 'object') { $.extend(true, self.settings, method); } if ($(scope).is('[data-orbit]')) { var $el = $(scope); var opts = self.data_options($el); new Orbit($el, $.extend({},self.settings, opts)); } $('[data-orbit]', scope).each(function(idx, el) { var $el = $(el); var opts = self.data_options($el); new Orbit($el, $.extend({},self.settings, opts)); }); } }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.reveal = { name : 'reveal', version : '5.0.0', locked : false, settings : { animation: 'fadeAndPop', animation_speed: 250, close_on_background_click: true, close_on_esc: true, dismiss_modal_class: 'close-reveal-modal', bg_class: 'reveal-modal-bg', open: function(){}, opened: function(){}, close: function(){}, closed: function(){}, bg : $('.reveal-modal-bg'), css : { open : { 'opacity': 0, 'visibility': 'visible', 'display' : 'block' }, close : { 'opacity': 1, 'visibility': 'hidden', 'display': 'none' } } }, init : function (scope, method, options) { Foundation.inherit(this, 'delay'); this.bindings(method, options); }, events : function (scope) { var self = this; $('[data-reveal-id]', this.scope) .off('.reveal') .on('click.fndtn.reveal', function (e) { e.preventDefault(); if (!self.locked) { var element = $(this), ajax = element.data('reveal-ajax'); self.locked = true; if (typeof ajax === 'undefined') { self.open.call(self, element); } else { var url = ajax === true ? element.attr('href') : ajax; self.open.call(self, element, {url: url}); } } }); $(this.scope) .off('.reveal') .on('click.fndtn.reveal', this.close_targets(), function (e) { e.preventDefault(); if (!self.locked) { var settings = $('[data-reveal].open').data('reveal-init'), bg_clicked = $(e.target)[0] === $('.' + settings.bg_class)[0]; if (bg_clicked && !settings.close_on_background_click) { return; } self.locked = true; self.close.call(self, bg_clicked ? $('[data-reveal].open') : $(this).closest('[data-reveal]')); } }); if($('[data-reveal]', this.scope).length > 0) { $(this.scope) // .off('.reveal') .on('open.fndtn.reveal', this.settings.open) .on('opened.fndtn.reveal', this.settings.opened) .on('opened.fndtn.reveal', this.open_video) .on('close.fndtn.reveal', this.settings.close) .on('closed.fndtn.reveal', this.settings.closed) .on('closed.fndtn.reveal', this.close_video); } else { $(this.scope) // .off('.reveal') .on('open.fndtn.reveal', '[data-reveal]', this.settings.open) .on('opened.fndtn.reveal', '[data-reveal]', this.settings.opened) .on('opened.fndtn.reveal', '[data-reveal]', this.open_video) .on('close.fndtn.reveal', '[data-reveal]', this.settings.close) .on('closed.fndtn.reveal', '[data-reveal]', this.settings.closed) .on('closed.fndtn.reveal', '[data-reveal]', this.close_video); } $('body').on('keyup.fndtn.reveal', function ( event ) { var open_modal = $('[data-reveal].open'), settings = open_modal.data('reveal-init'); if ( event.which === 27 && settings.close_on_esc) { // 27 is the keycode for the Escape key open_modal.foundation('reveal', 'close'); } }); return true; }, open : function (target, ajax_settings) { if (target) { if (typeof target.selector !== 'undefined') { var modal = $('#' + target.data('reveal-id')); } else { var modal = $(this.scope); ajax_settings = target; } } else { var modal = $(this.scope); } if (!modal.hasClass('open')) { var open_modal = $('[data-reveal].open'); if (typeof modal.data('css-top') === 'undefined') { modal.data('css-top', parseInt(modal.css('top'), 10)) .data('offset', this.cache_offset(modal)); } modal.trigger('open'); if (open_modal.length < 1) { this.toggle_bg(); } if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { this.hide(open_modal, this.settings.css.close); this.show(modal, this.settings.css.open); } else { var self = this, old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; $.extend(ajax_settings, { success: function (data, textStatus, jqXHR) { if ( $.isFunction(old_success) ) { old_success(data, textStatus, jqXHR); } modal.html(data); $(modal).foundation('section', 'reflow'); self.hide(open_modal, self.settings.css.close); self.show(modal, self.settings.css.open); } }); $.ajax(ajax_settings); } } }, close : function (modal) { var modal = modal && modal.length ? modal : $(this.scope), open_modals = $('[data-reveal].open'); if (open_modals.length > 0) { this.locked = true; modal.trigger('close'); this.toggle_bg(); this.hide(open_modals, this.settings.css.close); } }, close_targets : function () { var base = '.' + this.settings.dismiss_modal_class; if (this.settings.close_on_background_click) { return base + ', .' + this.settings.bg_class; } return base; }, toggle_bg : function () { if ($('.' + this.settings.bg_class).length === 0) { this.settings.bg = $('<div />', {'class': this.settings.bg_class}) .appendTo('body'); } if (this.settings.bg.filter(':visible').length > 0) { this.hide(this.settings.bg); } else { this.show(this.settings.bg); } }, show : function (el, css) { // is modal if (css) { if (el.parent('body').length === 0) { var placeholder = el.wrap('<div style="display: none;" />').parent(); el.on('closed.fndtn.reveal.wrapped', function() { el.detach().appendTo(placeholder); el.unwrap().unbind('closed.fndtn.reveal.wrapped'); }); el.detach().appendTo('body'); } if (/pop/i.test(this.settings.animation)) { css.top = $(window).scrollTop() - el.data('offset') + 'px'; var end_css = { top: $(window).scrollTop() + el.data('css-top') + 'px', opacity: 1 }; return this.delay(function () { return el .css(css) .animate(end_css, this.settings.animation_speed, 'linear', function () { this.locked = false; el.trigger('opened'); }.bind(this)) .addClass('open'); }.bind(this), this.settings.animation_speed / 2); } if (/fade/i.test(this.settings.animation)) { var end_css = {opacity: 1}; return this.delay(function () { return el .css(css) .animate(end_css, this.settings.animation_speed, 'linear', function () { this.locked = false; el.trigger('opened'); }.bind(this)) .addClass('open'); }.bind(this), this.settings.animation_speed / 2); } return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened'); } // should we animate the background? if (/fade/i.test(this.settings.animation)) { return el.fadeIn(this.settings.animation_speed / 2); } return el.show(); }, hide : function (el, css) { // is modal if (css) { if (/pop/i.test(this.settings.animation)) { var end_css = { top: - $(window).scrollTop() - el.data('offset') + 'px', opacity: 0 }; return this.delay(function () { return el .animate(end_css, this.settings.animation_speed, 'linear', function () { this.locked = false; el.css(css).trigger('closed'); }.bind(this)) .removeClass('open'); }.bind(this), this.settings.animation_speed / 2); } if (/fade/i.test(this.settings.animation)) { var end_css = {opacity: 0}; return this.delay(function () { return el .animate(end_css, this.settings.animation_speed, 'linear', function () { this.locked = false; el.css(css).trigger('closed'); }.bind(this)) .removeClass('open'); }.bind(this), this.settings.animation_speed / 2); } return el.hide().css(css).removeClass('open').trigger('closed'); } // should we animate the background? if (/fade/i.test(this.settings.animation)) { return el.fadeOut(this.settings.animation_speed / 2); } return el.hide(); }, close_video : function (e) { var video = $(this).find('.flex-video'), iframe = video.find('iframe'); if (iframe.length > 0) { iframe.attr('data-src', iframe[0].src); iframe.attr('src', 'about:blank'); video.hide(); } }, open_video : function (e) { var video = $(this).find('.flex-video'), iframe = video.find('iframe'); if (iframe.length > 0) { var data_src = iframe.attr('data-src'); if (typeof data_src === 'string') { iframe[0].src = iframe.attr('data-src'); } else { var src = iframe[0].src; iframe[0].src = undefined; iframe[0].src = src; } video.show(); } }, cache_offset : function (modal) { var offset = modal.show().height() + parseInt(modal.css('top'), 10); modal.hide(); return offset; }, off : function () { $(this.scope).off('.fndtn.reveal'); }, reflow : function () {} }; }(jQuery, this, this.document)); /*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.tab = { name : 'tab', version : '5.0.1', settings : { active_class: 'active' }, init : function (scope, method, options) { this.bindings(method, options); }, events : function () { $(this.scope).off('.tab').on('click.fndtn.tab', '[data-tab] > dd > a', function (e) { e.preventDefault(); var tab = $(this).parent(), target = $('#' + this.href.split('#')[1]), siblings = tab.siblings(), settings = tab.closest('[data-tab]').data('tab-init'); tab.addClass(settings.active_class); siblings.removeClass(settings.active_class); target.siblings().removeClass(settings.active_class).end().addClass(settings.active_class); }); }, off : function () {}, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.tooltip = { name : 'tooltip', version : '5.0.0', settings : { additional_inheritable_classes : [], tooltip_class : '.tooltip', append_to: 'body', touch_close_text: 'Tap To Close', disable_for_touch: false, tip_template : function (selector, content) { return '<span data-selector="' + selector + '" class="' + Foundation.libs.tooltip.settings.tooltip_class.substring(1) + '">' + content + '<span class="nub"></span></span>'; } }, cache : {}, init : function (scope, method, options) { this.bindings(method, options); }, events : function () { var self = this; if (Modernizr.touch) { $(this.scope) .off('.tooltip') .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', '[data-tooltip]', function (e) { var settings = $.extend({}, self.settings, self.data_options($(this))); if (!settings.disable_for_touch) { e.preventDefault(); $(settings.tooltip_class).hide(); self.showOrCreateTip($(this)); } }) .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', this.settings.tooltip_class, function (e) { e.preventDefault(); $(this).fadeOut(150); }); } else { $(this.scope) .off('.tooltip') .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip', '[data-tooltip]', function (e) { var $this = $(this); if (/enter|over/i.test(e.type)) { self.showOrCreateTip($this); } else if (e.type === 'mouseout' || e.type === 'mouseleave') { self.hide($this); } }); } }, showOrCreateTip : function ($target) { var $tip = this.getTip($target); if ($tip && $tip.length > 0) { return this.show($target); } return this.create($target); }, getTip : function ($target) { var selector = this.selector($target), tip = null; if (selector) { tip = $('span[data-selector="' + selector + '"]' + this.settings.tooltip_class); } return (typeof tip === 'object') ? tip : false; }, selector : function ($target) { var id = $target.attr('id'), dataSelector = $target.attr('data-tooltip') || $target.attr('data-selector'); if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') { dataSelector = 'tooltip' + Math.random().toString(36).substring(7); $target.attr('data-selector', dataSelector); } return (id && id.length > 0) ? id : dataSelector; }, create : function ($target) { var $tip = $(this.settings.tip_template(this.selector($target), $('<div></div>').html($target.attr('title')).html())), classes = this.inheritable_classes($target); $tip.addClass(classes).appendTo(this.settings.append_to); if (Modernizr.touch) { $tip.append('<span class="tap-to-close">'+this.settings.touch_close_text+'</span>'); } $target.removeAttr('title').attr('title',''); this.show($target); }, reposition : function (target, tip, classes) { var width, nub, nubHeight, nubWidth, column, objPos; tip.css('visibility', 'hidden').show(); width = target.data('width'); nub = tip.children('.nub'); nubHeight = nub.outerHeight(); nubWidth = nub.outerHeight(); objPos = function (obj, top, right, bottom, left, width) { return obj.css({ 'top' : (top) ? top : 'auto', 'bottom' : (bottom) ? bottom : 'auto', 'left' : (left) ? left : 'auto', 'right' : (right) ? right : 'auto', 'width' : (width) ? width : 'auto' }).end(); }; objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left, width); if (this.small()) { objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width()); tip.addClass('tip-override'); objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); } else { var left = target.offset().left; if (Foundation.rtl) { left = target.offset().left + target.offset().width - tip.outerWidth(); } objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left, width); tip.removeClass('tip-override'); if (classes && classes.indexOf('tip-top') > -1) { objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left, width) .removeClass('tip-override'); } else if (classes && classes.indexOf('tip-left') > -1) { objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight), width) .removeClass('tip-override'); } else if (classes && classes.indexOf('tip-right') > -1) { objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight), width) .removeClass('tip-override'); } } tip.css('visibility', 'visible').hide(); }, small : function () { return matchMedia(Foundation.media_queries.small).matches; }, inheritable_classes : function (target) { var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'noradius'].concat(this.settings.additional_inheritable_classes), classes = target.attr('class'), filtered = classes ? $.map(classes.split(' '), function (el, i) { if ($.inArray(el, inheritables) !== -1) { return el; } }).join(' ') : ''; return $.trim(filtered); }, show : function ($target) { var $tip = this.getTip($target); this.reposition($target, $tip, $target.attr('class')); $tip.fadeIn(150); }, hide : function ($target) { var $tip = this.getTip($target); $tip.fadeOut(150); }, // deprecate reload reload : function () { var $self = $(this); return ($self.data('fndtn-tooltips')) ? $self.foundationTooltips('destroy').foundationTooltips('init') : $self.foundationTooltips('init'); }, off : function () { $(this.scope).off('.fndtn.tooltip'); $(this.settings.tooltip_class).each(function (i) { $('[data-tooltip]').get(i).attr('title', $(this).text()); }).remove(); }, reflow : function () {} }; }(jQuery, this, this.document)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.topbar = { name : 'topbar', version: '5.0.1', settings : { index : 0, sticky_class : 'sticky', custom_back_text: true, back_text: 'Back', is_hover: true, mobile_show_parent_link: false, scrolltop : true // jump to top when sticky nav menu toggle is clicked }, init : function (section, method, options) { Foundation.inherit(this, 'addCustomRule register_media throttle'); var self = this; self.register_media('topbar', 'foundation-mq-topbar'); this.bindings(method, options); $('[data-topbar]', this.scope).each(function () { var topbar = $(this), settings = topbar.data('topbar-init'), section = $('section', this), titlebar = $('> ul', this).first(); topbar.data('index', 0); var topbarContainer = topbar.parent(); if(topbarContainer.hasClass('fixed') || topbarContainer.hasClass(settings.sticky_class)) { self.settings.sticky_class = settings.sticky_class; self.settings.stick_topbar = topbar; topbar.data('height', topbarContainer.outerHeight()); topbar.data('stickyoffset', topbarContainer.offset().top); } else { topbar.data('height', topbar.outerHeight()); } if (!settings.assembled) self.assemble(topbar); if (settings.is_hover) { $('.has-dropdown', topbar).addClass('not-click'); } else { $('.has-dropdown', topbar).removeClass('not-click'); } // Pad body when sticky (scrolled) or fixed. self.addCustomRule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); if (topbarContainer.hasClass('fixed')) { $('body').addClass('f-topbar-fixed'); } }); }, toggle: function (toggleEl) { var self = this; if (toggleEl) { var topbar = $(toggleEl).closest('[data-topbar]'); } else { var topbar = $('[data-topbar]'); } var settings = topbar.data('topbar-init'); var section = $('section, .section', topbar); if (self.breakpoint()) { if (!self.rtl) { section.css({left: '0%'}); $('>.name', section).css({left: '100%'}); } else { section.css({right: '0%'}); $('>.name', section).css({right: '100%'}); } $('li.moved', section).removeClass('moved'); topbar.data('index', 0); topbar .toggleClass('expanded') .css('height', ''); } if (settings.scrolltop) { if (!topbar.hasClass('expanded')) { if (topbar.hasClass('fixed')) { topbar.parent().addClass('fixed'); topbar.removeClass('fixed'); $('body').addClass('f-topbar-fixed'); } } else if (topbar.parent().hasClass('fixed')) { if (settings.scrolltop) { topbar.parent().removeClass('fixed'); topbar.addClass('fixed'); $('body').removeClass('f-topbar-fixed'); window.scrollTo(0,0); } else { topbar.parent().removeClass('expanded'); } } } else { if(topbar.parent().hasClass(self.settings.sticky_class)) { topbar.parent().addClass('fixed'); } if(topbar.parent().hasClass('fixed')) { if (!topbar.hasClass('expanded')) { topbar.removeClass('fixed'); topbar.parent().removeClass('expanded'); self.update_sticky_positioning(); } else { topbar.addClass('fixed'); topbar.parent().addClass('expanded'); } } } }, timer : null, events : function (bar) { var self = this; $(this.scope) .off('.topbar') .on('click.fndtn.topbar', '[data-topbar] .toggle-topbar', function (e) { e.preventDefault(); self.toggle(this); }) .on('click.fndtn.topbar', '[data-topbar] li.has-dropdown', function (e) { var li = $(this), target = $(e.target), topbar = li.closest('[data-topbar]'), settings = topbar.data('topbar-init'); if(target.data('revealId')) { self.toggle(); return; } if (self.breakpoint()) return; if (settings.is_hover && !Modernizr.touch) return; e.stopImmediatePropagation(); if (li.hasClass('hover')) { li .removeClass('hover') .find('li') .removeClass('hover'); li.parents('li.hover') .removeClass('hover'); } else { li.addClass('hover'); if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { e.preventDefault(); } } }) .on('click.fndtn.topbar', '[data-topbar] .has-dropdown>a', function (e) { if (self.breakpoint()) { e.preventDefault(); var $this = $(this), topbar = $this.closest('[data-topbar]'), section = topbar.find('section, .section'), dropdownHeight = $this.next('.dropdown').outerHeight(), $selectedLi = $this.closest('li'); topbar.data('index', topbar.data('index') + 1); $selectedLi.addClass('moved'); if (!self.rtl) { section.css({left: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); } else { section.css({right: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); } topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height')); } }); $(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () { self.resize.call(self); }, 50)).trigger('resize'); $('body').off('.topbar').on('click.fndtn.topbar touchstart.fndtn.topbar', function (e) { var parent = $(e.target).closest('li').closest('li.hover'); if (parent.length > 0) { return; } $('[data-topbar] li').removeClass('hover'); }); // Go up a level on Click $(this.scope).on('click.fndtn.topbar', '[data-topbar] .has-dropdown .back', function (e) { e.preventDefault(); var $this = $(this), topbar = $this.closest('[data-topbar]'), section = topbar.find('section, .section'), settings = topbar.data('topbar-init'), $movedLi = $this.closest('li.moved'), $previousLevelUl = $movedLi.parent(); topbar.data('index', topbar.data('index') - 1); if (!self.rtl) { section.css({left: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); } else { section.css({right: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); } if (topbar.data('index') === 0) { topbar.css('height', ''); } else { topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height')); } setTimeout(function () { $movedLi.removeClass('moved'); }, 300); }); }, resize : function () { var self = this; $('[data-topbar]').each(function () { var topbar = $(this), settings = topbar.data('topbar-init'); var stickyContainer = topbar.parent('.' + self.settings.sticky_class); var stickyOffset; if (!self.breakpoint()) { var doToggle = topbar.hasClass('expanded'); topbar .css('height', '') .removeClass('expanded') .find('li') .removeClass('hover'); if(doToggle) { self.toggle(topbar); } } if(stickyContainer.length > 0) { if(stickyContainer.hasClass('fixed')) { // Remove the fixed to allow for correct calculation of the offset. stickyContainer.removeClass('fixed'); stickyOffset = stickyContainer.offset().top; if($(document.body).hasClass('f-topbar-fixed')) { stickyOffset -= topbar.data('height'); } topbar.data('stickyoffset', stickyOffset); stickyContainer.addClass('fixed'); } else { stickyOffset = stickyContainer.offset().top; topbar.data('stickyoffset', stickyOffset); } } }); }, breakpoint : function () { return !matchMedia(Foundation.media_queries['topbar']).matches; }, assemble : function (topbar) { var self = this, settings = topbar.data('topbar-init'), section = $('section', topbar), titlebar = $('> ul', topbar).first(); // Pull element out of the DOM for manipulation section.detach(); $('.has-dropdown>a', section).each(function () { var $link = $(this), $dropdown = $link.siblings('.dropdown'), url = $link.attr('href'); if (settings.mobile_show_parent_link && url && url.length > 1) { var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li><li><a class="parent-link js-generated" href="' + url + '">' + $link.text() +'</a></li>'); } else { var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>'); } // Copy link to subnav if (settings.custom_back_text == true) { $('h5>a', $titleLi).html(settings.back_text); } else { $('h5>a', $titleLi).html('« ' + $link.html()); } $dropdown.prepend($titleLi); }); // Put element back in the DOM section.appendTo(topbar); // check for sticky this.sticky(); this.assembled(topbar); }, assembled : function (topbar) { topbar.data('topbar-init', $.extend({}, topbar.data('topbar-init'), {assembled: true})); }, height : function (ul) { var total = 0, self = this; $('> li', ul).each(function () { total += $(this).outerHeight(true); }); return total; }, sticky : function () { var $window = $(window), self = this; $(window).on('scroll', function() { self.update_sticky_positioning(); }); }, update_sticky_positioning: function() { var klass = '.' + this.settings.sticky_class; var $window = $(window); if ($(klass).length > 0) { var distance = this.settings.sticky_topbar.data('stickyoffset'); if (!$(klass).hasClass('expanded')) { if ($window.scrollTop() > (distance)) { if (!$(klass).hasClass('fixed')) { $(klass).addClass('fixed'); $('body').addClass('f-topbar-fixed'); } } else if ($window.scrollTop() <= distance) { if ($(klass).hasClass('fixed')) { $(klass).removeClass('fixed'); $('body').removeClass('f-topbar-fixed'); } } } } }, off : function () { $(this.scope).off('.fndtn.topbar'); $(window).off('.fndtn.topbar'); }, reflow : function () {} }; }(jQuery, this, this.document)); /*! * Modernizr v2.7.1 * www.modernizr.com * * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton * Available under the BSD and MIT licenses: www.modernizr.com/license/ */ /* * Modernizr tests which native CSS3 and HTML5 features are available in * the current UA and makes the results available to you in two ways: * as properties on a global Modernizr object, and as classes on the * <html> element. This information allows you to progressively enhance * your pages with a granular level of control over the experience. * * Modernizr has an optional (not included) conditional resource loader * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). * To get a build that includes Modernizr.load(), as well as choosing * which tests to include, go to www.modernizr.com/download/ * * Authors Faruk Ates, Paul Irish, Alex Sexton * Contributors Ryan Seddon, Ben Alman */ window.Modernizr = (function( window, document, undefined ) { var version = '2.7.1', Modernizr = {}, /*>>cssclasses*/ // option for enabling the HTML classes to be added enableClasses = true, /*>>cssclasses*/ docElement = document.documentElement, /** * Create our "modernizr" element that we do most feature tests on. */ mod = 'modernizr', modElem = document.createElement(mod), mStyle = modElem.style, /** * Create the input element for various Web Forms feature tests. */ inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , /*>>smile*/ smile = ':)', /*>>smile*/ toString = {}.toString, // TODO :: make the prefixes more granular /*>>prefixes*/ // List of property values to set for css tests. See ticket #21 prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), /*>>prefixes*/ /*>>domprefixes*/ // Following spec is to expose vendor-specific style properties as: // elem.style.WebkitBorderRadius // and the following would be incorrect: // elem.style.webkitBorderRadius // Webkit ghosts their properties in lowercase but Opera & Moz do not. // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ // erik.eae.net/archives/2008/03/10/21.48.10/ // More here: github.com/Modernizr/Modernizr/issues/issue/21 omPrefixes = 'Webkit Moz O ms', cssomPrefixes = omPrefixes.split(' '), domPrefixes = omPrefixes.toLowerCase().split(' '), /*>>domprefixes*/ /*>>ns*/ ns = {'svg': 'http://www.w3.org/2000/svg'}, /*>>ns*/ tests = {}, inputs = {}, attrs = {}, classes = [], slice = classes.slice, featureName, // used in testing loop /*>>teststyles*/ // Inject element with style element and some CSS rules injectElementWithStyles = function( rule, callback, nodes, testnames ) { var style, ret, node, docOverflow, div = document.createElement('div'), // After page load injecting a fake body doesn't work so check if body exists body = document.body, // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. fakeBody = body || document.createElement('body'); if ( parseInt(nodes, 10) ) { // In order not to give false positives we create a node for each test // This also allows the method to scale for unspecified uses while ( nodes-- ) { node = document.createElement('div'); node.id = testnames ? testnames[nodes] : mod + (nodes + 1); div.appendChild(node); } } // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements. // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx // Documents served as xml will throw if using ­ so use xml friendly encoded version. See issue #277 style = ['­','<style id="s', mod, '">', rule, '</style>'].join(''); div.id = mod; // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 (body ? div : fakeBody).innerHTML += style; fakeBody.appendChild(div); if ( !body ) { //avoid crashing IE8, if background image is used fakeBody.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible fakeBody.style.overflow = 'hidden'; docOverflow = docElement.style.overflow; docElement.style.overflow = 'hidden'; docElement.appendChild(fakeBody); } ret = callback(div, rule); // If this is done after page load we don't want to remove the body so check if body exists if ( !body ) { fakeBody.parentNode.removeChild(fakeBody); docElement.style.overflow = docOverflow; } else { div.parentNode.removeChild(div); } return !!ret; }, /*>>teststyles*/ /*>>mq*/ // adapted from matchMedia polyfill // by Scott Jehl and Paul Irish // gist.github.com/786768 testMediaQuery = function( mq ) { var matchMedia = window.matchMedia || window.msMatchMedia; if ( matchMedia ) { return matchMedia(mq).matches; } var bool; injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { bool = (window.getComputedStyle ? getComputedStyle(node, null) : node.currentStyle)['position'] == 'absolute'; }); return bool; }, /*>>mq*/ /*>>hasevent*/ // // isEventSupported determines if a given element supports the given event // kangax.github.com/iseventsupported/ // // The following results are known incorrects: // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 // ... isEventSupported = (function() { var TAGNAMES = { 'select': 'input', 'change': 'input', 'submit': 'form', 'reset': 'form', 'error': 'img', 'load': 'img', 'abort': 'img' }; function isEventSupported( eventName, element ) { element = element || document.createElement(TAGNAMES[eventName] || 'div'); eventName = 'on' + eventName; // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those var isSupported = eventName in element; if ( !isSupported ) { // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element if ( !element.setAttribute ) { element = document.createElement('div'); } if ( element.setAttribute && element.removeAttribute ) { element.setAttribute(eventName, ''); isSupported = is(element[eventName], 'function'); // If property was created, "remove it" (by setting value to `undefined`) if ( !is(element[eventName], 'undefined') ) { element[eventName] = undefined; } element.removeAttribute(eventName); } } element = null; return isSupported; } return isEventSupported; })(), /*>>hasevent*/ // TODO :: Add flag for hasownprop ? didn't last time // hasOwnProperty shim by kangax needed for Safari 2.0 support _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { hasOwnProp = function (object, property) { return _hasOwnProperty.call(object, property); }; } else { hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ return ((property in object) && is(object.constructor.prototype[property], 'undefined')); }; } // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js // es5.github.com/#x15.3.4.5 if (!Function.prototype.bind) { Function.prototype.bind = function bind(that) { var target = this; if (typeof target != "function") { throw new TypeError(); } var args = slice.call(arguments, 1), bound = function () { if (this instanceof bound) { var F = function(){}; F.prototype = target.prototype; var self = new F(); var result = target.apply( self, args.concat(slice.call(arguments)) ); if (Object(result) === result) { return result; } return self; } else { return target.apply( that, args.concat(slice.call(arguments)) ); } }; return bound; }; } /** * setCss applies given styles to the Modernizr DOM node. */ function setCss( str ) { mStyle.cssText = str; } /** * setCssAll extrapolates all vendor-specific css strings. */ function setCssAll( str1, str2 ) { return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); } /** * is returns a boolean for if typeof obj is exactly type. */ function is( obj, type ) { return typeof obj === type; } /** * contains returns a boolean for if substr is found within str. */ function contains( str, substr ) { return !!~('' + str).indexOf(substr); } /*>>testprop*/ // testProps is a generic CSS / DOM property test. // In testing support for a given CSS property, it's legit to test: // `elem.style[styleName] !== undefined` // If the property is supported it will return an empty string, // if unsupported it will return undefined. // We'll take advantage of this quick test and skip setting a style // on our modernizr element, but instead just testing undefined vs // empty string. // Because the testing of the CSS property names (with "-", as // opposed to the camelCase DOM properties) is non-portable and // non-standard but works in WebKit and IE (but not Gecko or Opera), // we explicitly reject properties with dashes so that authors // developing in WebKit or IE first don't end up with // browser-specific content by accident. function testProps( props, prefixed ) { for ( var i in props ) { var prop = props[i]; if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { return prefixed == 'pfx' ? prop : true; } } return false; } /*>>testprop*/ // TODO :: add testDOMProps /** * testDOMProps is a generic DOM property test; if a browser supports * a certain property, it won't return undefined for it. */ function testDOMProps( props, obj, elem ) { for ( var i in props ) { var item = obj[props[i]]; if ( item !== undefined) { // return the property name as a string if (elem === false) return props[i]; // let's bind a function if (is(item, 'function')){ // default to autobind unless override return item.bind(elem || obj); } // return the unbound function or obj or value return item; } } return false; } /*>>testallprops*/ /** * testPropsAll tests a list of DOM properties we want to check against. * We specify literally ALL possible (known and/or likely) properties on * the element including the non-vendor prefixed one, for forward- * compatibility. */ function testPropsAll( prop, prefixed, elem ) { var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); // did they call .prefixed('boxSizing') or are we just testing a prop? if(is(prefixed, "string") || is(prefixed, "undefined")) { return testProps(props, prefixed); // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) } else { props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); return testDOMProps(props, prefixed, elem); } } /*>>testallprops*/ /** * Tests * ----- */ // The *new* flexbox // dev.w3.org/csswg/css3-flexbox tests['flexbox'] = function() { return testPropsAll('flexWrap'); }; // The *old* flexbox // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ tests['flexboxlegacy'] = function() { return testPropsAll('boxDirection'); }; // On the S60 and BB Storm, getContext exists, but always returns undefined // so we actually have to call getContext() to verify // github.com/Modernizr/Modernizr/issues/issue/97/ tests['canvas'] = function() { var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }; tests['canvastext'] = function() { return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); }; // webk.it/70117 is tracking a legit WebGL feature detect proposal // We do a soft detect which may false positive in order to avoid // an expensive context creation: bugzil.la/732441 tests['webgl'] = function() { return !!window.WebGLRenderingContext; }; /* * The Modernizr.touch test only indicates if the browser supports * touch events, which does not necessarily reflect a touchscreen * device, as evidenced by tablets running Windows 7 or, alas, * the Palm Pre / WebOS (touch) phones. * * Additionally, Chrome (desktop) used to lie about its support on this, * but that has since been rectified: crbug.com/36415 * * We also test for Firefox 4 Multitouch Support. * * For more info, see: modernizr.github.com/Modernizr/touch.html */ tests['touch'] = function() { var bool; if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { bool = true; } else { injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { bool = node.offsetTop === 9; }); } return bool; }; // geolocation is often considered a trivial feature detect... // Turns out, it's quite tricky to get right: // // Using !!navigator.geolocation does two things we don't want. It: // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 // 2. Disables page caching in WebKit: webk.it/43956 // // Meanwhile, in Firefox < 8, an about:config setting could expose // a false positive that would throw an exception: bugzil.la/688158 tests['geolocation'] = function() { return 'geolocation' in navigator; }; tests['postmessage'] = function() { return !!window.postMessage; }; // Chrome incognito mode used to throw an exception when using openDatabase // It doesn't anymore. tests['websqldatabase'] = function() { return !!window.openDatabase; }; // Vendors had inconsistent prefixing with the experimental Indexed DB: // - Webkit's implementation is accessible through webkitIndexedDB // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB // For speed, we don't test the legacy (and beta-only) indexedDB tests['indexedDB'] = function() { return !!testPropsAll("indexedDB", window); }; // documentMode logic from YUI to filter out IE8 Compat Mode // which false positives. tests['hashchange'] = function() { return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); }; // Per 1.6: // This used to be Modernizr.historymanagement but the longer // name has been deprecated in favor of a shorter and property-matching one. // The old API is still available in 1.6, but as of 2.0 will throw a warning, // and in the first release thereafter disappear entirely. tests['history'] = function() { return !!(window.history && history.pushState); }; tests['draganddrop'] = function() { var div = document.createElement('div'); return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); }; // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. // FF10 still uses prefixes, so check for it until then. // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ tests['websockets'] = function() { return 'WebSocket' in window || 'MozWebSocket' in window; }; // css-tricks.com/rgba-browser-support/ tests['rgba'] = function() { // Set an rgba() color and check the returned value setCss('background-color:rgba(150,255,150,.5)'); return contains(mStyle.backgroundColor, 'rgba'); }; tests['hsla'] = function() { // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, // except IE9 who retains it as hsla setCss('background-color:hsla(120,40%,100%,.5)'); return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); }; tests['multiplebgs'] = function() { // Setting multiple images AND a color on the background shorthand property // and then querying the style.background property value for the number of // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! setCss('background:url(https://),url(https://),red url(https://)'); // If the UA supports multiple backgrounds, there should be three occurrences // of the string "url(" in the return value for elemStyle.background return (/(url\s*\(.*?){3}/).test(mStyle.background); }; // this will false positive in Opera Mini // github.com/Modernizr/Modernizr/issues/396 tests['backgroundsize'] = function() { return testPropsAll('backgroundSize'); }; tests['borderimage'] = function() { return testPropsAll('borderImage'); }; // Super comprehensive table about all the unique implementations of // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance tests['borderradius'] = function() { return testPropsAll('borderRadius'); }; // WebOS unfortunately false positives on this test. tests['boxshadow'] = function() { return testPropsAll('boxShadow'); }; // FF3.0 will false positive on this test tests['textshadow'] = function() { return document.createElement('div').style.textShadow === ''; }; tests['opacity'] = function() { // Browsers that actually have CSS Opacity implemented have done so // according to spec, which means their return values are within the // range of [0.0,1.0] - including the leading zero. setCssAll('opacity:.55'); // The non-literal . in this regex is intentional: // German Chrome returns this value as 0,55 // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 return (/^0.55$/).test(mStyle.opacity); }; // Note, Android < 4 will pass this test, but can only animate // a single property at a time // daneden.me/2011/12/putting-up-with-androids-bullshit/ tests['cssanimations'] = function() { return testPropsAll('animationName'); }; tests['csscolumns'] = function() { return testPropsAll('columnCount'); }; tests['cssgradients'] = function() { /** * For CSS Gradients syntax, please see: * webkit.org/blog/175/introducing-css-gradients/ * developer.mozilla.org/en/CSS/-moz-linear-gradient * developer.mozilla.org/en/CSS/-moz-radial-gradient * dev.w3.org/csswg/css3-images/#gradients- */ var str1 = 'background-image:', str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', str3 = 'linear-gradient(left top,#9f9, white);'; setCss( // legacy webkit syntax (FIXME: remove when syntax not in use anymore) (str1 + '-webkit- '.split(' ').join(str2 + str1) + // standard syntax // trailing 'background-image:' prefixes.join(str3 + str1)).slice(0, -str1.length) ); return contains(mStyle.backgroundImage, 'gradient'); }; tests['cssreflections'] = function() { return testPropsAll('boxReflect'); }; tests['csstransforms'] = function() { return !!testPropsAll('transform'); }; tests['csstransforms3d'] = function() { var ret = !!testPropsAll('perspective'); // Webkit's 3D transforms are passed off to the browser's own graphics renderer. // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in // some conditions. As a result, Webkit typically recognizes the syntax but // will sometimes throw a false positive, thus we must do a more thorough check: if ( ret && 'webkitPerspective' in docElement.style ) { // Webkit allows this media query to succeed only if the feature is enabled. // `@media (transform-3d),(-webkit-transform-3d){ ... }` injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { ret = node.offsetLeft === 9 && node.offsetHeight === 3; }); } return ret; }; tests['csstransitions'] = function() { return testPropsAll('transition'); }; /*>>fontface*/ // @font-face detection routine by Diego Perini // javascript.nwbox.com/CSSSupport/ // false positives: // WebOS github.com/Modernizr/Modernizr/issues/342 // WP7 github.com/Modernizr/Modernizr/issues/538 tests['fontface'] = function() { var bool; injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { var style = document.getElementById('smodernizr'), sheet = style.sheet || style.styleSheet, cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; }); return bool; }; /*>>fontface*/ // CSS generated content detection tests['generatedcontent'] = function() { var bool; injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { bool = node.offsetHeight >= 3; }); return bool; }; // These tests evaluate support of the video/audio elements, as well as // testing what types of content they support. // // We're using the Boolean constructor here, so that we can extend the value // e.g. Modernizr.video // true // Modernizr.video.ogg // 'probably' // // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 // thx to NielsLeenheer and zcorpan // Note: in some older browsers, "no" was a return value instead of empty string. // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 tests['video'] = function() { var elem = document.createElement('video'), bool = false; // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 try { if ( bool = !!elem.canPlayType ) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); } } catch(e) { } return bool; }; tests['audio'] = function() { var elem = document.createElement('audio'), bool = false; try { if ( bool = !!elem.canPlayType ) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); // Mimetypes accepted: // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements // bit.ly/iphoneoscodecs bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); bool.m4a = ( elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;')) .replace(/^no$/,''); } } catch(e) { } return bool; }; // In FF4, if disabled, window.localStorage should === null. // Normally, we could not test that directly and need to do a // `('localStorage' in window) && ` test first because otherwise Firefox will // throw bugzil.la/365772 if cookies are disabled // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem // will throw the exception: // QUOTA_EXCEEDED_ERRROR DOM Exception 22. // Peculiarly, getItem and removeItem calls do not throw. // Because we are forced to try/catch this, we'll go aggressive. // Just FWIW: IE8 Compat mode supports these features completely: // www.quirksmode.org/dom/html5.html // But IE8 doesn't support either with local files tests['localstorage'] = function() { try { localStorage.setItem(mod, mod); localStorage.removeItem(mod); return true; } catch(e) { return false; } }; tests['sessionstorage'] = function() { try { sessionStorage.setItem(mod, mod); sessionStorage.removeItem(mod); return true; } catch(e) { return false; } }; tests['webworkers'] = function() { return !!window.Worker; }; tests['applicationcache'] = function() { return !!window.applicationCache; }; // Thanks to Erik Dahlstrom tests['svg'] = function() { return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; }; // specifically for SVG inline in HTML, not within XHTML // test page: paulirish.com/demo/inline-svg tests['inlinesvg'] = function() { var div = document.createElement('div'); div.innerHTML = '<svg/>'; return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; }; // SVG SMIL animation tests['smil'] = function() { return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); }; // This test is only for clip paths in SVG proper, not clip paths on HTML content // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg // However read the comments to dig into applying SVG clippaths to HTML content here: // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 tests['svgclippaths'] = function() { return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); }; /*>>webforms*/ // input features and input types go directly onto the ret object, bypassing the tests loop. // Hold this guy to execute in a moment. function webforms() { /*>>input*/ // Run through HTML5's new input attributes to see if the UA understands any. // We're using f which is the <input> element created early on // Mike Taylr has created a comprehensive resource for testing these attributes // when applied to all input types: // miketaylr.com/code/input-type-attr.html // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary // Only input placeholder is tested while textarea's placeholder is not. // Currently Safari 4 and Opera 11 have support only for the input placeholder // Both tests are available in feature-detects/forms-placeholder.js Modernizr['input'] = (function( props ) { for ( var i = 0, len = props.length; i < len; i++ ) { attrs[ props[i] ] = !!(props[i] in inputElem); } if (attrs.list){ // safari false positive's on datalist: webk.it/74252 // see also github.com/Modernizr/Modernizr/issues/146 attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); } return attrs; })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); /*>>input*/ /*>>inputtypes*/ // Run through HTML5's new input types to see if the UA understands any. // This is put behind the tests runloop because it doesn't return a // true/false like all the other tests; instead, it returns an object // containing each input type with its corresponding true/false value // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ Modernizr['inputtypes'] = (function(props) { for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { inputElem.setAttribute('type', inputElemType = props[i]); bool = inputElem.type !== 'text'; // We first check to see if the type we give it sticks.. // If the type does, we feed it a textual value, which shouldn't be valid. // If the value doesn't stick, we know there's input sanitization which infers a custom UI if ( bool ) { inputElem.value = smile; inputElem.style.cssText = 'position:absolute;visibility:hidden;'; if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { docElement.appendChild(inputElem); defaultView = document.defaultView; // Safari 2-4 allows the smiley as a value, despite making a slider bool = defaultView.getComputedStyle && defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && // Mobile android web browser has false positive, so must // check the height to see if the widget is actually there. (inputElem.offsetHeight !== 0); docElement.removeChild(inputElem); } else if ( /^(search|tel)$/.test(inputElemType) ){ // Spec doesn't define any special parsing or detectable UI // behaviors so we pass these through as true // Interestingly, opera fails the earlier test, so it doesn't // even make it here. } else if ( /^(url|email)$/.test(inputElemType) ) { // Real url and email support comes with prebaked validation. bool = inputElem.checkValidity && inputElem.checkValidity() === false; } else { // If the upgraded input compontent rejects the :) text, we got a winner bool = inputElem.value != smile; } } inputs[ props[i] ] = !!bool; } return inputs; })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); /*>>inputtypes*/ } /*>>webforms*/ // End of test definitions // ----------------------- // Run through all tests and detect their support in the current UA. // todo: hypothetically we could be doing an array of tests and use a basic loop here. for ( var feature in tests ) { if ( hasOwnProp(tests, feature) ) { // run the test, throw the return value into the Modernizr, // then based on that boolean, define an appropriate className // and push it into an array of classes we'll join later. featureName = feature.toLowerCase(); Modernizr[featureName] = tests[feature](); classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); } } /*>>webforms*/ // input tests need to run. Modernizr.input || webforms(); /*>>webforms*/ /** * addTest allows the user to define their own feature tests * the result will be added onto the Modernizr object, * as well as an appropriate className set on the html element * * @param feature - String naming the feature * @param test - Function returning true if feature is supported, false if not */ Modernizr.addTest = function ( feature, test ) { if ( typeof feature == 'object' ) { for ( var key in feature ) { if ( hasOwnProp( feature, key ) ) { Modernizr.addTest( key, feature[ key ] ); } } } else { feature = feature.toLowerCase(); if ( Modernizr[feature] !== undefined ) { // we're going to quit if you're trying to overwrite an existing test // if we were to allow it, we'd do this: // var re = new RegExp("\\b(no-)?" + feature + "\\b"); // docElement.className = docElement.className.replace( re, '' ); // but, no rly, stuff 'em. return Modernizr; } test = typeof test == 'function' ? test() : test; if (typeof enableClasses !== "undefined" && enableClasses) { docElement.className += ' ' + (test ? '' : 'no-') + feature; } Modernizr[feature] = test; } return Modernizr; // allow chaining. }; // Reset modElem.cssText to nothing to reduce memory footprint. setCss(''); modElem = inputElem = null; /*>>shiv*/ /** * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ ;(function(window, document) { /*jshint evil:true */ /** version */ var version = '3.7.0'; /** Preset options */ var options = window.html5 || {}; /** Used to skip problem elements */ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; /** Not all elements can be cloned in IE **/ var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; /** Detect whether the browser supports default html5 styles */ var supportsHtml5Styles; /** Name of the expando, to work with multiple documents or to re-shiv one document */ var expando = '_html5shiv'; /** The id for the the documents expando */ var expanID = 0; /** Cached data for each document */ var expandoData = {}; /** Detect whether the browser supports unknown elements */ var supportsUnknownElements; (function() { try { var a = document.createElement('a'); a.innerHTML = '<xyz></xyz>'; //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles supportsHtml5Styles = ('hidden' in a); supportsUnknownElements = a.childNodes.length == 1 || (function() { // assign a false positive if unable to shiv (document.createElement)('a'); var frag = document.createDocumentFragment(); return ( typeof frag.cloneNode == 'undefined' || typeof frag.createDocumentFragment == 'undefined' || typeof frag.createElement == 'undefined' ); }()); } catch(e) { // assign a false positive if detection fails => unable to shiv supportsHtml5Styles = true; supportsUnknownElements = true; } }()); /*--------------------------------------------------------------------------*/ /** * Creates a style sheet with the given CSS text and adds it to the document. * @private * @param {Document} ownerDocument The document. * @param {String} cssText The CSS text. * @returns {StyleSheet} The style element. */ function addStyleSheet(ownerDocument, cssText) { var p = ownerDocument.createElement('p'), parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; p.innerHTML = 'x<style>' + cssText + '</style>'; return parent.insertBefore(p.lastChild, parent.firstChild); } /** * Returns the value of `html5.elements` as an array. * @private * @returns {Array} An array of shived element node names. */ function getElements() { var elements = html5.elements; return typeof elements == 'string' ? elements.split(' ') : elements; } /** * Returns the data associated to the given document * @private * @param {Document} ownerDocument The document. * @returns {Object} An object of data. */ function getExpandoData(ownerDocument) { var data = expandoData[ownerDocument[expando]]; if (!data) { data = {}; expanID++; ownerDocument[expando] = expanID; expandoData[expanID] = data; } return data; } /** * returns a shived element for the given nodeName and document * @memberOf html5 * @param {String} nodeName name of the element * @param {Document} ownerDocument The context document. * @returns {Object} The shived element. */ function createElement(nodeName, ownerDocument, data){ if (!ownerDocument) { ownerDocument = document; } if(supportsUnknownElements){ return ownerDocument.createElement(nodeName); } if (!data) { data = getExpandoData(ownerDocument); } var node; if (data.cache[nodeName]) { node = data.cache[nodeName].cloneNode(); } else if (saveClones.test(nodeName)) { node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); } else { node = data.createElem(nodeName); } // Avoid adding some elements to fragments in IE < 9 because // * Attributes like `name` or `type` cannot be set/changed once an element // is inserted into a document/fragment // * Link elements with `src` attributes that are inaccessible, as with // a 403 response, will cause the tab/window to crash // * Script elements appended to fragments will execute when their `src` // or `text` property is set return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; } /** * returns a shived DocumentFragment for the given document * @memberOf html5 * @param {Document} ownerDocument The context document. * @returns {Object} The shived DocumentFragment. */ function createDocumentFragment(ownerDocument, data){ if (!ownerDocument) { ownerDocument = document; } if(supportsUnknownElements){ return ownerDocument.createDocumentFragment(); } data = data || getExpandoData(ownerDocument); var clone = data.frag.cloneNode(), i = 0, elems = getElements(), l = elems.length; for(;i<l;i++){ clone.createElement(elems[i]); } return clone; } /** * Shivs the `createElement` and `createDocumentFragment` methods of the document. * @private * @param {Document|DocumentFragment} ownerDocument The document. * @param {Object} data of the document. */ function shivMethods(ownerDocument, data) { if (!data.cache) { data.cache = {}; data.createElem = ownerDocument.createElement; data.createFrag = ownerDocument.createDocumentFragment; data.frag = data.createFrag(); } ownerDocument.createElement = function(nodeName) { //abort shiv if (!html5.shivMethods) { return data.createElem(nodeName); } return createElement(nodeName, ownerDocument, data); }; ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' + 'var n=f.cloneNode(),c=n.createElement;' + 'h.shivMethods&&(' + // unroll the `createElement` calls getElements().join().replace(/[\w\-]+/g, function(nodeName) { data.createElem(nodeName); data.frag.createElement(nodeName); return 'c("' + nodeName + '")'; }) + ');return n}' )(html5, data.frag); } /*--------------------------------------------------------------------------*/ /** * Shivs the given document. * @memberOf html5 * @param {Document} ownerDocument The document to shiv. * @returns {Document} The shived document. */ function shivDocument(ownerDocument) { if (!ownerDocument) { ownerDocument = document; } var data = getExpandoData(ownerDocument); if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) { data.hasCSS = !!addStyleSheet(ownerDocument, // corrects block display not defined in IE6/7/8/9 'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' + // adds styling not present in IE6/7/8/9 'mark{background:#FF0;color:#000}' + // hides non-rendered elements 'template{display:none}' ); } if (!supportsUnknownElements) { shivMethods(ownerDocument, data); } return ownerDocument; } /*--------------------------------------------------------------------------*/ /** * The `html5` object is exposed so that more elements can be shived and * existing shiving can be detected on iframes. * @type Object * @example * * // options can be changed before the script is included * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false }; */ var html5 = { /** * An array or space separated string of node names of the elements to shiv. * @memberOf html5 * @type Array|String */ 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video', /** * current version of html5shiv */ 'version': version, /** * A flag to indicate that the HTML5 style sheet should be inserted. * @memberOf html5 * @type Boolean */ 'shivCSS': (options.shivCSS !== false), /** * Is equal to true if a browser supports creating unknown/HTML5 elements * @memberOf html5 * @type boolean */ 'supportsUnknownElements': supportsUnknownElements, /** * A flag to indicate that the document's `createElement` and `createDocumentFragment` * methods should be overwritten. * @memberOf html5 * @type Boolean */ 'shivMethods': (options.shivMethods !== false), /** * A string to describe the type of `html5` object ("default" or "default print"). * @memberOf html5 * @type String */ 'type': 'default', // shivs the document according to the specified `html5` object options 'shivDocument': shivDocument, //creates a shived element createElement: createElement, //creates a shived documentFragment createDocumentFragment: createDocumentFragment }; /*--------------------------------------------------------------------------*/ // expose html5 window.html5 = html5; // shiv the document shivDocument(document); }(this, document)); /*>>shiv*/ // Assign private properties to the return object with prefix Modernizr._version = version; // expose these for the plugin API. Look in the source for how to join() them against your input /*>>prefixes*/ Modernizr._prefixes = prefixes; /*>>prefixes*/ /*>>domprefixes*/ Modernizr._domPrefixes = domPrefixes; Modernizr._cssomPrefixes = cssomPrefixes; /*>>domprefixes*/ /*>>mq*/ // Modernizr.mq tests a given media query, live against the current state of the window // A few important notes: // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false // * A max-width or orientation query will be evaluated against the current state, which may change later. // * You must specify values. Eg. If you are testing support for the min-width media query use: // Modernizr.mq('(min-width:0)') // usage: // Modernizr.mq('only screen and (max-width:768)') Modernizr.mq = testMediaQuery; /*>>mq*/ /*>>hasevent*/ // Modernizr.hasEvent() detects support for a given event, with an optional element to test on // Modernizr.hasEvent('gesturestart', elem) Modernizr.hasEvent = isEventSupported; /*>>hasevent*/ /*>>testprop*/ // Modernizr.testProp() investigates whether a given style property is recognized // Note that the property names must be provided in the camelCase variant. // Modernizr.testProp('pointerEvents') Modernizr.testProp = function(prop){ return testProps([prop]); }; /*>>testprop*/ /*>>testallprops*/ // Modernizr.testAllProps() investigates whether a given style property, // or any of its vendor-prefixed variants, is recognized // Note that the property names must be provided in the camelCase variant. // Modernizr.testAllProps('boxSizing') Modernizr.testAllProps = testPropsAll; /*>>testallprops*/ /*>>teststyles*/ // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) Modernizr.testStyles = injectElementWithStyles; /*>>teststyles*/ /*>>prefixed*/ // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: // // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); // If you're trying to ascertain which transition end event to bind to, you might do something like... // // var transEndEventNames = { // 'WebkitTransition' : 'webkitTransitionEnd', // 'MozTransition' : 'transitionend', // 'OTransition' : 'oTransitionEnd', // 'msTransition' : 'MSTransitionEnd', // 'transition' : 'transitionend' // }, // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; Modernizr.prefixed = function(prop, obj, elem){ if(!obj) { return testPropsAll(prop, 'pfx'); } else { // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' return testPropsAll(prop, obj, elem); } }; /*>>prefixed*/ /*>>cssclasses*/ // Remove "no-js" class from <html> element, if it exists: docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + // Add the new classes to the <html> element. (enableClasses ? ' js ' + classes.join(' ') : ''); /*>>cssclasses*/ return Modernizr; })(this, this.document); $(document).foundation(); // tweet it form $('form#tweet').submit(function(event) { window.open($(this).attr('action') + '?' + $(this).serialize(), '_blank', 'scrollbars=no,menubar=no,height=400,width=500,resizable=yes,toolbar=no,status=no'); event.preventDefault(); }); // substitute @2x images where available if (window.isRetina()) { console.log("loading retina images.."); var replacement; $('img[data-2x]').each(function(i, img) { replacement = $(img).clone().attr('src', $(img).data('2x')) || img; // only replace once the replacement is loaded replacement.load(function() { $(img).replaceWith($(this)); }); }); } if (window.isLinux64) { $('a[data-x64-href]').each(function(i) { $(this).attr('href', $(this).data('x64-href')); }); } $('a[data-delayed-href]').click(function(event) { window.open($(this).data('delayed-href'), '_blank'); window.location = $(this).attr('href'); event.preventDefault(); }); // FAQ accordions var panels = $('dl.accordion > dd').hide(); var draws = $('dl.accordion > dt').css('cursor', 'pointer'); draws.click(function() { panels.slideUp(); var next = $(this).next() if (next.is(':hidden')) next.slideDown(); return false; }); // Show section if anchor provided var anchor = window.location.hash; if(anchor !== ''){ $('dl.accordion > dd' + anchor).show(); } }); function truncate(text, length) { length = length || 100; return $.trim(strip(text)).substring(0, length).trim(this) + "..."; } function strip(html) { var tmp = document.createElement("DIV"); tmp.innerHTML = html; return tmp.textContent || tmp.innerText || ""; } // Retina detection window.isRetina = function() { var mediaQuery = "(-webkit-min-device-pixel-ratio: 1.5),\ (min--moz-device-pixel-ratio: 1.5),\ (-o-min-device-pixel-ratio: 3/2),\ (min-resolution: 1.5dppx)"; return window.devicePixelRatio > 1 || (window.matchMedia && window.matchMedia(mediaQuery).matches) } // Linux x64 detection window.isLinux64 = function() { return window.navigator.platform.substr(0, 5) == "Linux" && window.navigator.platform.substr(-2,2) == "64"; } ;
Close