diff --git a/ajax/libs/jquery.smartbanner/1.0.0/dark_background_stripes.gif b/ajax/libs/jquery.smartbanner/1.0.0/dark_background_stripes.gif new file mode 100644 index 000000000..bc2a2ea6e Binary files /dev/null and b/ajax/libs/jquery.smartbanner/1.0.0/dark_background_stripes.gif differ diff --git a/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.css b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.css new file mode 100644 index 000000000..d4a14b244 --- /dev/null +++ b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.css @@ -0,0 +1,25 @@ +#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%); 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 .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; } +#smartbanner .sb-icon { position:absolute; left:30px; top:10px; display:block; width:57px; height:57px; background:rgba(0,0,0,0.6); background-size:cover; border-radius:10px; box-shadow:0 1px 3px rgba(0,0,0,0.3); } +#smartbanner.no-icon .sb-icon { display:none; } +#smartbanner .sb-info { position:absolute; left:98px; top:18px; width:44%; font-size:11px; line-height:1.2em; font-weight:bold; color:#6a6a6a; text-shadow:0 1px 0 rgba(255,255,255,0.8); } +#smartbanner #smartbanner.no-icon .sb-info { left:34px; } +#smartbanner .sb-info strong { display:block; font-size:13px; color:#4d4d4d; line-height: 18px; } +#smartbanner .sb-info > span { display:block; } +#smartbanner .sb-info em { font-style:normal; text-transform:uppercase; } +#smartbanner .sb-button { position:absolute; right:20px; top:24px; border:1px solid #bfbfbf; padding: 0 10px; min-width: 10%; height:24px; font-size:14px; line-height:24px; text-align:center; font-weight:bold; color:#6a6a6a; background:-webkit-linear-gradient(top, #efefef 0%,#dcdcdc 100%); text-transform:uppercase; text-decoration:none; text-shadow:0 1px 0 rgba(255,255,255,0.8); border-radius:3px; box-shadow:0 1px 0 rgba(255,255,255,0.6),0 1px 0 rgba(255,255,255,0.7) inset; } +#smartbanner .sb-button:active, #smartbanner .sb-button:hover { background:-webkit-linear-gradient(top, #dcdcdc 0%,#efefef 100%); } + +#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 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; } +#smartbanner.android .sb-info strong { color:#fff; } +#smartbanner.android .sb-button { min-width: 12%; border:1px solid #DDDCDC; padding:1px; color:#d1d1d1; background: none; border-radius: 0; box-shadow: none; } +#smartbanner.android .sb-button span { text-align: center; display: block; padding: 0 10px; background-color: #42B6C9; background-image: -webkit-gradient(linear,0 0,0 100%,from(#42B6C9),to(#39A9BB)); background-image: -moz-linear-gradient(top,#42B6C9,#39A9BB); text-transform:none; text-shadow:none; box-shadow:none; } +#smartbanner.android .sb-button:active, #smartbanner.android .sb-button:hover { background: none; } +#smartbanner.android .sb-button:active span, #smartbanner.android .sb-button:hover span { background:#2AC7E1; } diff --git a/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.js b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.js new file mode 100644 index 000000000..db6a3ca4f --- /dev/null +++ b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.js @@ -0,0 +1,185 @@ +/*! + * jQuery Smart Banner + * Copyright (c) 2012 Arnold Daniels + * Based on 'jQuery Smart Web App Banner' by Kurt Zenisek @ kzeni.com + */ +!function($) { + var SmartBanner = function(options) { + this.origHtmlMargin = parseFloat($('html').css('margin-top')) // Get the original margin-top of the HTML element so we can take that into account + this.options = $.extend({}, $.smartbanner.defaults, options) + + 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) + + // Detect banner type (iOS or Android) + if (this.options.force) { + this.type = this.options.force + } else if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null) { + if (navigator.userAgent.match(/Safari/i) != null && + (navigator.userAgent.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+) + } else if (navigator.userAgent.match(/Android/i) != null) { + this.type = 'android' + } + + // Don't show banner if device isn't iOS or Android, website is loaded in app or user dismissed banner + if (!this.type || standalone || this.getCookie('sb-closed') || this.getCookie('sb-installed')) { + return + } + + // Calculate scale + this.scale = this.options.scale == 'auto' ? $(window).width() / window.screen.width : this.options.scale + if (this.scale < 1) this.scale = 1 + + // Get info from meta data + var meta = $(this.type=='android' ? 'meta[name="google-play-app"]' : 'meta[name="apple-itunes-app"]') + if (meta.length == 0) return + + this.appId = /app-id=([^\s,]+)/.exec(meta.attr('content'))[1] + 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() + this.show() + this.listen() + } + + SmartBanner.prototype = { + + constructor: SmartBanner + + , create: function() { + var iconURL + , link=(this.options.url ? this.options.url : (this.type=='android' ? 'market://details?id=' : ('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.options.inAppStore) : '' + , gloss=this.options.iconGloss === null ? (this.type=='ios') : this.options.iconGloss + + $('body').append('
×
'+this.title+''+this.author+''+inStore+'
'+this.options.button+'
') + + 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 + } else if ($('link[rel="apple-touch-icon"]').length > 0) { + iconURL = $('link[rel="apple-touch-icon"]').attr('href') + } + if (iconURL) { + $('#smartbanner .sb-icon').css('background-image','url('+iconURL+')') + if (gloss) $('#smartbanner .sb-icon').addClass('gloss') + } else{ + $('#smartbanner').addClass('no-icon') + } + + this.bannerHeight = $('#smartbanner').outerHeight() + 2 + + if (this.scale > 1) { + $('#smartbanner') + .css('top', parseFloat($('#smartbanner').css('top')) * this.scale) + .css('height', parseFloat($('#smartbanner').css('height')) * this.scale) + $('#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) + } + } + + , 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) + } + + , 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) + } + + , close: function(e) { + e.preventDefault() + this.hide() + this.setCookie('sb-closed','true',this.options.daysHidden) + } + + , install: function(e) { + 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()) + document.cookie=name+'='+value+'; path=/;' + } + + , getCookie: function(name) { + var i,x,y,ARRcookies = document.cookie.split(";") + for(i=0;i) + author: null, // What the author of the app should be in the banner (defaults to or hostname) + price: 'FREE', // Price of the app + 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 + icon: null, // The URL of the icon (defaults to ) + iconGloss: null, // Force gloss effect for iOS even for precomposed + button: 'VIEW', // Text for the install button + url: null, // The URL for the button. Keep null if you want the button to link to the app store. + scale: 'auto', // Scale based on viewport size (set to 1 to disable) + speedIn: 300, // Show animation speed of the banner + 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' or 'android'. Don't do a browser check, just always show this banner + } + + $.smartbanner.Constructor = SmartBanner + +}(window.jQuery); diff --git a/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.css b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.css new file mode 100644 index 000000000..2594a171b --- /dev/null +++ b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.css @@ -0,0 +1 @@ +#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%);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 .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}#smartbanner .sb-icon{position:absolute;left:30px;top:10px;display:block;width:57px;height:57px;background:rgba(0,0,0,0.6);background-size:cover;border-radius:10px;box-shadow:0 1px 3px rgba(0,0,0,0.3)}#smartbanner.no-icon .sb-icon{display:none}#smartbanner .sb-info{position:absolute;left:98px;top:18px;width:44%;font-size:11px;line-height:1.2em;font-weight:bold;color:#6a6a6a;text-shadow:0 1px 0 rgba(255,255,255,0.8)}#smartbanner #smartbanner.no-icon .sb-info{left:34px}#smartbanner .sb-info strong{display:block;font-size:13px;color:#4d4d4d;line-height:18px}#smartbanner .sb-info>span{display:block}#smartbanner .sb-info em{font-style:normal;text-transform:uppercase}#smartbanner .sb-button{position:absolute;right:20px;top:24px;border:1px solid #bfbfbf;padding:0 10px;min-width:10%;height:24px;font-size:14px;line-height:24px;text-align:center;font-weight:bold;color:#6a6a6a;background:-webkit-linear-gradient(top,#efefef 0,#dcdcdc 100%);text-transform:uppercase;text-decoration:none;text-shadow:0 1px 0 rgba(255,255,255,0.8);border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,0.6),0 1px 0 rgba(255,255,255,0.7) inset}#smartbanner .sb-button:active,#smartbanner .sb-button:hover{background:-webkit-linear-gradient(top,#dcdcdc 0,#efefef 100%)}#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 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}#smartbanner.android .sb-info strong{color:#fff}#smartbanner.android .sb-button{min-width:12%;border:1px solid #dddcdc;padding:1px;color:#d1d1d1;background:0;border-radius:0;box-shadow:none}#smartbanner.android .sb-button span{text-align:center;display:block;padding:0 10px;background-color:#42b6c9;background-image:-webkit-gradient(linear,0 0,0 100%,from(#42b6c9),to(#39a9bb));background-image:-moz-linear-gradient(top,#42b6c9,#39a9bb);text-transform:none;text-shadow:none;box-shadow:none}#smartbanner.android .sb-button:active,#smartbanner.android .sb-button:hover{background:0}#smartbanner.android .sb-button:active span,#smartbanner.android .sb-button:hover span{background:#2ac7e1} \ No newline at end of file diff --git a/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.js b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.js new file mode 100644 index 000000000..19758dfd9 --- /dev/null +++ b/ajax/libs/jquery.smartbanner/1.0.0/jquery.smartbanner.min.js @@ -0,0 +1,6 @@ +/*! + * jQuery Smart Banner + * Copyright (c) 2012 Arnold Daniels + * Based on 'jQuery Smart Web App Banner' by Kurt Zenisek @ kzeni.com + */ +!function($){var SmartBanner=function(options){this.origHtmlMargin=parseFloat($("html").css("margin-top"));this.options=$.extend({},$.smartbanner.defaults,options);var standalone=navigator.standalone;if(this.options.force){this.type=this.options.force}else if(navigator.userAgent.match(/iPad|iPhone|iPod/i)!=null){if(navigator.userAgent.match(/Safari/i)!=null&&(navigator.userAgent.match(/CriOS/i)!=null||window.Number(navigator.userAgent.substr(navigator.userAgent.indexOf("OS ")+3,3).replace("_","."))<6))this.type="ios"}else if(navigator.userAgent.match(/Android/i)!=null){this.type="android"}if(!this.type||standalone||this.getCookie("sb-closed")||this.getCookie("sb-installed")){return}this.scale=this.options.scale=="auto"?$(window).width()/window.screen.width:this.options.scale;if(this.scale<1)this.scale=1;var meta=$(this.type=="android"?'meta[name="google-play-app"]':'meta[name="apple-itunes-app"]');if(meta.length==0)return;this.appId=/app-id=([^\s,]+)/.exec(meta.attr("content"))[1];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");this.create();this.show();this.listen()};SmartBanner.prototype={constructor:SmartBanner,create:function(){var iconURL,link=this.options.url?this.options.url:(this.type=="android"?"market://details?id=":"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.options.inAppStore):"",gloss=this.options.iconGloss===null?this.type=="ios":this.options.iconGloss;$("body").append('
×
'+this.title+""+this.author+""+inStore+'
'+this.options.button+"
");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}else if($('link[rel="apple-touch-icon"]').length>0){iconURL=$('link[rel="apple-touch-icon"]').attr("href")}if(iconURL){$("#smartbanner .sb-icon").css("background-image","url("+iconURL+")");if(gloss)$("#smartbanner .sb-icon").addClass("gloss")}else{$("#smartbanner").addClass("no-icon")}this.bannerHeight=$("#smartbanner").outerHeight()+2;if(this.scale>1){$("#smartbanner").css("top",parseFloat($("#smartbanner").css("top"))*this.scale).css("height",parseFloat($("#smartbanner").css("height"))*this.scale);$("#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)}},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)},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)},close:function(e){e.preventDefault();this.hide();this.setCookie("sb-closed","true",this.options.daysHidden)},install:function(e){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());document.cookie=name+"="+value+"; path=/;"},getCookie:function(name){var i,x,y,ARRcookies=document.cookie.split(";");for(i=0;i