update Piwik to version 2.16 (fixes #91)
This commit is contained in:
parent
296343bf3b
commit
d885a4baa9
5833 changed files with 418860 additions and 226988 deletions
|
|
@ -1,20 +0,0 @@
|
|||
Copyright (c) 2010 John Resig, http://jquery.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
Copyright (c) 2010 Paul Bakaus, http://jqueryui.com/
|
||||
|
||||
This software consists of voluntary contributions made by many
|
||||
individuals (AUTHORS.txt, http://jqueryui.com/about) For exact
|
||||
contribution history, see the revision history and logs, available
|
||||
at http://jquery-ui.googlecode.com/svn/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
Copyright Mathias Bynens <http://mathiasbynens.be/>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
7
www/analytics/libs/jquery/jquery-ui.js
vendored
7
www/analytics/libs/jquery/jquery-ui.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,181 +0,0 @@
|
|||
/*
|
||||
* jQuery history plugin
|
||||
*
|
||||
* Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
|
||||
* Copyright (c) 2010 Takayuki Miwa
|
||||
*
|
||||
* Licensed under the MIT License:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
var locationWrapper = {
|
||||
put: function(hash, win) {
|
||||
(win || window).location.hash = this.encoder(hash);
|
||||
},
|
||||
get: function(win) {
|
||||
var hash = ((win || window).location.hash).replace(/^#/, '');
|
||||
try {
|
||||
return $.browser.mozilla ? hash : decodeURIComponent(hash);
|
||||
}
|
||||
catch (error) {
|
||||
return hash;
|
||||
}
|
||||
},
|
||||
encoder: encodeURIComponent
|
||||
};
|
||||
|
||||
var iframeWrapper = {
|
||||
id: "__jQuery_history",
|
||||
init: function() {
|
||||
var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
|
||||
$("body").prepend(html);
|
||||
return this;
|
||||
},
|
||||
_document: function() {
|
||||
return $("#"+ this.id)[0].contentWindow.document;
|
||||
},
|
||||
put: function(hash) {
|
||||
var doc = this._document();
|
||||
doc.open();
|
||||
doc.close();
|
||||
locationWrapper.put(hash, doc);
|
||||
},
|
||||
get: function() {
|
||||
return locationWrapper.get(this._document());
|
||||
}
|
||||
};
|
||||
|
||||
function initObjects(options) {
|
||||
options = $.extend({
|
||||
unescape: false
|
||||
}, options || {});
|
||||
|
||||
locationWrapper.encoder = encoder(options.unescape);
|
||||
|
||||
function encoder(unescape_) {
|
||||
if(unescape_ === true) {
|
||||
return function(hash){ return hash; };
|
||||
}
|
||||
if(typeof unescape_ == "string" &&
|
||||
(unescape_ = partialDecoder(unescape_.split("")))
|
||||
|| typeof unescape_ == "function") {
|
||||
return function(hash) { return unescape_(encodeURIComponent(hash)); };
|
||||
}
|
||||
return encodeURIComponent;
|
||||
}
|
||||
|
||||
function partialDecoder(chars) {
|
||||
var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
|
||||
return function(enc) { return enc.replace(re, decodeURIComponent); };
|
||||
}
|
||||
}
|
||||
|
||||
var implementations = {};
|
||||
|
||||
implementations.base = {
|
||||
callback: undefined,
|
||||
type: undefined,
|
||||
|
||||
check: function() {},
|
||||
load: function(hash) {},
|
||||
init: function(callback, options) {
|
||||
initObjects(options);
|
||||
self.callback = callback;
|
||||
self._options = options;
|
||||
self._init();
|
||||
},
|
||||
|
||||
_init: function() {},
|
||||
_options: {}
|
||||
};
|
||||
|
||||
implementations.timer = {
|
||||
_appState: undefined,
|
||||
_init: function() {
|
||||
var current_hash = locationWrapper.get();
|
||||
self._appState = current_hash;
|
||||
self.callback(current_hash);
|
||||
setInterval(self.check, 100);
|
||||
},
|
||||
check: function() {
|
||||
var current_hash = locationWrapper.get();
|
||||
if(current_hash != self._appState) {
|
||||
self._appState = current_hash;
|
||||
self.callback(current_hash);
|
||||
}
|
||||
},
|
||||
load: function(hash) {
|
||||
if(hash != self._appState) {
|
||||
locationWrapper.put(hash);
|
||||
self._appState = hash;
|
||||
}
|
||||
self.callback(hash);
|
||||
}
|
||||
};
|
||||
|
||||
implementations.iframeTimer = {
|
||||
_appState: undefined,
|
||||
_init: function() {
|
||||
var current_hash = locationWrapper.get();
|
||||
self._appState = current_hash;
|
||||
iframeWrapper.init().put(current_hash);
|
||||
self.callback(current_hash);
|
||||
setInterval(self.check, 100);
|
||||
},
|
||||
check: function() {
|
||||
var iframe_hash = iframeWrapper.get(),
|
||||
location_hash = locationWrapper.get();
|
||||
|
||||
if (location_hash != iframe_hash) {
|
||||
if (location_hash == self._appState) { // user used Back or Forward button
|
||||
self._appState = iframe_hash;
|
||||
locationWrapper.put(iframe_hash);
|
||||
self.callback(iframe_hash);
|
||||
} else { // user loaded new bookmark
|
||||
self._appState = location_hash;
|
||||
iframeWrapper.put(location_hash);
|
||||
self.callback(location_hash);
|
||||
}
|
||||
}
|
||||
},
|
||||
load: function(hash) {
|
||||
if(hash != self._appState) {
|
||||
locationWrapper.put(hash);
|
||||
iframeWrapper.put(hash);
|
||||
self._appState = hash;
|
||||
}
|
||||
self.callback(hash);
|
||||
}
|
||||
};
|
||||
|
||||
implementations.hashchangeEvent = {
|
||||
_init: function() {
|
||||
self.callback(locationWrapper.get());
|
||||
$(window).bind('hashchange', self.check);
|
||||
},
|
||||
check: function() {
|
||||
self.callback(locationWrapper.get());
|
||||
},
|
||||
load: function(hash) {
|
||||
if(locationWrapper.get() == hash) {
|
||||
self.callback(locationWrapper.get());
|
||||
} else {
|
||||
locationWrapper.put(hash);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var self = $.extend({}, implementations.base);
|
||||
|
||||
if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
|
||||
self.type = 'iframeTimer';
|
||||
} else if("onhashchange" in window) {
|
||||
self.type = 'hashchangeEvent';
|
||||
} else {
|
||||
self.type = 'timer';
|
||||
}
|
||||
|
||||
$.extend(self, implementations[self.type]);
|
||||
$.history = self;
|
||||
})(jQuery);
|
||||
4
www/analytics/libs/jquery/jquery.js
vendored
4
www/analytics/libs/jquery/jquery.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
|
|
@ -1,117 +0,0 @@
|
|||
/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net)
|
||||
* Licensed under the MIT License (LICENSE.txt).
|
||||
*
|
||||
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
||||
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
||||
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
||||
*
|
||||
* Version: 3.1.3
|
||||
*
|
||||
* Requires: 1.2.2+
|
||||
*/
|
||||
|
||||
(function (factory) {
|
||||
if ( typeof define === 'function' && define.amd ) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS style for Browserify
|
||||
module.exports = factory;
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
|
||||
var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'];
|
||||
var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
|
||||
var lowestDelta, lowestDeltaXY;
|
||||
|
||||
if ( $.event.fixHooks ) {
|
||||
for ( var i = toFix.length; i; ) {
|
||||
$.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
|
||||
}
|
||||
}
|
||||
|
||||
$.event.special.mousewheel = {
|
||||
setup: function() {
|
||||
if ( this.addEventListener ) {
|
||||
for ( var i = toBind.length; i; ) {
|
||||
this.addEventListener( toBind[--i], handler, false );
|
||||
}
|
||||
} else {
|
||||
this.onmousewheel = handler;
|
||||
}
|
||||
},
|
||||
|
||||
teardown: function() {
|
||||
if ( this.removeEventListener ) {
|
||||
for ( var i = toBind.length; i; ) {
|
||||
this.removeEventListener( toBind[--i], handler, false );
|
||||
}
|
||||
} else {
|
||||
this.onmousewheel = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.extend({
|
||||
mousewheel: function(fn) {
|
||||
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
|
||||
},
|
||||
|
||||
unmousewheel: function(fn) {
|
||||
return this.unbind("mousewheel", fn);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function handler(event) {
|
||||
var orgEvent = event || window.event,
|
||||
args = [].slice.call(arguments, 1),
|
||||
delta = 0,
|
||||
deltaX = 0,
|
||||
deltaY = 0,
|
||||
absDelta = 0,
|
||||
absDeltaXY = 0,
|
||||
fn;
|
||||
event = $.event.fix(orgEvent);
|
||||
event.type = "mousewheel";
|
||||
|
||||
// Old school scrollwheel delta
|
||||
if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; }
|
||||
if ( orgEvent.detail ) { delta = orgEvent.detail * -1; }
|
||||
|
||||
// New school wheel delta (wheel event)
|
||||
if ( orgEvent.deltaY ) {
|
||||
deltaY = orgEvent.deltaY * -1;
|
||||
delta = deltaY;
|
||||
}
|
||||
if ( orgEvent.deltaX ) {
|
||||
deltaX = orgEvent.deltaX;
|
||||
delta = deltaX * -1;
|
||||
}
|
||||
|
||||
// Webkit
|
||||
if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; }
|
||||
if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; }
|
||||
|
||||
// Look for lowest delta to normalize the delta values
|
||||
absDelta = Math.abs(delta);
|
||||
if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; }
|
||||
absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));
|
||||
if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; }
|
||||
|
||||
// Get a whole value for the deltas
|
||||
fn = delta > 0 ? 'floor' : 'ceil';
|
||||
delta = Math[fn](delta / lowestDelta);
|
||||
deltaX = Math[fn](deltaX / lowestDeltaXY);
|
||||
deltaY = Math[fn](deltaY / lowestDeltaXY);
|
||||
|
||||
// Add event and delta to the front of the arguments
|
||||
args.unshift(event, delta, deltaX, deltaY);
|
||||
|
||||
return ($.event.dispatch || $.event.handle).apply(this, args);
|
||||
}
|
||||
|
||||
}));
|
||||
|
|
@ -1,157 +0,0 @@
|
|||
/*! http://mths.be/placeholder v2.0.7 by @mathias */
|
||||
;(function(window, document, $) {
|
||||
|
||||
var isInputSupported = 'placeholder' in document.createElement('input'),
|
||||
isTextareaSupported = 'placeholder' in document.createElement('textarea'),
|
||||
prototype = $.fn,
|
||||
valHooks = $.valHooks,
|
||||
hooks,
|
||||
placeholder;
|
||||
|
||||
if (isInputSupported && isTextareaSupported) {
|
||||
|
||||
placeholder = prototype.placeholder = function() {
|
||||
return this;
|
||||
};
|
||||
|
||||
placeholder.input = placeholder.textarea = true;
|
||||
|
||||
} else {
|
||||
|
||||
placeholder = prototype.placeholder = function() {
|
||||
var $this = this;
|
||||
$this
|
||||
.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
|
||||
.not('.placeholder')
|
||||
.bind({
|
||||
'focus.placeholder': clearPlaceholder,
|
||||
'blur.placeholder': setPlaceholder
|
||||
})
|
||||
.data('placeholder-enabled', true)
|
||||
.trigger('blur.placeholder');
|
||||
return $this;
|
||||
};
|
||||
|
||||
placeholder.input = isInputSupported;
|
||||
placeholder.textarea = isTextareaSupported;
|
||||
|
||||
hooks = {
|
||||
'get': function(element) {
|
||||
var $element = $(element);
|
||||
return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
|
||||
},
|
||||
'set': function(element, value) {
|
||||
var $element = $(element);
|
||||
if (!$element.data('placeholder-enabled')) {
|
||||
return element.value = value;
|
||||
}
|
||||
if (value == '') {
|
||||
element.value = value;
|
||||
// Issue #56: Setting the placeholder causes problems if the element continues to have focus.
|
||||
if (element != document.activeElement) {
|
||||
// We can't use `triggerHandler` here because of dummy text/password inputs :(
|
||||
setPlaceholder.call(element);
|
||||
}
|
||||
} else if ($element.hasClass('placeholder')) {
|
||||
clearPlaceholder.call(element, true, value) || (element.value = value);
|
||||
} else {
|
||||
element.value = value;
|
||||
}
|
||||
// `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
|
||||
return $element;
|
||||
}
|
||||
};
|
||||
|
||||
isInputSupported || (valHooks.input = hooks);
|
||||
isTextareaSupported || (valHooks.textarea = hooks);
|
||||
|
||||
$(function() {
|
||||
// Look for forms
|
||||
$(document).delegate('form', 'submit.placeholder', function() {
|
||||
// Clear the placeholder values so they don't get submitted
|
||||
var $inputs = $('.placeholder', this).each(clearPlaceholder);
|
||||
setTimeout(function() {
|
||||
$inputs.each(setPlaceholder);
|
||||
}, 10);
|
||||
});
|
||||
});
|
||||
|
||||
// Clear placeholder values upon page reload
|
||||
$(window).bind('beforeunload.placeholder', function() {
|
||||
$('.placeholder').each(function() {
|
||||
this.value = '';
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function args(elem) {
|
||||
// Return an object of element attributes
|
||||
var newAttrs = {},
|
||||
rinlinejQuery = /^jQuery\d+$/;
|
||||
$.each(elem.attributes, function(i, attr) {
|
||||
if (attr.specified && !rinlinejQuery.test(attr.name)) {
|
||||
newAttrs[attr.name] = attr.value;
|
||||
}
|
||||
});
|
||||
return newAttrs;
|
||||
}
|
||||
|
||||
function clearPlaceholder(event, value) {
|
||||
var input = this,
|
||||
$input = $(input);
|
||||
if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
|
||||
if ($input.data('placeholder-password')) {
|
||||
$input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
|
||||
// If `clearPlaceholder` was called from `$.valHooks.input.set`
|
||||
if (event === true) {
|
||||
return $input[0].value = value;
|
||||
}
|
||||
$input.focus();
|
||||
} else {
|
||||
input.value = '';
|
||||
$input.removeClass('placeholder');
|
||||
input == document.activeElement && input.select();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setPlaceholder() {
|
||||
var $replacement,
|
||||
input = this,
|
||||
$input = $(input),
|
||||
$origInput = $input,
|
||||
id = this.id;
|
||||
if (input.value == '') {
|
||||
if (input.type == 'password') {
|
||||
if (!$input.data('placeholder-textinput')) {
|
||||
try {
|
||||
$replacement = $input.clone().attr({ 'type': 'text' });
|
||||
} catch(e) {
|
||||
$replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
|
||||
}
|
||||
$replacement
|
||||
.removeAttr('name')
|
||||
.data({
|
||||
'placeholder-password': true,
|
||||
'placeholder-id': id
|
||||
})
|
||||
.bind('focus.placeholder', clearPlaceholder);
|
||||
$input
|
||||
.data({
|
||||
'placeholder-textinput': $replacement,
|
||||
'placeholder-id': id
|
||||
})
|
||||
.before($replacement);
|
||||
}
|
||||
$input = $input.removeAttr('id').hide().prev().attr('id', id).show();
|
||||
// Note: `$input[0] != input` now!
|
||||
}
|
||||
$input.addClass('placeholder');
|
||||
$input[0].value = $input.attr('placeholder');
|
||||
} else {
|
||||
$input.removeClass('placeholder');
|
||||
}
|
||||
}
|
||||
|
||||
}(this, document, jQuery));
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
/**
|
||||
* Copyright (c) 2007-2012 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* @author Ariel Flesler
|
||||
* @version 1.4.3.1
|
||||
*/
|
||||
;(function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,e,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
|
||||
|
|
@ -10,14 +10,16 @@
|
|||
|
||||
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)
|
||||
, UA = navigator.userAgent
|
||||
|
||||
|
||||
// Detect banner type (iOS or Android)
|
||||
if (this.options.force) {
|
||||
this.type = this.options.force
|
||||
} else if (UA.match(/iPad|iPhone|iPod/i) != null) {
|
||||
} else if (UA.match(/iPhone|iPod/i) != null || (UA.match(/iPad/) && this.options.iOSUniversalApp)) {
|
||||
if (UA.match(/Safari/i) != null &&
|
||||
(UA.match(/CriOS/i) != null ||
|
||||
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+)
|
||||
window.Number(UA.substr(UA.indexOf('OS ') + 3, 3).replace('_', '.')) < 6)) this.type = 'ios' // Check webview and native smart banner support (iOS 6+)
|
||||
} else if (UA.match(/\bSilk\/(.*\bMobile Safari\b)?/) || UA.match(/\bKF\w/) || UA.match('Kindle Fire')) {
|
||||
this.type = 'kindle'
|
||||
} else if (UA.match(/Android/i) != null) {
|
||||
this.type = 'android'
|
||||
} else if (UA.match(/Windows NT 6.2/i) != null && UA.match(/Touch/i) !== null) {
|
||||
|
|
@ -35,7 +37,8 @@
|
|||
|
||||
// Get info from meta data
|
||||
var meta = $(this.type == 'android' ? 'meta[name="google-play-app"]' :
|
||||
this.type == 'ios' ? 'meta[name="apple-itunes-app"]' : 'meta[name="msApplication-ID"]');
|
||||
this.type == 'ios' ? 'meta[name="apple-itunes-app"]' :
|
||||
this.type == 'kindle' ? 'meta[name="kindle-fire-app"]' : 'meta[name="msApplication-ID"]');
|
||||
if (meta.length == 0) return
|
||||
|
||||
// For Windows Store apps, get the PackageFamilyName for protocol launch
|
||||
|
|
@ -46,8 +49,10 @@
|
|||
this.appId = /app-id=([^\s,]+)/.exec(meta.attr('content'))[1]
|
||||
}
|
||||
|
||||
this.title = this.options.title ? this.options.title : $('title').text().replace(/\s*[|\-·].*$/, '')
|
||||
this.author = this.options.author ? this.options.author : ($('meta[name="author"]').length ? $('meta[name="author"]').attr('content') : window.location.hostname)
|
||||
this.title = this.options.title ? this.options.title : meta.data('title') || $('title').text().replace(/\s*[|\-·].*$/, '')
|
||||
this.author = this.options.author ? this.options.author : meta.data('author') || ($('meta[name="author"]').length ? $('meta[name="author"]').attr('content') : window.location.hostname)
|
||||
this.iconUrl = meta.data('icon-url');
|
||||
this.price = meta.data('price');
|
||||
|
||||
// Create banner
|
||||
this.create()
|
||||
|
|
@ -58,17 +63,32 @@
|
|||
SmartBanner.prototype = {
|
||||
|
||||
constructor: SmartBanner
|
||||
|
||||
|
||||
, create: function() {
|
||||
var iconURL
|
||||
, link=(this.options.url ? this.options.url : (this.type == 'windows' ? 'ms-windows-store:PDP?PFN=' + this.pfn : (this.type == 'android' ? 'market://details?id=' : 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id')) + this.appId)
|
||||
, inStore=this.options.price ? this.options.price + ' - ' + (this.type == 'android' ? this.options.inGooglePlay : this.type == 'ios' ? this.options.inAppStore : this.options.inWindowsStore) : ''
|
||||
, link=(this.options.url ? this.options.url : (this.type == 'windows' ? 'ms-windows-store:PDP?PFN=' + this.pfn : (this.type == 'android' ? 'market://details?id=' : (this.type == 'kindle' ? 'amzn://apps/android?asin=' : 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id'))) + this.appId)
|
||||
, price = this.price || this.options.price
|
||||
, inStore=price ? price + ' - ' + (this.type == 'android' ? this.options.inGooglePlay : this.type == 'kindle' ? this.options.inAmazonAppStore : this.type == 'ios' ? this.options.inAppStore : this.options.inWindowsStore) : ''
|
||||
, gloss=this.options.iconGloss === null ? (this.type=='ios') : this.options.iconGloss
|
||||
if(this.options.url)
|
||||
link = this.options.url
|
||||
else {
|
||||
if(this.type=='android') {
|
||||
link = 'market://details?id=' + this.appId
|
||||
if(this.options.GooglePlayParams)
|
||||
link = link + '&referrer=' + this.options.GooglePlayParams
|
||||
}
|
||||
else
|
||||
link = 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id' + this.appId
|
||||
}
|
||||
|
||||
var banner = '<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>';
|
||||
(this.options.layer) ? $(this.options.appendToSelector).append(banner) : $(this.options.appendToSelector).prepend(banner);
|
||||
|
||||
$('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>')
|
||||
|
||||
if (this.options.icon) {
|
||||
iconURL = this.options.icon
|
||||
} else if(this.iconUrl) {
|
||||
iconURL = this.iconUrl;
|
||||
} else if ($('link[rel="apple-touch-icon-precomposed"]').length > 0) {
|
||||
iconURL = $('link[rel="apple-touch-icon-precomposed"]').attr('href')
|
||||
if (this.options.iconGloss === null) gloss = false
|
||||
|
|
@ -79,7 +99,7 @@
|
|||
} else if ($('meta[name="msapplication-TileImage"]').length > 0) { /* redundant because ms docs show two case usages */
|
||||
iconURL = $('meta[name="msapplication-TileImage"]').attr('content')
|
||||
}
|
||||
|
||||
|
||||
if (iconURL) {
|
||||
$('#smartbanner .sb-icon').css('background-image','url('+iconURL+')')
|
||||
if (gloss) $('#smartbanner .sb-icon').addClass('gloss')
|
||||
|
|
@ -93,47 +113,87 @@
|
|||
$('#smartbanner')
|
||||
.css('top', parseFloat($('#smartbanner').css('top')) * this.scale)
|
||||
.css('height', parseFloat($('#smartbanner').css('height')) * this.scale)
|
||||
.hide()
|
||||
$('#smartbanner .sb-container')
|
||||
.css('-webkit-transform', 'scale('+this.scale+')')
|
||||
.css('-msie-transform', 'scale('+this.scale+')')
|
||||
.css('-moz-transform', 'scale('+this.scale+')')
|
||||
.css('width', $(window).width() / this.scale)
|
||||
}
|
||||
$('#smartbanner').css('position', (this.options.layer) ? 'absolute' : 'static')
|
||||
}
|
||||
|
||||
|
||||
, listen: function () {
|
||||
$('#smartbanner .sb-close').on('click',$.proxy(this.close, this))
|
||||
$('#smartbanner .sb-button').on('click',$.proxy(this.install, this))
|
||||
}
|
||||
|
||||
|
||||
, show: function(callback) {
|
||||
$('#smartbanner').stop().animate({top:0},this.options.speedIn).addClass('shown')
|
||||
$('html').animate({marginTop:this.origHtmlMargin+(this.bannerHeight*this.scale)},this.options.speedIn,'swing',callback)
|
||||
var banner = $('#smartbanner');
|
||||
banner.stop();
|
||||
|
||||
if (this.options.layer) {
|
||||
banner.animate({top: 0, display: 'block'}, this.options.speedIn).addClass('shown').show();
|
||||
$('html').animate({marginTop: this.origHtmlMargin + (this.bannerHeight * this.scale)}, this.options.speedIn, 'swing', callback);
|
||||
} else {
|
||||
if ($.support.transition) {
|
||||
banner.animate({top:0},this.options.speedIn).addClass('shown');
|
||||
var transitionCallback = function() {
|
||||
$('html').removeClass('sb-animation');
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
$('html').addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedIn).css('margin-top', this.origHtmlMargin+(this.bannerHeight*this.scale));
|
||||
} else {
|
||||
banner.slideDown(this.options.speedIn).addClass('shown');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
, hide: function(callback) {
|
||||
$('#smartbanner').stop().animate({top:-1*this.bannerHeight*this.scale},this.options.speedOut).removeClass('shown')
|
||||
$('html').animate({marginTop:this.origHtmlMargin},this.options.speedOut,'swing',callback)
|
||||
var banner = $('#smartbanner');
|
||||
banner.stop();
|
||||
|
||||
if (this.options.layer) {
|
||||
banner.animate({top: -1 * this.bannerHeight * this.scale, display: 'block'}, this.options.speedIn).removeClass('shown');
|
||||
$('html').animate({marginTop: this.origHtmlMargin}, this.options.speedIn, 'swing', callback);
|
||||
} else {
|
||||
if ($.support.transition) {
|
||||
banner.css('top', -1*this.bannerHeight*this.scale).removeClass('shown');
|
||||
var transitionCallback = function() {
|
||||
$('html').removeClass('sb-animation');
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
$('html').addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedOut).css('margin-top', this.origHtmlMargin);
|
||||
} else {
|
||||
banner.slideUp(this.options.speedOut).removeClass('shown');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
, close: function(e) {
|
||||
e.preventDefault()
|
||||
this.hide()
|
||||
this.setCookie('sb-closed','true',this.options.daysHidden)
|
||||
this.setCookie('sb-closed','true',this.options.daysHidden);
|
||||
}
|
||||
|
||||
|
||||
, install: function(e) {
|
||||
this.hide()
|
||||
if (this.options.hideOnInstall) {
|
||||
this.hide()
|
||||
}
|
||||
this.setCookie('sb-installed','true',this.options.daysReminder)
|
||||
}
|
||||
|
||||
|
||||
, setCookie: function(name, value, exdays) {
|
||||
var exdate = new Date()
|
||||
exdate.setDate(exdate.getDate()+exdays)
|
||||
value=escape(value)+((exdays==null)?'':'; expires='+exdate.toUTCString())
|
||||
value=encodeURI(value)+((exdays==null)?'':'; expires='+exdate.toUTCString())
|
||||
document.cookie=name+'='+value+'; path=/;'
|
||||
}
|
||||
|
||||
|
||||
, getCookie: function(name) {
|
||||
var i,x,y,ARRcookies = document.cookie.split(";")
|
||||
for(i=0;i<ARRcookies.length;i++) {
|
||||
|
|
@ -141,12 +201,12 @@
|
|||
y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1)
|
||||
x = x.replace(/^\s+|\s+$/g,"")
|
||||
if (x==name) {
|
||||
return unescape(y)
|
||||
return decodeURI(y)
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
|
||||
// Demo only
|
||||
, switchType: function() {
|
||||
var that = this
|
||||
|
|
@ -165,9 +225,9 @@
|
|||
|
||||
$.smartbanner = function (option) {
|
||||
var $window = $(window)
|
||||
, data = $window.data('typeahead')
|
||||
, data = $window.data('smartbanner')
|
||||
, options = typeof option == 'object' && option
|
||||
if (!data) $window.data('typeahead', (data = new SmartBanner(options)))
|
||||
if (!data) $window.data('smartbanner', (data = new SmartBanner(options)))
|
||||
if (typeof option == 'string') data[option]()
|
||||
}
|
||||
|
||||
|
|
@ -179,7 +239,9 @@
|
|||
appStoreLanguage: 'us', // Language code for App Store
|
||||
inAppStore: 'On the App Store', // Text of price for iOS
|
||||
inGooglePlay: 'In Google Play', // Text of price for Android
|
||||
inAmazonAppStore: 'In the Amazon Appstore',
|
||||
inWindowsStore: 'In the Windows Store', //Text of price for Windows
|
||||
GooglePlayParams: null, // Aditional parameters for the market
|
||||
icon: null, // The URL of the icon (defaults to <meta name="apple-touch-icon">)
|
||||
iconGloss: null, // Force gloss effect for iOS even for precomposed
|
||||
button: 'VIEW', // Text for the install button
|
||||
|
|
@ -189,9 +251,59 @@
|
|||
speedOut: 400, // Close animation speed of the banner
|
||||
daysHidden: 15, // Duration to hide the banner after being closed (0 = always show banner)
|
||||
daysReminder: 90, // Duration to hide the banner after "VIEW" is clicked *separate from when the close button is clicked* (0 = always show banner)
|
||||
force: null // Choose 'ios', 'android' or 'windows'. Don't do a browser check, just always show this banner
|
||||
force: null, // Choose 'ios', 'android' or 'windows'. Don't do a browser check, just always show this banner
|
||||
hideOnInstall: true, // Hide the banner after "VIEW" is clicked.
|
||||
layer: false, // Display as overlay layer or slide down the page
|
||||
iOSUniversalApp: true, // If the iOS App is a universal app for both iPad and iPhone, display Smart Banner to iPad users, too.
|
||||
appendToSelector: 'body' //Append the banner to a specific selector
|
||||
}
|
||||
|
||||
$.smartbanner.Constructor = SmartBanner
|
||||
$.smartbanner.Constructor = SmartBanner;
|
||||
|
||||
|
||||
// ============================================================
|
||||
// Bootstrap transition
|
||||
// Copyright 2011-2014 Twitter, Inc.
|
||||
// Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
|
||||
function transitionEnd() {
|
||||
var el = document.createElement('smartbanner')
|
||||
|
||||
var transEndEventNames = {
|
||||
WebkitTransition: 'webkitTransitionEnd',
|
||||
MozTransition: 'transitionend',
|
||||
OTransition: 'oTransitionEnd otransitionend',
|
||||
transition: 'transitionend'
|
||||
}
|
||||
|
||||
for (var name in transEndEventNames) {
|
||||
if (el.style[name] !== undefined) {
|
||||
return {end: transEndEventNames[name]}
|
||||
}
|
||||
}
|
||||
|
||||
return false // explicit for ie8 ( ._.)
|
||||
}
|
||||
|
||||
if ($.support.transition !== undefined)
|
||||
return // Prevent conflict with Twitter Bootstrap
|
||||
|
||||
// http://blog.alexmaccaw.com/css-transitions
|
||||
$.fn.emulateTransitionEnd = function(duration) {
|
||||
var called = false, $el = this
|
||||
$(this).one($.support.transition.end, function() {
|
||||
called = true
|
||||
})
|
||||
var callback = function() {
|
||||
if (!called) $($el).trigger($.support.transition.end)
|
||||
}
|
||||
setTimeout(callback, duration)
|
||||
return this
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$.support.transition = transitionEnd()
|
||||
})
|
||||
// ============================================================
|
||||
|
||||
}(window.jQuery);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#smartbanner { position:absolute; left:0; top:-82px; border-bottom:1px solid #e8e8e8; width:100%; height:78px; font-family:'Helvetica Neue',sans-serif; background:-webkit-linear-gradient(top, #f4f4f4 0%,#cdcdcd 100%); background-image: -ms-linear-gradient(top, #F4F4F4 0%, #CDCDCD 100%); background-image: -moz-linear-gradient(top, #F4F4F4 0%, #CDCDCD 100%); box-shadow:0 1px 2px rgba(0,0,0,0.5); z-index:9998; -webkit-font-smoothing:antialiased; overflow:hidden; -webkit-text-size-adjust:none; }
|
||||
#smartbanner, html.sb-animation {-webkit-transition: all .3s ease;}
|
||||
#smartbanner .sb-container { margin: 0 auto; }
|
||||
#smartbanner .sb-close { position:absolute; left:5px; top:5px; display:block; border:2px solid #fff; width:14px; height:14px; font-family:'ArialRoundedMTBold',Arial; font-size:15px; line-height:15px; text-align:center; color:#fff; background:#070707; text-decoration:none; text-shadow:none; border-radius:14px; box-shadow:0 2px 3px rgba(0,0,0,0.4); -webkit-font-smoothing:subpixel-antialiased; }
|
||||
#smartbanner .sb-close:active { font-size:13px; color:#aaa; }
|
||||
|
|
@ -14,7 +15,7 @@
|
|||
|
||||
#smartbanner .sb-icon.gloss:after { content:''; position:absolute; left:0; top:-1px; border-top:1px solid rgba(255,255,255,0.8); width:100%; height:50%; background:-webkit-linear-gradient(top, rgba(255,255,255,0.7) 0%,rgba(255,255,255,0.2) 100%); border-radius:10px 10px 12px 12px; }
|
||||
|
||||
#smartbanner.android { border-color:#212228; background: #3d3d3d; border-top: 5px solid #88B131; box-shadow: none; }
|
||||
#smartbanner.android { border-color:#212228; background: #3d3d3d url('dark_background_stripes.gif'); border-top: 5px solid #88B131; box-shadow: none; }
|
||||
#smartbanner.android .sb-close { border:0; width:17px; height:17px; line-height:17px; color:#b1b1b3; background:#1c1e21; text-shadow:0 1px 1px #000; box-shadow:0 1px 2px rgba(0,0,0,0.8) inset,0 1px 1px rgba(255,255,255,0.3); }
|
||||
#smartbanner.android .sb-close:active { color:#eee; }
|
||||
#smartbanner.android .sb-info { color:#ccc; text-shadow:0 1px 2px #000; }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue