1/*! 2 FastClick: polyfill to remove click delays on browsers with touch UIs. 3 4 @version 1.0.6 5 @codingstandard ftlabs-jsv2 6 @copyright The Financial Times Limited [All Rights Reserved] 7 @license MIT License (see LICENSE.txt) 8 https://github.com/ftlabs/fastclick 9*/ 10!function(){"use strict";function t(e,o){function i(t,e){return function(){return t.apply(e,arguments)}}var r;if(o=o||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=o.touchBoundary||10,this.layer=e,this.tapDelay=o.tapDelay||200,this.tapTimeout=o.tapTimeout||700,!t.notNeeded(e)){for(var a=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],c=this,s=0,u=a.length;u>s;s++)c[a[s]]=i(c[a[s]],c);n&&(e.addEventListener("mouseover",this.onMouse,!0),e.addEventListener("mousedown",this.onMouse,!0),e.addEventListener("mouseup",this.onMouse,!0)),e.addEventListener("click",this.onClick,!0),e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1),e.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(e.removeEventListener=function(t,n,o){var i=Node.prototype.removeEventListener;"click"===t?i.call(e,t,n.hijacked||n,o):i.call(e,t,n,o)},e.addEventListener=function(t,n,o){var i=Node.prototype.addEventListener;"click"===t?i.call(e,t,n.hijacked||(n.hijacked=function(t){t.propagationStopped||n(t)}),o):i.call(e,t,n,o)}),"function"==typeof e.onclick&&(r=e.onclick,e.addEventListener("click",function(t){r(t)},!1),e.onclick=null)}}var e=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!e,o=/iP(ad|hone|od)/.test(navigator.userAgent)&&!e,i=o&&/OS 4_\d(_\d)?/.test(navigator.userAgent),r=o&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;t.prototype.needsClick=function(t){switch(t.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(t.disabled)return!0;break;case"input":if(o&&"file"===t.type||t.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(t.className)},t.prototype.needsFocus=function(t){switch(t.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(t.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!t.disabled&&!t.readOnly;default:return/\bneedsfocus\b/.test(t.className)}},t.prototype.sendClick=function(t,e){var n,o;document.activeElement&&document.activeElement!==t&&document.activeElement.blur(),o=e.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(t),!0,!0,window,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,t.dispatchEvent(n)},t.prototype.determineEventType=function(t){return n&&"select"===t.tagName.toLowerCase()?"mousedown":"click"},t.prototype.focus=function(t){var e;o&&t.setSelectionRange&&0!==t.type.indexOf("date")&&"time"!==t.type&&"month"!==t.type?(e=t.value.length,t.setSelectionRange(e,e)):t.focus()},t.prototype.updateScrollParent=function(t){var e,n;if(e=t.fastClickScrollParent,!e||!e.contains(t)){n=t;do{if(n.scrollHeight>n.offsetHeight){e=n,t.fastClickScrollParent=n;break}n=n.parentElement}while(n)}e&&(e.fastClickLastScrollTop=e.scrollTop)},t.prototype.getTargetElementFromEventTarget=function(t){return t.nodeType===Node.TEXT_NODE?t.parentNode:t},t.prototype.onTouchStart=function(t){var e,n,r;if(t.targetTouches.length>1)return!0;if(e=this.getTargetElementFromEventTarget(t.target),n=t.targetTouches[0],o){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!i){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return t.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(e)}}return this.trackingClick=!0,this.trackingClickStart=t.timeStamp,this.targetElement=e,this.touchStartX=n.pageX,this.touchStartY=n.pageY,t.timeStamp-this.lastClickTime<this.tapDelay&&t.preventDefault(),!0},t.prototype.touchHasMoved=function(t){var e=t.changedTouches[0],n=this.touchBoundary;return Math.abs(e.pageX-this.touchStartX)>n||Math.abs(e.pageY-this.touchStartY)>n?!0:!1},t.prototype.onTouchMove=function(t){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(t.target)||this.touchHasMoved(t))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},t.prototype.findControl=function(t){return void 0!==t.control?t.control:t.htmlFor?document.getElementById(t.htmlFor):t.querySelector("button, input
10:not([type=hidden]), keygen, meter, output, progress, select, textarea")},t.prototype.onTouchEnd=function(t){var e,a,c,s,u,l=this.targetElement;if(!this.trackingClick)return!0;if(t.timeStamp-this.lastClickTime<this.tapDelay)return this.cancelNextClick=!0,!0;if(t.timeStamp-this.trackingClickStart>this.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=t.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,r&&(u=t.changedTouches[0],l=document.elementFromPoint(u.pageX-window.pageXOffset,u.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),c=l.tagName.toLowerCase(),"label"===c){if(e=this.findControl(l)){if(this.focus(l),n)return!1;l=e}}else if(this.needsFocus(l))return t.timeStamp-a>100||o&&window.top!==window&&"input"===c?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,t),o&&"select"===c||(this.targetElement=null,t.preventDefault()),!1);return o&&!i&&(s=l.fastClickScrollParent,s&&s.fastClickLastScrollTop!==s.scrollTop)?!0:(this.needsClick(l)||(t.preventDefault(),this.sendClick(l,t)),!1)},t.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},t.prototype.onMouse=function(t){return this.targetElement?t.forwardedTouchEvent?!0:t.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(t.stopImmediatePropagation?t.stopImmediatePropagation():t.propagationStopped=!0,t.stopPropagation(),t.preventDefault(),!1):!0:!0},t.prototype.onClick=function(t){var e;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===t.target.type&&0===t.detail?!0:(e=this.onMouse(t),e||(this.targetElement=null),e)},t.prototype.destroy=function(){var t=this.layer;n&&(t.removeEventListener("mouseover",this.onMouse,!0),t.removeEventListener("mousedown",this.onMouse,!0),t.removeEventListener("mouseup",this.onMouse,!0)),t.removeEventListener("click",this.onClick,!0),t.removeEventListener("touchstart",this.onTouchStart,!1),t.removeEventListener("touchmove",this.onTouchMove,!1),t.removeEventListener("touchend",this.onTouchEnd,!1),t.removeEventListener("touchcancel",this.onTouchCancel,!1)},t.notNeeded=function(t){var e,o,i,r;if("undefined"==typeof window.ontouchstart)return!0;if(o=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(e=document.querySelector("meta[name=viewport]")){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(o>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(i=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),i[1]>=10&&i[2]>=3&&(e=document.querySelector("meta[name=viewport]")))){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===t.style.msTouchAction||"manipulation"===t.style.touchAction?!0:(r=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],r>=27&&(e=document.querySelector("meta[name=viewport]"),e&&(-1!==e.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===t.style.touchAction||"manipulation"===t.style.touchAction?!0:!1)},t.attach=function(e,n){return new t(e,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return t}):"undefined"!=typeof module&&module.exports?(module.exports=t.attach,module.exports.FastClick=t):window.FastClick=t}(); 11; 12/*! 13 * jQuery Smart Banner 14 * Copyright (c) 2012 Arnold Daniels <[email protected]> 15 * Based on 'jQuery Smart Web App Banner' by Kurt Zenisek @ kzeni.com 16 */ 17!function($) { 18 var SmartBanner = function(options) { 19 this.origHtmlMargin = parseFloat($('html').css('margin-top')) // Get the original margin-top of the HTML element so we can take that into account 20 this.options = $.extend({}, $.smartbanner.defaults, options) 21 22 var standalone = navigator.standalone // Check if it's already a standalone web app or running within a webui view of an app (not mobile safari) 23 24if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null) $('html').addClass('iOS'); 25 26 // Detect banner type (iOS or Android) 27 if (this.options.force) { 28 this.type = this.options.force 29 } else if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null) { 30 if (navigator.userAgent.match(/Safari/i) != null && 31 (navigator.userAgent.match(/CriOS/i) != null ||
32 window.Number(navigator.userAgent.substr(navigator.userAgent.indexOf('OS ') + 3, 3).replace('_', '.')) < 6)) this.type = 'ios' // Check webview and native smart banner support (iOS 6+) 33 } else if (navigator.userAgent.match(/Android/i) != null) { 34 this.type = 'android' 35 } 36 37 // Don't show banner if device isn't iOS or Android, website is loaded in app or user dismissed banner 38 if (!this.type || standalone || this.getCookie('sb-closed') || this.getCookie('sb-installed')) { 39 return 40 } 41 42 // Calculate scale 43 this.scale = this.options.scale == 'auto' ? $(window).width() / window.screen.width : this.options.scale 44 if (this.scale < 1) this.scale = 1 45 46 // Get info from meta data 47 var meta = $(this.type=='android' ? 'meta[name="google-play-app"]' : 'meta[name="apple-itunes-app"]') 48 if (meta.length == 0) return 49 50 this.appId = /app-id=([^\s,]+)/.exec(meta.attr('content'))[1] 51 this.title = this.options.title ? this.options.title : meta.data('title') || $('title').text().replace(/\s*[|\-·].*$/, '') 52 this.author = this.options.author ? this.options.author : meta.data('author') || ($('meta[name="author"]').length ? $('meta[name="author"]').attr('content') : window.location.hostname) 53 this.iconUrl = meta.data('icon-url'); 54 this.price = meta.data('price'); 55 56 // Create banner 57 this.create() 58 this.show() 59 this.listen() 60 } 61 62 SmartBanner.prototype = { 63 64 constructor: SmartBanner 65 66 , create: function() { 67 var iconURL 68 , link=(this.options.url ? this.options.url : (this.type=='android' ? 'market://details?id=' : ('https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id')) + this.appId) 69 , price = this.price || this.options.price 70 , inStore = price ? price + ' - ' + (this.type=='android' ? this.options.inGooglePlay : this.options.inAppStore) : '' 71 , gloss=this.options.iconGloss === null ? (this.type=='ios') : this.options.iconGloss 72 73 $('body').append('<div id="smartbanner" class="'+this.type+'"><div class="sb-container"><a href="#" class="sb-close">×</a><span class="sb-icon"></span><div class="sb-info"><strong>'+this.title+'</strong><span>'+this.author+'</span><span>'+inStore+'</span></div><a href="'+link+'" class="sb-button"><span>'+this.options.button+'</span></a></div></div>') 74 75 if (this.options.icon) { 76 iconURL = this.options.icon 77 } else if(this.iconUrl) { 78 iconURL = this.iconUrl; 79 } else if ($('link[rel="apple-touch-icon-precomposed"]').length > 0) { 80 iconURL = $('link[rel="apple-touch-icon-precomposed"]').attr('href') 81 if (this.options.iconGloss === null) gloss = false 82 } else if ($('link[rel="apple-touch-icon"]').length > 0) { 83 iconURL = $('link[rel="apple-touch-icon"]').attr('href') 84 } 85 if (iconURL) { 86 $('#smartbanner .sb-icon').css('background-image','url('+iconURL+')') 87 if (gloss) $('#smartbanner .sb-icon').addClass('gloss') 88 } else{ 89 $('#smartbanner').addClass('no-icon') 90 } 91 92 this.bannerHeight = $('#smartbanner').outerHeight() + 2 93 94 if (this.scale > 1) { 95 $('#smartbanner') 96 .css('top', parseFloat($('#smartbanner').css('top')) * this.scale) 97 .css('height', parseFloat($('#smartbanner').css('height')) * this.scale) 98 $('#smartbanner .sb-container') 99 .css('-webkit-transform', 'scale('+this.scale+')') 100 .css('-msie-transform', 'scale('+this.scale+')') 101 .css('-moz-transform', 'scale('+this.scale+')') 102 .css('width', $(window).width() / this.scale) 103 } 104 } 105 106 , listen: function () { 107 $('#smartbanner .sb-close').on('click',$.proxy(this.close, this)) 108 $('#smartbanner .sb-button').on('click',$.proxy(this.install, this)) 109 } 110 111 , show: function(callback) { 112 $('#smartbanner').stop().animate({top:0},this.options.speedIn).addClass('shown') 113// $('html').animate({marginTop:this.origHtmlMargin+(this.bannerHeight*this.scale)},this.options.speedIn,'swing',callback) 114 $('html').animate({marginTop:this.origHtmlMargin+(this.bannerHeight*this.scale)-38},this.options.speedIn,'swing',callback).addClass('smartbanner'); 115 } 116 117 , hide: function(callback) { 118 $('#smartbanner').stop().animate({top:-1*this.bannerHeight*this.scale},this.options.speedOut).removeClass('shown') 119// $('html').animate({marginTop:this.origHtmlMargin},this.options.speedOut,'swing',callback) 120 $('html').animate({marginTop:this.origHtmlMargin},this.options.speedOut,'swing',callback).removeClass('smartbanner iOS'); 121 } 122 123 , close: function(e) { 124 e.preventDefault() 125 this.hide()
126 this.setCookie('sb-closed','true',this.options.daysHidden) 127 } 128 129 , install: function(e) { 130 this.hide() 131 this.setCookie('sb-installed','true',this.options.daysReminder) 132 } 133 134 , setCookie: function(name, value, exdays) { 135 var exdate = new Date() 136 exdate.setDate(exdate.getDate()+exdays) 137 value=escape(value)+((exdays==null)?'':'; expires='+exdate.toUTCString()) 138 document.cookie=name+'='+value+'; path=/;' 139 } 140 141 , getCookie: function(name) { 142 var i,x,y,ARRcookies = document.cookie.split(";") 143 for(i=0;i<ARRcookies.length;i++) { 144 x = ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")) 145 y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1) 146 x = x.replace(/^\s+|\s+$/g,"") 147 if (x==name) { 148 return unescape(y) 149 } 150 } 151 return null 152 } 153 154 // Demo only 155 , switchType: function() { 156 var that = this 157 158 this.hide(function() { 159 that.type = that.type=='android' ? 'ios' : 'android' 160 var meta = $(that.type=='android' ? 'meta[name="google-play-app"]' : 'meta[name="apple-itunes-app"]').attr('content') 161 that.appId = /app-id=([^\s,]+)/.exec(meta)[1] 162 163 $('#smartbanner').detach() 164 that.create() 165 that.show() 166 }) 167 } 168 } 169 170 $.smartbanner = function(option) { 171 var $window = $(window) 172 , data = $window.data('typeahead') 173 , options = typeof option == 'object' && option 174 if (!data) $window.data('typeahead', (data = new SmartBanner(options))) 175 if (typeof option == 'string') data[option]() 176 } 177 178 // override these globally if you like (they are all optional) 179 $.smartbanner.defaults = { 180 title: null, // What the title of the app should be in the banner (defaults to <title>) 181 author: null, // What the author of the app should be in the banner (defaults to <meta name="author"> or hostname) 182 price: 'FREE', // Price of the app 183 appStoreLanguage: 'us', // Language code for App Store 184 inAppStore: 'On the App Store', // Text of price for iOS 185 inGooglePlay: 'In Google Play', // Text of price for Android 186 icon: null, // The URL of the icon (defaults to <meta name="apple-touch-icon">) 187 iconGloss: null, // Force gloss effect for iOS even for precomposed 188 button: 'VIEW', // Text for the install button 189 url: null, // The URL for the button. Keep null if you want the button to link to the app store. 190 scale: 'auto', // Scale based on viewport size (set to 1 to disable) 191 speedIn: 300, // Show animation speed of the banner 192 speedOut: 400, // Close animation speed of the banner 193 daysHidden: 15, // Duration to hide the banner after being closed (0 = always show banner) 194 daysReminder: 90, // Duration to hide the banner after "VIEW" is clicked *separate from when the close button is clicked* (0 = always show banner) 195 force: null // Choose 'ios' or 'android'. Don't do a browser check, just always show this banner 196 } 197 198 $.smartbanner.Constructor = SmartBanner 199 200}(window.jQuery); 201; 202/*! jquery.cookie v1.4.1 | MIT */ 203!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});; 204/* Add to Homescreen v3.1.1 ~ (c) 2014 Matteo Spinelli ~ @license: http://cubiq.org/license */ 205(function(window,document){var _eventListener="addEventListener"in window;var _DOMReady=false;
205if(document.readyState==="complete"){_DOMReady=true}else if(_eventListener){window.addEventListener("load",loaded,false)}function loaded(){window.removeEventListener("load",loaded,false);_DOMReady=true}var _reSmartURL=/\/ath(\/)?$/;var _reQueryString=/([\?&]ath=[^&]*$|&ath=[^&]*(&))/;var _instance;function ath(options){_instance=_instance||new ath.Class(options);return _instance}ath.intl={de_de:{ios:"Um diese Web-App zum Home-Bildschirm hinzuzufügen, tippen Sie auf %icon und dann <strong>Zum Home-Bildschirm</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},en_us:{ios:"To add this web app to the home screen: tap %icon and then <strong>Add to Home Screen</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},es_es:{ios:"Para añadir esta aplicación web a la pantalla de inicio: pulsa %icon y selecciona <strong>Añadir a pantalla de inicio</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},fr_fr:{ios:"Pour ajouter cette application web sur l'écran d'accueil : Appuyez %icon et sélectionnez <strong>Ajouter sur l'écran d'accueil</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},he_il:{ios:'<span dir="rtl">×××ספת ××פ××קצ×× ×××¡× ×××ת: ×××××¥ ×¢× %icon ××× <strong>××סף ×××¡× ×××ת</strong>.</span>',android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},it_it:{ios:"Per aggiungere questa web app alla schermata iniziale: premi %icon e poi <strong>Aggiungi a Home</strong>.",android:'Per aggiungere questa web app alla schermata iniziale, apri il menu opzioni del browser e premi su <strong>Aggiungi alla homescreen</strong>. <small>Puoi accedere al menu premendo il pulsante hardware delle opzioni se la tua device ne ha uno, oppure premendo l\'icona <span class="ath-action-icon">icon</span> in alto a destra.</small>'},nb_no:{ios:"For Ã¥ installere denne appen pÃ¥ hjem-skjermen: trykk pÃ¥ %icon og deretter <strong>Legg til pÃ¥ Hjem-skjerm</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},pt_br:{ios:"Para adicionar este app à tela de inÃcio: clique %icon e então <strong>Tela de inÃcio</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},pt_pt:{ios:"Para adicionar esta app ao ecrã principal: clique %icon e depois <strong>Ecrã principal</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},nl_nl:{ios:"Om deze webapp op je telefoon te installeren, klik op %icon en dan <strong>Zet in beginscherm</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},sv_se:{ios:"För att lägga till denna webbapplikation pÃ¥ hemskärmen: tryck pÃ¥ %icon och därefter <strong>Lägg till pÃ¥ hemskärmen</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},zh_cn:{ios:"å¦è¦æåºç¨ç¨å¼å è³ä¸»å±å¹,请ç¹å»%icon, ç¶å<strong>å è³ä¸»å±å¹</strong>",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'},zh_tw:{ios:"å¦è¦ææç¨ç¨å¼å è³ä¸»å±å¹, è«é»æ%icon, ç¶å¾<strong>å è³ä¸»å±å¹</strong>.",android:'To add this web app to the home screen open the browser option menu and tap on <strong>Add to homescreen</strong>. <small>The menu can be accessed by pressing the menu hardware button if your device has one, or by tapping the top right menu icon <span class="ath-action-icon">icon</span>.</small>'}};for(var lang in ath.intl){ath.intl[lang.substr(0,2)]=ath.intl[lang]}ath.defaults={appID:"org.cubiq.addtohome",fontSize:15,debug:false,modal:false,mandatory:false,autostart:true,skipFirstVisit:false,startDelay:1,lifespan:15,displayPace:1440,maxDisplayCount:0,icon:true,message:"",validLocation:[],onInit:null,onShow:null,onRemove:null,onAdd:null,onPrivate:null,privateModeOverride:false,detectHomescreen:false};var _ua=window.navigator.userAgent;var _nav=window.navigator;_extend(ath,{hasToken:document.location.hash=="#ath"||_reSmartURL.test(document.location.href)||_reQueryString.test(document.location.search),isRetina:window.devicePixelRatio&&window.devicePixelRatio>1,isIDevice:/iphone|ipod|ipad/i.test(_ua),isMobileChrome:_ua.indexOf("Android")>-1&&/Chrome\/[.0-9]*/.test(_ua),isMobileIE:_ua.indexOf("Windows Phone")>-1,language:_nav.language&&_nav.language.toLowerCase().replace("-","_")||""});ath.language=ath.language&&ath.language in ath.intl?ath.language:"en_us";ath.isMobileSafari=ath.isIDevice&&_ua.indexOf("Safari")>-1&&_ua.indexOf("CriOS")<0;ath.OS=ath.isIDevice?"ios":ath.isMobileChrome?"android":ath.isMobileIE?"windows":"unsupported";ath.OSVersion=_ua.match(/(OS|Android) (\d+[_\.]\d+)/);ath.OSVersion=ath.OSVersion&&ath.OSVersion[2]?+ath.OSVersion[2].replace("_","."):0;ath.isStandalone=window.navigator.standalone||ath.isMobileChrome&&screen.height-document.documentElement.clientHeight<40;ath.isTablet=ath.isMobileSafari&&_ua.indexOf("iPad")>-1||ath.isMobileChrome&&_ua.indexOf("Mobile")<0;ath.isCompatible=ath.isMobileSafari&&ath.OSVersion>=6||ath.isMobileChrome;var _defaultSession={lastDisplayTime:0,returningVisitor:false,displayCount:0,optedout:false,added:false};ath.removeSession=function(appID){try{localStorage.removeItem(appID||ath.defaults.appID)}catch(e){}};ath.Class=function(options){this.options=_extend({},ath.defaults);_extend(this.options,options);if(!_eventListener){return}this.options.mandatory=this.options.mandatory&&("standalone"in window.navigator||this.options.debug);this.options.modal=this.options.modal||this.options.mandatory;if(this.options.mandatory){this.options.startDelay=-.5}this.options.detectHomescreen=this.options.detectHomescreen===true?"hash":this.options.detectHomescreen;if(this.options.debug){ath.isCompatible=true;ath.OS=typeof this.options.debug=="string"?this.options.debug:ath.OS=="unsupported"?"android":ath.OS;ath.OSVersion=ath.OS=="ios"?"8":"4"}this.container=document.documentElement;this.session=localStorage.getItem(this.options.appID);this.session=this.session?JSON.parse(this.session):undefined;if(ath.hasToken&&(!ath.isCompatible||!this.session)){ath.hasToken=false;_removeToken()}if(!ath.isCompatible){return}this.session=this.session||_defaultSession;try{localStorage.setItem(this.options.appID,JSON.stringify(this.session));ath.hasLocalStorage=true}catch(e){ath.hasLocalStorage=false;if(this.options.onPrivate){this.options.onPrivate.call(this)}}var isValidLocation=!this.options.validLocation.length;for(var i=this.options.validLocation.length;i--;){if(this.options.validLocation[i].test(document.location.href)){isValidLocation=true;break}}if(localStorage.getItem("addToHome")){this.optOut()}if(this.session.optedout||this.session.added||!isValidLocation){return}if(ath.isStandalone){if(!this.session.added){this.session.added=true;this.updateSession();if(this.options.onAdd&&ath.hasLocalStorage){this.options.onAdd.call(this)}}return}if(this.options.detectHomescreen){if(ath.hasToken){_removeToken();if(!this.session.added){this.session.added=true;this.updateSession();if(this.options.onAdd&&ath.hasLocalStorage){this.options.onAdd.call(this)}}return}if(this.options.detectHomescreen=="hash"){history.replaceState("",window.document.title,document.location.href+"#ath")}else if(this.options.detectHomescreen=="smartURL"){history.replaceState("",window.document.title,document.location.href.replace(/(\/)?$/,"/ath$1"))}else{history.replaceState("",window.document.title,document.location.href+(document.location.search?"&":"?")+"ath=")}}if(!this.session.returningVisitor){this.session.returningVisitor=true;this.updateSession();if(this.options.skipFirstVisit){return}}if(!this.options.privateModeOverride&&!ath.hasLocalStorage){return}this.ready=true;if(this.options.onInit){this.options.onInit.call(this)}if(this.options.autostart){this.show()}};ath.Class.prototype={events:{load:"_delayedShow",error:"_delayedShow",orientationchange:"resize",resize:"resize",scroll:"resize",click:"remove",touchmove:"_preventDefault",transitionend:"_removeElements",webkitTransitionEnd:"_removeElements",MSTransitionEnd:"_removeElements"},handleEvent:function(e){var type=this.events[e.type];if(type){this[type](e)}},show:function(force){if(this.options.autostart&&!_DOMReady){setTimeout(this.show.bind(this),50);return}if(this.shown){return}var now=Date.now();var lastDisplayTime=this.session.lastDisplayTime;if(force!==true){if(!this.ready){return}if(now-lastDisplayTime<this.options.displayPace*6e4){return}if(this.options.maxDisplayCount&&this.session.displayCount>=this.options.maxDisplayCount){return}}this.shown=true;this.session.lastDisplayTime=now;this.session.displayCount++;this.updateSession();if(!this.applicationIcon){if(ath.OS=="ios"){this.applicationIcon=document.querySelector('head link[rel^=apple-touch-icon][sizes="152x152"],head link[rel^=apple-touch-icon][sizes="144x144"],head link[rel^=apple-touch-icon][sizes="120x120"],head link[rel^=apple-touch-icon][sizes="114x114"],head link[rel^=apple-touch-icon]')}else{this.applicationIcon=document.querySelector('head link[rel^="shortcut icon"][sizes="196x196"],head link[rel^=apple-touch-icon]')}}var message="";if(this.options.message in ath.intl){message=ath.intl[this.options.message][ath.OS]}else if(this.options.message!==""){message=this.options.message}else{message=ath.intl[ath.language][ath.OS]}message="<p>"+message.replace("%icon",'<span class="ath-action-icon">icon</span>')+"</p>";this.viewport=document.createElement("div");this.viewport.className="ath-viewport";if(this.options.modal){this.viewport.className+=" ath-modal"}if(this.options.mandatory){this.viewport.className+=" ath-mandatory"}this.viewport.style.position="absolute";this.element=document.createElement("div");this.element.className="ath-container ath-"+ath.OS+" ath-"+ath.OS+(ath.OSVersion+"").substr(0,1)+" ath-"+(ath.isTablet?"tablet":"phone");this.element.style.cssText="-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0s;-webkit-transition-timing-function:ease-out;transition-property:transform,opacity;transition-duration:0s;transition-timing-function:ease-out;";this.element.style.webkitTransform="translate3d(0,-"+window.innerHeight+"px,0)";this.element.style.transform="translate3d(0,-"+window.innerHeight+"px,0)";if(this.options.icon&&this.applicationIcon){this.element.className+=" ath-icon";this.img=document.createElement("img");this.img.className="ath-application-icon";this.img.addEventListener("load",this,false);this.img.addEventListener("error",this,false);this.img.src=this.applicationIcon.href;this.element.appendChild(this.img)}this.element.innerHTML+=message;this.viewport.style.left="-99999em";this.viewport.appendChild(this.element);this.container.appendChild(this.viewport);if(!this.img){this._delayedShow()}},_delayedShow:function(e){setTimeout(this._show.bind(this),this.options.startDelay*1e3+500)},_show:function(){var that=this;this.updateViewport();window.addEventListener("resize",this,false);window.addEventListener("scroll",this,false);window.addEventListener("orientationchange",this,false);
205if(this.options.modal){document.addEventListener("touchmove",this,true)}if(!this.options.mandatory){setTimeout(function(){that.element.addEventListener("click",that,true)},1e3)}setTimeout(function(){that.element.style.webkitTransitionDuration="1.2s";that.element.style.transitionDuration="1.2s";that.element.style.webkitTransform="translate3d(0,0,0)";that.element.style.transform="translate3d(0,0,0)"},0);if(this.options.lifespan){this.removeTimer=setTimeout(this.remove.bind(this),this.options.lifespan*1e3)}if(this.options.onShow){this.options.onShow.call(this)}},remove:function(){clearTimeout(this.removeTimer);if(this.img){this.img.removeEventListener("load",this,false);this.img.removeEventListener("error",this,false)}window.removeEventListener("resize",this,false);window.removeEventListener("scroll",this,false);window.removeEventListener("orientationchange",this,false);document.removeEventListener("touchmove",this,true);this.element.removeEventListener("click",this,true);this.element.addEventListener("transitionend",this,false);this.element.addEventListener("webkitTransitionEnd",this,false);this.element.addEventListener("MSTransitionEnd",this,false);this.element.style.webkitTransitionDuration="0.3s";this.element.style.opacity="0"},_removeElements:function(){this.element.removeEventListener("transitionend",this,false);this.element.removeEventListener("webkitTransitionEnd",this,false);this.element.removeEventListener("MSTransitionEnd",this,false);this.container.removeChild(this.viewport);this.shown=false;if(this.options.onRemove){this.options.onRemove.call(this)}},updateViewport:function(){if(!this.shown){return}this.viewport.style.width=window.innerWidth+"px";this.viewport.style.height=window.innerHeight+"px";this.viewport.style.left=window.scrollX+"px";this.viewport.style.top=window.scrollY+"px";var clientWidth=document.documentElement.clientWidth;this.orientation=clientWidth>document.documentElement.clientHeight?"landscape":"portrait";var screenWidth=ath.OS=="ios"?this.orientation=="portrait"?screen.width:screen.height:screen.width;this.scale=screen.width>clientWidth?1:screenWidth/window.innerWidth;this.element.style.fontSize=this.options.fontSize/this.scale+"px"},resize:function(){clearTimeout(this.resizeTimer);this.resizeTimer=setTimeout(this.updateViewport.bind(this),100)},updateSession:function(){if(ath.hasLocalStorage===false){return}localStorage.setItem(this.options.appID,JSON.stringify(this.session))},clearSession:function(){this.session=_defaultSession;this.updateSession()},optOut:function(){this.session.optedout=true;this.updateSession()},optIn:function(){this.session.optedout=false;this.updateSession()},clearDisplayCount:function(){this.session.displayCount=0;this.updateSession()},_preventDefault:function(e){e.preventDefault();e.stopPropagation()}};function _extend(target,obj){for(var i in obj){target[i]=obj[i]}return target}function _removeToken(){if(document.location.hash=="#ath"){history.replaceState("",window.document.title,document.location.href.split("#")[0])}if(_reSmartURL.test(document.location.href)){history.replaceState("",window.document.title,document.location.href.replace(_reSmartURL,"$1"))}if(_reQueryString.test(document.location.search)){history.replaceState("",window.document.title,document.location.href.replace(_reQueryString,"$2"))}}window.addToHomescreen=ath})(window,document);; 206// jQuery-based code to implement posting feedback within articles. 207// Rewritten for L12 template - based on Bootstrap v3.3.4 208(function($){ 209 'use strict'; 210 $(function() { 211 // Create an "inView" filter, courtesy of 212 // http://stackoverflow.com/questions/472930/in-jquery-is-there-way-for-slidedown-method-to-scroll-the-page-down-too/472954 213 $.extend($.expr[':'],{ 214 inView: function(a) { 215 var st = (document.documentElement.scrollTop || document.body.scrollTop), 216 ot = $(a).offset().top, 217 wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height(); 218 return ot > st && ($(a).height() + ot) < (st + wh); 219 } 220 }); 221 222 // Create the HTML for the feedback form and append it to the end of the feedbackBox div 223 $('#feedbackBox > div').append( 224'<div id="fbForm" style="overflow:auto; display:none;">' + 225 '<form action="">' + 226 '<p>Fill in the fields below and click Save to add a comment. (<em>* - required fields</em>)</p>' + 227 '<div class="form-group">' + 228 '<label for="fbName">* Name</label>' + 229 '<input type="text" name="fbName" id="fbName" value="" class="form-control" placeholder="Enter your name">' + 230 '</div>' + 231 '<div class="form-group">' +
232 '<label for="fbEmail">* Email</label>' + 233 '<input type="text" name="fbEmail" id="fbEmail" value="" class="form-control" placeholder="Enter your email address">' + 234 '</div>' + 235 '<div class="form-group">' + 236 '<label for="fbOccupation">Occupation:</label>' + 237 '<input type="text" name="fbOccupation" id="fbOccupation" value="" class="form-control" placeholder="Enter your occupation">' + 238 '</div>' + 239 '<div class="form-group">' + 240 '<label for="fbLocation">Location:</label>' + 241 '<input type="text" name="fbLocation" id="fbLocation" value="" class="form-control" placeholder="Enter your location">' + 242 '</div>' + 243 '<div class="form-group">' + 244 '<label>Display your email address?</label>' + 245 '<div class="radio">' + 246 '<label>' + 247 '<input type="radio" name="fbDisplayEmail" value="y" id="fbYes"> Yes' + 248 '</label>' + 249 '<label>' + 250 '<input type="radio" name="fbDisplayEmail" value="n" id="fbNo" checked="checked"> No' + 251 '</label>' + 252 '</div>' + 253 '</div>' + 254 '<div class="form-group">' + 255 '<label for="fbComment">* Feedback:</label>' + 256 '<textarea name="fbComment" id="fbComment" rows="10" class="form-control" placeholder="Enter your feedback"></textarea>' + 257 '</div>' + 258 '<p class="formButtons">' + 259 '<input type="button" id="saveFeedback" value="Save" disabled="disabled" class="btn btn-primary"> ' + 260 '<input type="button" id="cancelFeedback" value="Cancel" class="btn btn-primary">' + 261 '</p>' + 262 '</form>' + 263'</div>' 264 ); 265 266 // Cache some elements 267 var fbForm = $('#fbForm'); 268 var fbName = $('#fbName'); 269 var fbEmail = $('#fbEmail'); 270 var fbComment = $('#fbComment'); 271 var saveFeedback = $('#saveFeedback'); 272 273 // Create the HTML for the "Add New Comment" links and slide them down from above and below table 274 if ($('#feedbackBox tbody tr').length > 15) { 275 $('<p id="anc2" class="hidden-print" style="display:none;"><a href="#">Add New Comment</a></p>').insertBefore('#feedbackBox table').slideDown(); 276 } 277 $('<p id="anc" class="hidden-print" style="display:none;"><a href="#">Add New Comment</a></p>').insertAfter('#feedbackBox table').slideDown(); 278 279 // Create the HTML for the "Posted by" name "hover effect" in the feedback table 280 $('body').append( 281'<div id="namePreview">' + 282 '<p><strong>Email:</strong><span id="npEmail" /></p>' + 283 '<p><strong>Occupation:</strong><span id="npOccupation" /></p>' + 284 '<p><strong>Location:</strong><span id="npLocation" /></p>' + 285'</div>' 286 ); 287 288 var np = $('body #namePreview'); 289 np.css('opacity', 0); 290 291 // Build the text for the Ajax messages 292 var ajaxP1 = 'Please check your e-mail for a confirmation message. You must click on the URL in the message for your feedback to be submitted.'; 293 var ajaxP2 = '<strong>Thank you.</strong>'; 294 var moderatedFlag = $('#Moderated_Flag').val(); 295 var emailVerifyFlag = $('#Email_Verify_Flag').val(); 296 if (moderatedFlag && emailVerifyFlag) { 297 ajaxP2 = 'Your feedback will then be reviewed by our moderator.'; 298 } else if (moderatedFlag) { 299 ajaxP1 = 'Your feedback has been submitted for review by our moderator.'; 300 } else if (emailVerifyFlag) { 301 // Messages already set, but we need this ELSE IF in order for the ELSE to catch the right stuff 302 } else { 303 ajaxP1 = 'Your feedback has been submitted.'; 304 } 305 306 // Helper functions ------------------------------------------------------- 307 function ajaxPost() { 308 $.post( 309 '/vfeedback/action.v?ACTION=ajaxPost', 310 { 311 Name: $.trim(fbName.val()), 312 Email: $.trim(fbEmail.val()), 313 Occupation: $.trim($('#fbOccupation').val()), 314 Location: $.trim($('#fbLocation').val()), 315 Display_Email_Flag: $('#fbForm input:radio:checked').val(), 316 Comment: $.trim(fbComment.val()), 317 Topic_Name: $('#Topic_Name').val(), 318 Topic_ID: $('#Topic_ID').val() 319 }, 320 function(data) { 321 $('#ajaxLoading') 322 .find('#loadingImg').slideUp('normal', function() { 323 $('#ajaxLoading p:last').slideDown(); 324 }).end() 325 .find('p:first') 326 .animate({ opacity:'0' }, 'normal', function() { 327 $(this).html(ajaxP1); 328 }) 329 .animate({ opacity:'1' }, 'normal').end() 330 .find(':nth-child(3)') 331 .animate({ opacity:'0' }, 'normal', function() { 332 $(this).html(ajaxP2); 333 }) 334 .animate({ opacity:'1' }, 'normal'); 335 } 336 ); 337 } 338 339 function CloseDialog() { 340 fbForm.slideUp('normal', function() { 341 $('#anc, #anc2').slideDown(); 342 }); 343 } 344 345 function ToggleSaveButton(e) { 346 // Turns out to be equivalent to: if (a || b || c) 347 if ($('#fbName, #fbEmail, #fbComment').hasClass('backgroundError')) { 348 saveFeedback.attr('disabled', 'disabled'); 349 } else { 350 saveFeedback.removeAttr('disabled'); 351 } 352 } 353 354 // Event Handlers --------------------------------------------------------- 355 356 // Hover over "Posted by" name to see namePreview popup 357 var namePreview = $('#feedbackBox td.feedbackAuthor .fbName'); 358 if (namePreview.length) { 359 namePreview.mouseenter(function(e) { 360 var par = $(this).parent(); 361 var em = ''; 362 var fbe = par.find('.fbEmail'); 363 if (fbe.length) em = fbe.text(); 364 var occ = par.find('.fbOccupation').text(); 365 var loc = par.find('.fbLocation').text(); 366 367 // Put 'NA' in empty fields 368 if (em == '') em = 'NA'; if (occ == '') occ = 'NA'; if (loc == '') loc = 'NA'; 369 np.find('#npEmail').html(em); 370 np.find('#npOccupation').html(occ); 371 np.find('#npLocation').html(loc); 372 373 np.css({ 374 'left': e.pageX + 13, 375 'top': e.pageY + 5 376 }) 377 .stop() 378 .animate({ opacity: 1 }, 'normal'); 379 }).mousemove(function(e) { 380 np.css({ 381 'left': e.pageX + 13, 382 'top': e.pageY + 5 383 }); 384 }).mouseleave(function(e) { 385 // Fade out and then move it out of the way 386 np.stop().animate({ opacity: 0 }, 'normal', function () { $(this).css('top','-500px'); }); 387 }); 388 } 389 390 // "Add New Comment" link 391 $('#anc a, #anc2 a').click(function() { 392 $('#anc2').slideUp(); 393
394 $('#anc').slideUp('normal', function() { 395 // Reset fields 396 $('#fbForm .formItems input:text, #fbForm #fbComment').val(''); 397 $('#fbName, #fbEmail, #fbComment').addClass('backgroundError'); 398 $('#fbNo').attr('checked', 'checked'); 399 400 fbForm.slideDown('normal', function() { 401 // If necessary, scroll to keep the feedback form in view 402 if ($(this).is(':not(:inView)')) { 403 var sTop = $(this).offset().top; 404 405 // The L16 template has a "top bar" that can be "sticky" - take that into account when scrolling 406 if ($('.container-top-bar.sticky-top-bar').length) { 407 sTop -= ($('.container-top-bar.sticky-top-bar').outerHeight(true) + 5); 408 } 409 410 $('html,body').animate({ scrollTop: sTop }, 'normal'); 411 } 412 413 // Put the cursor in the Name field 414 fbName.focus(); 415 416 }); 417 }); 418 return false; 419 }); 420 421 // Cancel button in feedback form 422 $('#cancelFeedback').click(CloseDialog); 423 424 // Close the dialog if Escape key is pressed 425 fbForm.keyup(function(e) { 426 if (e.keyCode == 27) CloseDialog(); 427 }); 428 429 // Watch required fields and enable/disable Save button based on existence of text in those fields 430 fbName.keyup(function(e) { 431 if ($.trim($(this).val()) == '') { 432 $(this).addClass('backgroundError'); 433 } else { 434 $(this).removeClass('backgroundError'); 435 } 436 ToggleSaveButton(e); 437 }); 438 fbEmail.keyup(function(e) { 439 var em = $.trim($(this).val()); 440 if (em == '') { 441 $(this).addClass('backgroundError'); 442 } else { 443 var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 444 if (filter.test(em)) { 445 $(this).removeClass('backgroundError'); 446 } else { 447 $(this).addClass('backgroundError'); 448 } 449 } 450 ToggleSaveButton(e); 451 }); 452 fbComment.keyup(function(e) { 453 if ($.trim($(this).val()) == '') { 454 $(this).addClass('backgroundError'); 455 } else { 456 $(this).removeClass('backgroundError'); 457 } 458 ToggleSaveButton(e); 459 }); 460 461 // Save button in feedback form 462 saveFeedback.click(function() { 463 // Only want to create the "loading" div once 464 if ($('#ajaxLoading').length == 0) { 465 $( 466'<div id="ajaxLoading" style="display:none;">' + 467 '<p />' + 468 '<p id="loadingImg"><img src="" /></p>' + 469 '<p />' + 470 '<p><input type="button" value="Close" class="btn btn-primary" /></p>' + 471'</div>' 472 ).insertAfter('#fbForm'); 473 474 $('#ajaxLoading').css({ 475 'background-color': $('#fbForm p').css('background-color'), 476 'text-align': 'center' 477 }) 478 .find('p:last input') 479 .click(function() { 480 if (!moderatedFlag && !emailVerifyFlag) { 481 // If no moderation, reload the page to display the new feedback post 482 location.reload(); 483 } else { 484 $('#ajaxLoading').slideUp('normal', function() { 485 $('#anc, #anc2').slideDown(); 486 }); 487 } 488 }); 489 } 490 491 fbForm.slideUp('normal', function() { 492 $('#ajaxLoading') 493 .find('p:first').html('Saving your feedback...').end() 494 .find('#loadingImg').removeAttr('style').end() 495 // Reset the img src - without this, the animated gif will only animate the first time a feedback is posted. 496 .find('#loadingImg img').attr('src', '').attr('src','https://socshelp.socs.net/images/ajax_bar_loader.gif').end() 497 .find(':nth-child(3)').html('...this may take a few seconds.').end() 498 .find('p:last').hide().end() 499 .slideDown('normal', function() { 500 ajaxPost(); 501 }); 502 }); 503 }); 504 505 }); 506})(jQuery); 507 508; 509//http://www.featureblend.com/license.txt 510var FlashDetect=new function(){var self=this;self.installed=false;self.raw="";self.major=-1;self.minor=-1;self.revision=-1;self.revisionStr="";var activeXDetectRules=[{"name":"ShockwaveFlash.ShockwaveFlash.7","version":function(obj){return getActiveXVersion(obj);}},{"name":"ShockwaveFlash.ShockwaveFlash.6","version":function(obj){var version="6,0,21";try{obj.AllowScriptAccess="always";version=getActiveXVersion(obj);}catch(err){} 511return version;}},{"name":"ShockwaveFlash.ShockwaveFlash","version":function(obj){return getActiveXVersion(obj);}}];var getActiveXVersion=function(activeXObj){var version=-1;try{version=activeXObj.GetVariable("$version");}catch(err){} 512return version;};var getActiveXObject=function(name){var obj=-1;try{obj=new ActiveXObject(name);}catch(err){obj={activeXError:true};} 513return obj;};var parseActiveXVersion=function(str){var versionArray=str.split(",");return{"raw":str,"major":parseInt(versionArray[0].split(" ")[1],10),"minor":parseInt(versionArray[1],10),"revision":parseInt(versionArray[2],10),"revisionStr":versionArray[2]};};var parseStandardVersion=function(str){var descParts=str.split(/ +/);var majorMinor=descParts[2].split(/\./);var revisionStr=descParts[3];return{"raw":str,"major":parseInt(majorMinor[0],10),"minor":parseInt(majorMinor[1],10),"revisionStr":revisionStr,"revision":parseRevisionStrToInt(revisionStr)};};var parseRevisionStrToInt=function(str){return parseInt(str.replace(/[a-zA-Z]/g,""),10)||self.revision;};self.majorAtLeast=function(version){return self.major>=version;};self.minorAtLeast=function(version){return self.minor>=version;};self.revisionAtLeast=function(version){return self.revision>=version;};self.versionAtLeast=function(major){var properties=[self.major,self.minor,self.revision];var len=Math.min(properties.length,arguments.length);for(i=0;i<len;i++){if(properties[i]>=arguments[i]){if(i+1<len&&properties[i]==arguments[i]){continue;}else{return true;}}else{return false;}}};self.FlashDetect=function(){if(navigator.plugins&&navigator.plugins.length>0){var type='application/x-shockwave-flash';var mimeTypes=navigator.mimeTypes;if(mimeTypes&&mimeTypes[type]&&mimeTypes[type].enabledPlugin&&mimeTypes[type].enabledPlugin.description){var version=mimeTypes[type].enabledPlugin.description;
513var versionObj=parseStandardVersion(version);self.raw=versionObj.raw;self.major=versionObj.major;self.minor=versionObj.minor;self.revisionStr=versionObj.revisionStr;self.revision=versionObj.revision;self.installed=true;}}else if(navigator.appVersion.indexOf("Mac")==-1&&window.execScript){var version=-1;for(var i=0;i<activeXDetectRules.length&&version==-1;i++){var obj=getActiveXObject(activeXDetectRules[i].name);if(!obj.activeXError){self.installed=true;version=activeXDetectRules[i].version(obj);if(version!=-1){var versionObj=parseActiveXVersion(version);self.raw=versionObj.raw;self.major=versionObj.major;self.minor=versionObj.minor;self.revision=versionObj.revision;self.revisionStr=versionObj.revisionStr;}}}}}();};FlashDetect.JS_RELEASE="1.0.4";
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.