diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fbe05fc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/README.md b/README.md index 9fc7e70..b165ef0 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,29 @@ Card Board ========= -A better New Tab Page with sleek google design and useful features +The default New Tab is not Google enough ? Try Cardboard, Now with more Material Design (plus nifty features) -[Google page](https://plus.google.com/115967816314012668475/about) -[Chrome Web Store](https://chrome.google.com/webstore/detail/card-board-new-tab-page/hilmkmopmiomkmehbhajigccnglobaap) +[Google + page](https://plus.google.com/115967816314012668475/about) -![Card Board in action](https://lh5.googleusercontent.com/iAKjcXap0xU3zy3z91IqbS6Qr0RfikKpimiRSefXcpR8w4pP3ZTtvS9UFrznXcLGpWdW2Kzzyg=s640-h400-e365-rw) +v2.0.0 screenshot +![Cardboard Material](https://i.imgur.com/ONHiF9q.png) +##Installation -###Permissions -- https://suggestqueries.google.com/* : to get autocomplete suggestions -- downloads : to display your recent downloads (can't be optional due to API/manifest limitation) -(more info here: http://developer.chrome.com/extensions/manifest.html) -- downloads.open is required with the new download card. It allows you to open files you have downloaded when clicking on it. +*Warning: This is for development purpose and not the right way to get the extension for daily use. If you want the stable version head over the [Chrome Web Store](https://chrome.google.com/webstore/detail/card-board-new-tab-page/hilmkmopmiomkmehbhajigccnglobaap) and install it from here.* -###Optional Permissions: -- bookmarks: to display your bookmarks -- management: to display your apps -- topSites: to display your most visited websites +1. `bower install` +2. open [chrome://extensions/](chrome://extensions/) +3. on top-right corner tick **Developer Mode** +4. Click Load unpack extension and choose the root cardboard folder + +## Notes on permissions + +- https://hawttrends.appspot.com/api/terms/: to get trends +- **downloads**: to display your recent downloads (can't be optional due to API/manifest limitation) +(see: http://developer.chrome.com/extensions/manifest.html) +- **downloads.open**: to open files you have downloaded from the download card (can't be optional) + +- [Optional] **bookmarks**: to display your bookmarks +- [Optional] **management**: to display your apps +- [Optional] **topSites**: to display your most visited websites diff --git a/app/cardboard.js b/app/cardboard.js new file mode 100644 index 0000000..ee31367 --- /dev/null +++ b/app/cardboard.js @@ -0,0 +1,230 @@ +angular.module('cardboard', [ + 'ngRoute', + 'angular-packery', + 'cardboard.controllers', + 'cardboard.factories', + 'cardboard.directives', + 'cardboard.filters' +]) + +.config(['$routeProvider','$compileProvider', function($routeProvider, $compileProvider) { + $routeProvider + .when('/feed', { + controller: 'FeedCtrl', + templateUrl: 'app/templates/Feed.html' + }) + .when('/settings', { + controller: 'SettingsCtrl', + templateUrl: 'app/templates/Settings.html' + }) + // .when('/onboarding', { + // controller: 'OnboardingCtrl', + // templateUrl: 'app/templates/Onboarding.html' + // }) + .otherwise({ redirectTo: '/feed'}); + + // sanitize urls from chrome-extension + $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|chrome-extension):/); +}]) + + +.value('DefaultSettings',{ + version: { "update": 4, "settings": 4}, + + // imgur album: https://imgur.com/a/NAaUE + backgrounds : [ + { + id: 0, + name: "Austin", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/7ndeJog.png", + day: "https://i.imgur.com/FsJ8mCW.png", + dusk: "https://i.imgur.com/Mmwv5GQ.png", + night: "https://i.imgur.com/brJBKA3.png" + } + }, + { + id: 1, + name: "Beach", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/Q5Tn8u9.png", + day: "https://i.imgur.com/dTFXUxt.png", + dusk: "https://i.imgur.com/vdO9Ote.png", + night: "https://i.imgur.com/YaoPX9P.png" + } + }, + { + id: 2, + name: "Berlin", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/jG1OdPc.png", + day: "https://i.imgur.com/lnILrRU.png", + dusk: "https://i.imgur.com/ZCJVfSn.png", + night: "https://i.imgur.com/5mN7Iau.png" + } + }, + { + id: 3, + name: "Chicago", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/f4HUPlZ.png", + day: "https://i.imgur.com/t5wzT8j.png", + dusk: "https://i.imgur.com/XrJi3O1.png", + night: "https://i.imgur.com/xDWHJ45.png" + } + }, + { + id: 4, + name: "Default", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/kJFNQLr.png", + day: "https://i.imgur.com/foVYQ6T.png", + dusk: "https://i.imgur.com/dW217U5.png", + night: "https://i.imgur.com/87UObPk.png" + } + }, + { + id: 5, + name: "Great Plains", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/dWzcGbr.png", + day: "https://i.imgur.com/huGlyp2.png", + dusk: "https://i.imgur.com/XNUMKAT.png", + night: "https://i.imgur.com/d7KaqQ1.png" + } + }, + { + id: 6, + name: "London", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/ZD0XBoz.jpg", + day: "https://i.imgur.com/C2Sg6JG.jpg", + dusk: "https://i.imgur.com/Qb8PHnA.jpg", + night: "https://i.imgur.com/k0idCJG.jpg" + } + }, + { + id: 7, + name: "New York", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/JVK8ID7.png", + day: "https://i.imgur.com/yB93g10.png", + dusk: "https://i.imgur.com/z4elpiG.png", + night: "https://i.imgur.com/lh0LV5L.png" + } + }, + { + id: 8, + name: "Paris", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/c3wAjp2.png", + day: "https://i.imgur.com/c3wAjp2.png", + dusk: "https://i.imgur.com/vmfdH9T.png", + night: "https://i.imgur.com/vmfdH9T.png" + } + }, + { + id: 9, + name: "San Francisco", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/fqewVsW.png", + day: "https://i.imgur.com/lUZp177.png", + dusk: "https://i.imgur.com/XP6Omxa.png", + night: "https://i.imgur.com/NATsgio.png" + } + }, + { + id: 10, + name: "Seatte", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/7nsrzRK.jpg", + day: "https://i.imgur.com/0E2xXb0.jpg", + dusk: "https://i.imgur.com/wYytDhF.jpg", + night: "https://i.imgur.com/ddI0eBh.jpg" + } + }, + { + id: 11, + name: "Tahoe", + type: "Google Now", + url: { + dawn: "https://i.imgur.com/ZSXPIkL.jpg", + day: "https://i.imgur.com/xeVYGPU.jpg", + dusk: "https://i.imgur.com/Buxx2Cs.jpg", + night: "https://i.imgur.com/g761v2t.jpg" + } + } + ], + backgroundId : 4, + trends : { + url: "https://hawttrends.appspot.com/api/terms/", + enabled: true + }, + cards : [ + { + name: "apps", + enabled: false, + template: "app/templates/cards/AppCard.html", + permissions: ["management"] + }, + { + name: "bookmarks", + enabled: false, + template: "app/templates/cards/BookmarkCard.html", + permissions: ["bookmarks"] + }, + { + name: "quick_settings", + enabled: false, + template: "app/templates/cards/QuickSettingsCard.html", + permissions: ["browsingData"] + }, + { + name: "downloads", + enabled: false, + template: "app/templates/cards/DownloadCard.html", + permissions: ["downloads"] + }, + { + name: "top_sites", + enabled: false, + template: "app/templates/cards/TopSitesCard.html", + permissions: ["topSites"] + }, + { + name: "history", + enabled: false, + template: "app/templates/cards/HistoryCard.html", + permissions: ["history"] + }, + { + name: "sessions", + enabled: false, + template: "app/templates/cards/SessionsCard.html", + permissions: ["sessions", "tabs"] + }, + { + name: "system", + enabled: false, + template: "app/templates/cards/SystemCard.html", + permissions: ["system.cpu", "system.memory", "system.storage"] + } + + // {name: "changelog", system: true, enabled: false, template: "app/templates/cards/ChangelogCard.html" } + // {name: "appearance", system: true, enabled: true, template: "app/templates/cards/AppearanceCard.html" }, + // {name: "cards", system: true, enabled: true, template: "app/templates/cards/CardsCard.html" }, + // {name: "about", system: true, enabled: true, template: "app/templates/cards/AboutCard.html" } + ], + faviconURL: "https://www.google.com/s2/favicons?domain_url=" +}); diff --git a/app/controllers/AppCtrl.js b/app/controllers/AppCtrl.js new file mode 100644 index 0000000..541d513 --- /dev/null +++ b/app/controllers/AppCtrl.js @@ -0,0 +1,60 @@ +angular.module('cardboard.controllers') + +.controller('AppCtrl', ['$scope','ChromeFactory', function($scope, Chrome){ + $scope.apps = []; + $scope.extensions = []; + $scope.themes = []; + + Chrome.management.getAllAsync() + .then(function(all){ + angular.forEach(all, function(value, key){ + if(value.type == "extension") + $scope.extensions.push(value); + else if (value.type == "theme") + $scope.themes.push(value); + else if(value.enabled){ + if($scope.$parent.card.settings && $scope.$parent.card.settings[value.id]) + value.frequency = $scope.$parent.card.settings[value.id].frequency; + else + value.frequency = 0; + + $scope.apps.push(value); + } + }); + $scope.$apply(); + $('.card.apps .tooltipped').tooltip({delay: 1000}); + }); + + $scope.launch = function(){ + if(this.app.launchType == "OPEN_AS_WINDOW") + Chrome.management.launchApp(this.app.id); + } + + $scope.getIcon = function(){ + var icon_url; + if(this.app.icons) + icon_url = this.app.icons[this.app.icons.length-1].url; + else + icon_url = "chrome://extension-icon/khopmbdjffemhegeeobelklnbglcdgfh/256/1"; + if(!this.app.enabled) + icon_url+="?grayscale=true"; + return icon_url; + }; + + $scope.updateFrequency = function(){ + if(!$scope.$parent.card.settings) + $scope.$parent.card.settings = {}; + + // If frequency not defined we put 1 else we increment it + if(!$scope.$parent.card.settings[this.app.id]) + $scope.$parent.card.settings[this.app.id] = {'frequency': 1}; + else if($scope.$parent.card.settings[this.app.id].frequency) + $scope.$parent.card.settings[this.app.id] = {'frequency': $scope.$parent.card.settings[this.app.id].frequency+1}; + + // We don't update scope to avoid suddenly changing apps position after click + + // We save frequency in storage + Chrome.storage.setAsync({'cards': $scope.$parent.cards}); + }; + +}]); diff --git a/app/controllers/BookmarkCtrl.js b/app/controllers/BookmarkCtrl.js new file mode 100644 index 0000000..f83106f --- /dev/null +++ b/app/controllers/BookmarkCtrl.js @@ -0,0 +1,36 @@ +angular.module('cardboard.controllers') + +.controller('BookmarkCtrl', ['$scope','ChromeFactory', function($scope, Chrome){ + // init tabs + $('.card.bookmarks .tabs').tabs(); + $('.card.bookmarks .tabs').tabs('select_tab', 'recent-bookmarks'); + + Chrome.bookmarks.getRecentAsync(5).then(function(recents){ + $scope.recents = recents; + $scope.$apply(); + }); + + // get root bookmarks + Chrome.bookmarks.getChildrenAsync("0").then(function(root){ + $scope.tree = root; + $scope.$apply(); + }); + + $scope.getChildren = function(id){ + Chrome.bookmarks.getChildrenAsync(id).then(function(children){ + if(children.length > 0){ + $scope.tree = children; + return Chrome.bookmarks.getAsync(children[0].parentId); + } + else + return Promise.reject("Empty"); + }) + .then(function(parent){ + $scope.parentNode = parent[0]; + $scope.$apply(); + }) + .catch(function(error){ + toast(error, 4000); + }); + }; +}]); diff --git a/app/controllers/DownloadCtrl.js b/app/controllers/DownloadCtrl.js new file mode 100644 index 0000000..b5795b8 --- /dev/null +++ b/app/controllers/DownloadCtrl.js @@ -0,0 +1,121 @@ +angular.module('cardboard.controllers') + +.controller('DownloadCtrl', ['$scope','ChromeFactory','fromNowFilter','humanizeFilter', function($scope, Chrome, fromNow, humanize){ + $scope.downloads = []; + + // get recent Downloads + Chrome.downloads.searchAsync({limit: 15, orderBy: ['-startTime']}) + .map(function(download, index, arrayLength){ + // Avoid a case where fetching icons with no filename throws an error + if(download.filename){ + // fetch their icon + return Chrome.downloads.getFileIconAsync(download.id) + .then(function(dataUrl){ + download.icon = dataUrl; + return download; + }); + } + else + return download; + }) + .then(function(downloads){ + $scope.downloads = downloads; + $scope.$apply(); + // init all dropdowns + $scope.initDropdowns('.card.downloads .download .more'); + }); + + // Watch changes in download states and apply them to the model + Chrome.downloads.onChanged.addListener(function(downloadDelta){ + for (i in $scope.downloads) + if($scope.downloads[i].id == downloadDelta.id){ + for (j in downloadDelta) + if(j != "id") + $scope.downloads[i][j] = downloadDelta[j].current; + break; + } + + $scope.$apply(); + }); + + // Watch if a download is created and add it to the card + Chrome.downloads.onCreated.addListener(function(download){ + $scope.downloads.pop(); // remove the last element + $scope.downloads.unshift(download); // add the newly created at the beggining + + // wait 500ms after download starts to get the icon + Promise.delay(500).then(function(){ + // Avoid a case where fetching icons with no filename throws an error + if(download.filename) + return Chrome.downloads.getFileIconAsync(download.id); + else + throw new Error("No filename"); + }) + .then(function(dataUrl){ + for(var i in $scope.downloads) + if($scope.downloads[i].id == download.id){ + $scope.downloads[i].icon = dataUrl; + break; + } + // Should init the new new dropdown but doesn't work + // $scope.initDropdowns('#dropdown-'+download.id); + }) + .finally(function(){$scope.$apply();}); + }); + + $scope.open = function(){ + if(this.download.state == "interrupted") + toast(humanize(this.download.error), 4000); + else if(this.download.state == "complete"){ + if(this.download.exists) + Chrome.downloads.open(this.download.id); + else + toast("File moved or deleted", 4000); + } + }; + $scope.resume = function(){ + Chrome.downloads.resumeAsync(this.download.id); + }; + $scope.pause = function(){ + Chrome.downloads.pauseAsync(this.download.id); + }; + $scope.cancel = function(){ + Chrome.downloads.cancelAsync(this.download.id); + }; + $scope.retry = function(){ + Chrome.downloads.downloadAsync({url: this.download.url}); + }; + $scope.remove = function(){ + Chrome.downloads.eraseAsync({id: this.download.id}) + .then(function(erased){ + for(var i in $scope.downloads) + if($scope.downloads[i].id == erased[0]){ + $scope.downloads.splice(i, 1); + break; + } + $scope.$apply(); + }); + }; + $scope.show = function(){ + Chrome.downloads.show(this.download.id); + }; + + $scope.getStatus = function(){ + var str; + + if(this.download.state == "in_progress"){ + if(this.download.paused) + str = "Paused"; + else + str = fromNow(this.download.estimatedEndTime); + } + else if(this.download.state == "interrupted"){ + str = humanize(this.download.error); + } + else if(this.download.state == "complete"){ + str = fromNow(this.download.endTime); + } + return str; + }; + +}]); diff --git a/app/controllers/FeedCtrl.js b/app/controllers/FeedCtrl.js new file mode 100644 index 0000000..5c2487d --- /dev/null +++ b/app/controllers/FeedCtrl.js @@ -0,0 +1,13 @@ +angular.module('cardboard.controllers') + +.controller('FeedCtrl',['$scope', function($scope){ + + $scope.isDrag = false; + // see http://packery.metafizzy.co/faq.html#order-after-drag + // and http://packery.metafizzy.co/methods.html#packery-data + // var pckryElement = document.querySelector('#feed > div'); + // console.log(pckryElement); + // var pckry = Packery.data(pckryElement); + // console.log(pckry.getItemElements()); + +}]); diff --git a/app/controllers/HistoryCtrl.js b/app/controllers/HistoryCtrl.js new file mode 100644 index 0000000..f3c0f6f --- /dev/null +++ b/app/controllers/HistoryCtrl.js @@ -0,0 +1,13 @@ +angular.module('cardboard.controllers') + +.controller('HistoryCtrl', ['$scope','ChromeFactory', function($scope, Chrome){ + $scope.maxHistory = 5; + + Chrome.history.searchAsync({ + text: "", // empty for all pages + maxResults: $scope.maxHistory + }).then(function(history){ + $scope.history = history; + $scope.$apply(); + }); +}]); diff --git a/app/controllers/QuickSettingsCtrl.js b/app/controllers/QuickSettingsCtrl.js new file mode 100644 index 0000000..93ceca7 --- /dev/null +++ b/app/controllers/QuickSettingsCtrl.js @@ -0,0 +1,59 @@ +angular.module('cardboard.controllers') + +.controller('QuickSettingsCtrl', ['$rootScope','$scope','ChromeFactory', function($rootScope, $scope, Chrome){ + + $scope.clearTypes = { + "cache": false, + "cookies": false, + "history": false, + "localStorage": false, + }; + + function isAllFalse(object){ + for (var key in object) + if (object.hasOwnProperty(key)) + if(object[key] !== false) + return false; + return true; + } + + $scope.clearDisabled = function(){ + return $scope.isClearing || isAllFalse($scope.clearTypes); + } + + $scope.clearText = "Clear"; + $scope.isClearing = false; + $scope.waveTimeout = true; + + $scope.clear = function(){ + // forbid spamming button immediately + if(!$scope.clearDisabled()){ + // general progress bar + $rootScope.loading = true; + $scope.waveTimeout = false; + $scope.isClearing = true; + + // wait 500ms until the wave animation ends before disabing it + Promise.delay(500) + .then(function(){ + if($scope.isClearing) + $scope.clearText = "Clearing"; + $scope.waveTimeout = true; + $scope.$apply(); + }); + + Chrome.browsingData.removeAsync({since: 0},$scope.clearTypes) + // Promise.delay(3000) //mocks + .then(function(){ + // completed + $rootScope.loading = false; + $scope.clearText = "Clear"; + $scope.isClearing = false; + $scope.waveTimeout = true; + $scope.$apply(); + toast("Cleared !", 4000); + }); + + } + } +}]); diff --git a/app/controllers/RootCtrl.js b/app/controllers/RootCtrl.js new file mode 100644 index 0000000..394c0c2 --- /dev/null +++ b/app/controllers/RootCtrl.js @@ -0,0 +1,159 @@ +angular.module('cardboard.controllers') + +.controller('RootCtrl',['$scope','$location','$http','DefaultSettings','ChromeFactory',function($scope, $location, $http, DefaultSettings, Chrome){ + + /********* USEFUL FUNCTIONS **********/ + + // Shuffles an array + function shuffle(o){ + for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); + return o; + } + + // Determine if 2 dates are the same day (time independent) + Date.prototype.isSameDateAs = function(pDate) { + return ( + this.getFullYear() === pDate.getFullYear() && + this.getMonth() === pDate.getMonth() && + this.getDate() === pDate.getDate() + ); + }; + + $scope.getFavicon = function(url){ + return DefaultSettings.faviconURL + encodeURI(url); + }; + + $scope.initDropdowns = function(selector){ + $(selector).dropdown({ + inDuration: 300, + outDuration: 225, + constrain_width: false, // Does not change width of dropdown to that of the activator + hover: false, // Activate on click + alignment: 'right', // Aligns dropdown to left or right edge (works with constrain_width) + gutter: 0 // Spacing from edge + }); + }; + + // Allows views to know in which route they are + $scope.route = function(){ + return $location.path(); + }; + + /********* INIT STUFF **********/ + + var trendsDataDeferred = Promise.defer(); + $scope.trendsData = trendsDataDeferred.promise; + + // Get storage (null == root object) + var syncStorage = Chrome.storage.getAsync(null).then(function(storage){ + // If storage empty or settings version is older ... + if((Object.keys(storage).length == 0) || (storage.version && storage.version.settings < DefaultSettings.version.settings)){ + // ... we clear storage, set it to default and return it + return Chrome.storage.clearAsync().then(function(){ + return Chrome.storage.setAsync(DefaultSettings); + }) + .then(function(){ + return DefaultSettings; + }); + } + else + return storage; + }); + + var localStorage = Chrome.cache.getAsync(null); + + Promise.all([syncStorage,localStorage]) + // Once we get all the settings, we fill the scope with it + .then(function(storage){ + var settings = storage[0]; + var cache = storage[1]; + + // If local background (dataURl) we get it from cache + for(var i in settings.backgrounds) + if(settings.backgrounds[i].type == "Local" && settings.backgrounds[i].url) + settings.backgrounds[i].url = cache.localBackgroundDataUrl; + + // Fill the scope + $scope.backgrounds = settings.backgrounds; + $scope.background = settings.backgrounds[settings.backgroundId]; + + $scope.trends = settings.trends; + + // Check each card permissions + Promise.map(settings.cards, function(card){ + return Chrome.permissions.check(card.permissions) + .then(function(granted){ + // Disable the card if not granted AND enabled + card.enabled = (granted && card.enabled); + return card; + }); + }) + .then(function(cards){ + $scope.cards = cards; + }); + + // load new trends of the day + if(!settings.trends.lastRefresh || !(new Date(settings.trends.lastRefresh).isSameDateAs(new Date()))){ + $http.get(settings.trends.url) + // Load trends (even if disabled to allow quick toggle) + .success(function(data) { + var allTrends = []; + for(var i=0; i<12; i++) + if(data[i]) // some data is undefined + allTrends = allTrends.concat(data[i]); + + // update the lastRefresh Date, update storage and resolve data + $scope.trends['lastRefresh'] = new Date().toString(); + Chrome.storage.setAsync({trends: $scope.trends}); + // Note: trends data is stored in local storage as opposed to + // others settings because it would take up too much space and + // exceed the QUOTA_BYTES_PER_ITEM storage limit of Chrome + Chrome.cache.setAsync({trendsData: allTrends}); + trendsDataDeferred.resolve(shuffle(allTrends)); + }) + .error(function(error){ + toast("Can't load trends", 4000); + trendsDataDeferred.resolve(['Google Trends']); + }); + } + else + Chrome.cache.getAsync('trendsData').then(function(cache){ + trendsDataDeferred.resolve(shuffle(cache.trendsData)); + }); + }); + + /********* HEADER BACKGROUND FUNCTIONS **********/ + + $scope.getBackgroundStyle = function(){ + var style = { + backgroundPosition: "center", + backgroundSize: "cover" + }; + // check background property exists to avoid errors due to promise not + // beeing resolved yet + if($scope.background){ + if($scope.background.type == "Google Now") + style.backgroundImage = "url("+getBackgroundTime($scope.background.url)+")"; + else if($scope.background.url) + style.backgroundImage = "url("+$scope.background.url+")"; + } + return style; + }; + + function getBackgroundTime(url){ + var date = new Date; + date.setTime(date); + var hour = date.getHours(); + var time; + + if (hour>5 && hour<8) + time = url.dawn; + else if (hour>8 && hour<19) + time = url.day; + else if (hour>19 && hour<21) + time = url.dusk; + else + time = url.night; + return time; + } +}]); diff --git a/app/controllers/SessionsCtrl.js b/app/controllers/SessionsCtrl.js new file mode 100644 index 0000000..35943f2 --- /dev/null +++ b/app/controllers/SessionsCtrl.js @@ -0,0 +1,57 @@ +angular.module('cardboard.controllers') + +.controller('SessionsCtrl', ['$scope','ChromeFactory', function($scope, Chrome){ + $scope.maxDevices = 5; + $scope.maxDeviceTabs = 5; + $scope.maxRecentlyClosed = 5; + + var willGetRecentlyClosed = Chrome.sessions.getRecentlyClosedAsync({ + maxResults: $scope.maxRecentlyClosed + }).then(function(recentlyClosed){ + $scope.recentlyClosed = mergeTabsAndWindows(recentlyClosed); + }); + + var willGetDevices = Chrome.sessions.getDevicesAsync({ + maxResults: $scope.maxDevices + }).then(function(devices){ + for(var d in devices) + devices[d]['tabs'] = mergeTabsAndWindows(devices[d].sessions); + $scope.devices = devices; + }); + + + Promise.all([willGetDevices, willGetRecentlyClosed]) + .then(function(){ + $scope.$apply(); + $('.card.sessions .tabs').tabs(); + // dirty fix for the tab indicator to display at correct size + setTimeout(function () { + $('.card.sessions .tabs').tabs('select_tab', 'tab-content-recent'); + }, 250); + }); + + // Return an array of tabs wether the input object contains tabs + // or windows of tabs + function mergeTabsAndWindows(sessionItem){ + var tabs = []; + for(var i in sessionItem){ + // If it's a tab we push it with lastModified value + if(sessionItem[i].tab){ + var tab = sessionItem[i].tab; + tab['lastModified'] = moment.unix(sessionItem[i].lastModified); + tabs.push(tab); + } + // If it's a window we gather each tab and add them to the others + // e.g: we don't care about the difference between tabs and windows + else if(sessionItem[i].window){ + for(var j in sessionItem[i].window.tabs){ + var tab = sessionItem[i].window.tabs[j]; + tab['lastModified'] = moment.unix(sessionItem[i].lastModified); + tabs.push(tab); + } + } + } + return tabs; + } + +}]); diff --git a/app/controllers/SettingsCtrl.js b/app/controllers/SettingsCtrl.js new file mode 100644 index 0000000..7448332 --- /dev/null +++ b/app/controllers/SettingsCtrl.js @@ -0,0 +1,105 @@ +angular.module('cardboard.controllers') + +.controller('SettingsCtrl',['$scope','$q','ChromeFactory',function($scope, $q, Chrome){ + + //init tooltips + $('.tooltipped').tooltip({delay: 50}); + + $scope.saveBackgroundFromDevice = function(){ + // backgroundFromDevice is defined into (directive) + if(!this.backgroundFromDevice) + toast("no file selected", 4000); + else + this.backgroundFromDevice.then(function(bg){ + $scope.backgroundSave({ + name: bg.filename, + type: "Local", + url: bg.dataUrl + }); + }); + }; + + $scope.saveBackgroundFromUrl = function(){ + // backgroundFromUrl is defined via ng-model (view) + if(!this.backgroundFromUrl) + toast("invalid URL", 4000); + else{ + $scope.backgroundSave({ + name: this.backgroundFromUrl.substring(this.backgroundFromUrl.lastIndexOf('/')+1), + type: "URL", + url: this.backgroundFromUrl + }); + } + }; + + $scope.openUrl = function(){ + $('#modalBgUrl').openModal(); + }; + + $scope.openLocal = function(){ + $('#modalBgDevice').openModal(); + }; + + $scope.request = function(){ + var self = this; + // if card is enabled + if(self.card.enabled) + Chrome.permissions.request(self.card.permissions) + .then(function(){ + // Granted, we save the change + $scope.save('cards', $scope.cards); + }) + .catch(function(){ + // Denied, we don't enable the card + self.card.enabled = false; + toast("Card needs permission to run", 4000); + }); + else if(!self.card.enabled) + Chrome.permissions.revoke(self.card.permissions) + .then(function(){ + $scope.save('cards', $scope.cards); + }); + }; + + $scope.save = function(storageKey, value){ + var toSave = {}; + toSave[storageKey] = value; + Chrome.storage.setAsync(toSave); + }; + + $scope.backgroundSave = function(bg){ + var bgIndex = $scope.$parent.backgrounds.length; + + // identify previous background (url or local) + for(var i=0; i<$scope.$parent.backgrounds.length; i++) + if($scope.$parent.backgrounds[i].type == bg.type && $scope.$parent.backgrounds[i].url){ + bgIndex = i; + break; + } + + // Add the determinded id + bg.id = bgIndex; + // Update the scope (add the new background in the list) + $scope.$parent.backgrounds[bgIndex] = bg; + $scope.$parent.background = bg; + // $scope.backgroundSelect = bg; + $scope.$parent.backgroundId = bgIndex; + + // Create a copy of $scope.$parent.backgrounds + var bgs = JSON.parse(JSON.stringify($scope.$parent.backgrounds)); + + // Save the background dataUrl to the cache + if(bg.type == "Local") + Chrome.cache.setAsync({"localBackgroundDataUrl": bg.url}); + + // Remove dataUrl because it's too big to fit sync storage + for(var i in bgs) + if(bgs[i].type == "Local") + bgs[i].url = true; + + Chrome.storage.setAsync({ + 'backgrounds': bgs, + 'backgroundId': bg.id + }); + }; +}]); diff --git a/app/controllers/SystemCtrl.js b/app/controllers/SystemCtrl.js new file mode 100644 index 0000000..2f46080 --- /dev/null +++ b/app/controllers/SystemCtrl.js @@ -0,0 +1,49 @@ +angular.module('cardboard.controllers') + +.controller('SystemCtrl', ['$scope','ChromeFactory',function($scope, Chrome){ + + Chrome.system.cpu.getInfoAsync().then(function(cpu){ + $scope.cpu = cpu; + }); + + Chrome.system.memory.getInfoAsync().then(function(memory){ + $scope.memory = memory; + }); + + Chrome.system.storage.getInfoAsync().then(function(storage){ + $scope.storage = storage; + }); + + Chrome.system.storage.onAttached.addListener(function(storage){ + $scope.storage.push(storage); + $scope.$apply(); + }); + + Chrome.system.storage.onDetached.addListener(function(storageId){ + for(var i in $scope.storage) + if($scope.storage[i].id == storageId) + $scope.storage.splice(i,1); + + $scope.$apply(); + }); + + $scope.getCpuLoad = function(cpuIndex){ + return Chrome.system.cpu.getInfoAsync().then(function(cpu){ + return { + progress: cpu.processors[cpuIndex].usage.kernel + + cpu.processors[cpuIndex].usage.user, + total: cpu.processors[cpuIndex].usage.total + }; + }); + }; + + $scope.getMemoryLoad = function(){ + return Chrome.system.memory.getInfoAsync().then(function(memory){ + $scope.memory = memory; + return { + progress: memory.capacity - memory.availableCapacity, + total: memory.capacity + }; + }); + }; +}]); diff --git a/app/controllers/TopSitesCtrl.js b/app/controllers/TopSitesCtrl.js new file mode 100644 index 0000000..81938ee --- /dev/null +++ b/app/controllers/TopSitesCtrl.js @@ -0,0 +1,10 @@ +angular.module('cardboard.controllers') + +.controller('TopSitesCtrl', ['$scope','ChromeFactory', function($scope, Chrome){ + $scope.maxTopSites = 5; + + Chrome.topSites.getAsync().then(function(topSites){ + $scope.topSites = topSites; + $scope.$apply(); + }); +}]); diff --git a/app/controllers/bootstrap.js b/app/controllers/bootstrap.js new file mode 100644 index 0000000..121ef5e --- /dev/null +++ b/app/controllers/bootstrap.js @@ -0,0 +1 @@ +angular.module('cardboard.controllers',[]); diff --git a/app/directives/BgPick.js b/app/directives/BgPick.js new file mode 100644 index 0000000..293c7af --- /dev/null +++ b/app/directives/BgPick.js @@ -0,0 +1,32 @@ +angular.module('cardboard.directives') + +.directive('bgPick', ['$q',function($q) { + return { + restrict: 'E', + replace: true, + template: '', + link: function(scope, elem, attrs) { + + elem.bind('change', function(input) { + + if (input.target.files && input.target.files[0]) { + var reader = new FileReader(); + + // read file + reader.readAsDataURL(input.target.files[0]); + + // create a promise for when file reading is done + var deferred = $q.defer(); + scope.backgroundFromDevice = deferred.promise; + reader.onload = function(e){ + // resolve the promise with file data + deferred.resolve({ + filename: input.target.value.replace("C:\\fakepath\\",""), + dataUrl: e.target.result + }); + }; + } + }); + } + }; +}]); diff --git a/app/directives/PieDownloader.js b/app/directives/PieDownloader.js new file mode 100644 index 0000000..f087dae --- /dev/null +++ b/app/directives/PieDownloader.js @@ -0,0 +1,61 @@ +angular.module('cardboard.directives') + +.directive('pieDownloader', ['ChromeFactory','$interval','$timeout', function(Chrome, $interval, $timeout) { + return { + scope:{ + stream: "=" + }, + link: function(scope, elem, attrs) { + + // create the canvas and appends it in the element + var canvas = document.createElement('canvas'); + var savedIconUrl = scope.stream.iconUrl; + canvas.width = canvas.height = 38; + elem.prepend(canvas); + var ctx = canvas.getContext('2d'); + + Math.TAU = 2 * Math.PI; + + // Draw one time the progression + drawProgressSpinner(ctx, (scope.stream.bytesReceived / scope.stream.totalBytes)); + // update the progression each 1000ms + var timeoutId = $interval(pollProgress,1000,0,false); + // cancel the timeout on element destroy to save memory leaks + elem.on('$destroy', function() { + $interval.cancel(timeoutId); + }); + + + function pollProgress(){ + if(scope.stream.state == "in_progress" && !scope.stream.paused) + Chrome.downloads.searchAsync({id:scope.stream.id}) + .then(function(dl){ + // update received bytes and estimated time at each iteration + scope.stream.bytesReceived = dl[0].bytesReceived; + scope.stream.totalBytes = dl[0].totalBytes; + scope.stream.estimatedEndTime = dl[0].estimatedEndTime; + + drawProgressSpinner(ctx, (scope.stream.bytesReceived / scope.stream.totalBytes)); + scope.$apply(); + }); + } + + function drawProgressSpinner(ctx, stage) { + ctx.fillStyle = ctx.strokeStyle = "#4db6ac"; + + var clocktop = -Math.TAU/4; + drawProgressArc(ctx, clocktop, clocktop + (stage * Math.TAU)); + } + + function drawProgressArc(ctx, startAngle, endAngle) { + var center = ctx.canvas.width/2; + ctx.lineWidth = Math.round(ctx.canvas.width*0.1); + ctx.beginPath(); + ctx.moveTo(center, center); + ctx.arc(center, center, center * 0.9, startAngle, endAngle, false); + ctx.fill(); + } + + } + }; +}]); diff --git a/app/directives/ProgressBar.js b/app/directives/ProgressBar.js new file mode 100644 index 0000000..0337c0b --- /dev/null +++ b/app/directives/ProgressBar.js @@ -0,0 +1,52 @@ +angular.module('cardboard.directives') + +.directive('progressBar', ['ChromeFactory','$interval','$timeout', function(Chrome, $interval, $timeout) { + return { + restrict: 'E', + scope:{ + progress: '&', + monitor: '=', + relative: '=' + }, + template: '
', + link: function(scope, element, attrs) { + var monitor = parseInt(attrs.monitor) || 1000, + relative = ("relative" in attrs && attrs.relative !=="false") || false; + + var previous; + + // update progress once + scope.progress().then(function(current){ + updateBar(current); + }); + + // if monitor attribute is defined we repeat the functions with the + // given interval delay + if(typeof attrs.monitor !== 'undefined') + var interval = $interval(function(){ + scope.progress().then(function(current){ + updateBar(current); + }); + }, monitor); + + + function updateBar(current){ + var percent = 0; + + if(relative && previous && (current.total != previous.total)) + percent = Math.floor((current.progress-previous.progress)/ (current.total-previous.total) *100); + else + percent = Math.floor(current.progress*100/current.total); + + previous = current; + + element.children().children().css('transform','translateX(-'+(100-percent)+'%)'); + } + + // Cancel the interval on element destroy to save memory leaks + element.on('$destroy', function() { + $interval.cancel(interval); + }); + } + }; +}]); diff --git a/app/directives/Typer.js b/app/directives/Typer.js new file mode 100644 index 0000000..e768f11 --- /dev/null +++ b/app/directives/Typer.js @@ -0,0 +1,94 @@ +angular.module('cardboard.directives') + +.directive('typer',['$interval','$timeout', function($interval, $timeout){ + return { + scope: { + source: "=", + delay: "=", + start: "=", + wipeDelay: "=", + callbackFn: "&" + }, + link: function(scope, element, attrs){ + var delay = attrs.delay || 150, + wipeDelay = attrs.wipeDelay || 2500, + callbackFn = scope.callbackFn || angular.noop, + // loop = ("loop" in attrs && attrs.loop !=="false") || false, + cursor = 0, + chain, + cancel; + + // implementation of a blinker cursor (not optimized) + // element.html('|'); + + + // We watch the 'start' expression to kick off the promise chain + // or cancel it + scope.$watch('start', function(start){ + cancel = !start; + if(start){ + parse(scope.source) + // When everything is done we call the callback + .then(callbackFn) + .catch(function(error){ + // Callback for a canceled promise chain. Typically + // when 'start' changes and evaluates to false + return error; + }); + } + else + wipe(0); + }); + + function parse(source){ + // We iterate sequentially through the array or promise of an array + return Promise.each(source, function(str, index, value){ + + // Write each word + return write(str) + .then(function(){ + // don't wipe if it's the last one + if(index < value-1) + return wipe(wipeDelay); + return; + }); + + }); + } + + function write(str){ + // We loop through each char at a given interval delay + chain = $interval(function(){ + // if user cancel we wipe immediately + // and cancel the $interval to prevent memory leaks + if(cancel){ + wipe(0); + $interval.cancel(chain); + } + else{ + // element.find('span').text(element.find('span').text()+str.charAt(cursor)); + element.text(element.text() + str.charAt(cursor)); + cursor++; + } + }, delay, str.length) + + return chain; + } + + function wipe(timeout){ + // We reset the cursor when a word is done writing + return $timeout(function(){ + // element.find('span').text(""); + element.text(""); + cursor = 0; + }, timeout) + } + + // Cancel the interval on element destroy to save memory leaks + element.on('$destroy', function() { + $interval.cancel(chain); + }); + + } + } +}]); diff --git a/app/directives/bootstrap.js b/app/directives/bootstrap.js new file mode 100644 index 0000000..de8e979 --- /dev/null +++ b/app/directives/bootstrap.js @@ -0,0 +1 @@ +angular.module('cardboard.directives',[]); diff --git a/app/factories/ChromeFactory.js b/app/factories/ChromeFactory.js new file mode 100644 index 0000000..13f263f --- /dev/null +++ b/app/factories/ChromeFactory.js @@ -0,0 +1,182 @@ +angular.module('cardboard.factories') + +.factory('ChromeFactory', [function(){ + + var promisifiedApis = {}; + + function promisify(api){ + + // if the API is simple (e.g: chrome.history) + if(!isNestedAPI(api)){ + // if not already promisified we do it and save it + if(!angular.isDefined(promisifiedApis[api])) + promisifiedApis[api] = Promise.promisifyAll(chrome[api], {promisifier: noErrPromisifier}); + + // We link the api to the factory object + Chrome[api] = promisifiedApis[api]; + } + // if the api is nested (e.g: chrome.system.cpu) + else{ + var apiBase = api.substring(0,api.indexOf('.')); + var apiEnd = api.substring(api.indexOf('.')+1); + + if(!angular.isDefined(promisifiedApis[apiBase])) + promisifiedApis[apiBase] = {}; + + if(!angular.isDefined(promisifiedApis[apiBase][apiEnd])) + promisifiedApis[apiBase][apiEnd] = Promise.promisifyAll(chrome[apiBase][apiEnd], {promisifier: noErrPromisifier}); + + Chrome[apiBase] = promisifiedApis[apiBase]; + } + } + + return Chrome = { + + storage: Promise.promisifyAll(chrome.storage.sync, {promisifier: noErrPromisifier}), + cache: Promise.promisifyAll(chrome.storage.local, {promisifier: noErrPromisifier}), + + permissions: { + + check: function(permissions){ + return Promise.map(permissions, function(permission){ + var deferred = Promise.defer(); + chrome.permissions.contains({permissions: [permission]}, function(granted){ + if(granted) + promisify(permission); + deferred.resolve(granted); + }); + return deferred.promise; + }) + .then(function(permissions){ + for(var i in permissions) + if(!permissions[i]) + return false; + return true; + }); + }, + + request: function(permissions){ + var toRequest = []; + // We first check each permissions if it's not already granted to avoid throwing errors + return Promise.map(permissions, function(permission){ + var deferred = Promise.defer(); + chrome.permissions.contains({permissions:[permission]}, function(alreadyGranted){ + // If so, we make the corresponding API available + if(alreadyGranted) + promisify(permission); + // If not, we save it to requests all permissions at once later + else + toRequest.push(permission); + deferred.resolve(permission); + }); + return deferred.promise; + }) + // Then we request the one which are not already granted + .then(function(){ + var deferred = Promise.defer(); + // if there are permissions not already granted we make the request + if(toRequest.length > 0) + chrome.permissions.request({permissions: toRequest}, function(granted){ + // Again we make the corresponding API available + if(granted){ + for(var i in toRequest) + promisify(toRequest[i]); + deferred.resolve(permissions); + } + // if the user denied the permission prompt we make a reject + else + deferred.reject(permissions); + }); + else + deferred.resolve(); + return deferred.promise; + }); + }, + + revoke: function(permissions){ + var toRemove = []; + for(var i in permissions) + if(isOptional(permissions[i])) + toRemove.push(permissions[i]); + + var deferred = Promise.defer(); + if(toRemove.length > 0) + chrome.permissions.remove({ + permissions: toRemove + }, function(removed){ + if (removed) + deferred.resolve(); + else + deferred.reject(); + }); + else + deferred.resolve(); + + return deferred.promise.then(function(){ + // We make the API unavailable + for(var i in toRemove) + delete Chrome[toRemove[i]]; + }) + .catch(function(){ + // The permissions have not been removed (e.g., you tried to + // remove required permissions) + }); + } + } + }; + +}]); + +// see https://github.com/petkaantonov/bluebird/blob/master/API.md#option-promisifier +function noErrPromisifier(originalMethod){ + return function promisified(){ + var args = [].slice.call(arguments); + var self = this; + return new Promise(function(resolve,reject){ + args.push(resolve); + originalMethod.apply(self,args); + }); + }; +} + +function isOptional(permission){ + var optionals = [ + "host permissions", + "background", + "bookmarks", + "clipboardRead", + "clipboardWrite", + "contentSettings", + "contextMenus", + "cookies", + "debugger", + "history", + "idle", + "management", + "notifications", + "pageCapture", + "tabs", + "topSites", + "webNavigation", + "webRequest", + "webRequestBlocking" + ]; + for(var i in optionals) + if(permission == optionals[i]) + return true; + return false; +} + + +function isNestedAPI(api){ + var nested = [ + "system.cpu", + "system.memory", + "system.storage" + ]; + + for(var i in nested) + if(api == nested[i]) + return true; + return false; +} diff --git a/app/factories/bootstrap.js b/app/factories/bootstrap.js new file mode 100644 index 0000000..2e4db1e --- /dev/null +++ b/app/factories/bootstrap.js @@ -0,0 +1 @@ +angular.module('cardboard.factories',[]); diff --git a/app/filters/Bytes.js b/app/filters/Bytes.js new file mode 100644 index 0000000..2ae97a6 --- /dev/null +++ b/app/filters/Bytes.js @@ -0,0 +1,11 @@ +angular.module('cardboard.filters') + +.filter('bytes', function() { + return function(bytes, precision) { + if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-'; + if (typeof precision === 'undefined') precision = 1; + var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], + number = Math.floor(Math.log(bytes) / Math.log(1024)); + return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number]; + } +}); diff --git a/app/filters/Filename.js b/app/filters/Filename.js new file mode 100644 index 0000000..47308b6 --- /dev/null +++ b/app/filters/Filename.js @@ -0,0 +1,7 @@ +angular.module('cardboard.filters') + +.filter('filename', function() { + return function(filename) { + return filename.replace(/^.*[\\\/]/, ''); + } +}); diff --git a/app/filters/FromNow.js b/app/filters/FromNow.js new file mode 100644 index 0000000..9332be5 --- /dev/null +++ b/app/filters/FromNow.js @@ -0,0 +1,7 @@ +angular.module('cardboard.filters') + +.filter('fromNow', function() { + return function(dateString) { + return moment(new Date(dateString)).fromNow(); + }; +}); diff --git a/app/filters/Host.js b/app/filters/Host.js new file mode 100644 index 0000000..1917c2c --- /dev/null +++ b/app/filters/Host.js @@ -0,0 +1,15 @@ +angular.module('cardboard.filters') + +.filter('host', function () { + return function ( input ) { + var matches, + output = "", + urls = /\w+:\/\/([\w|\.]+)/; + + matches = urls.exec( input ); + + if ( matches !== null ) output = matches[1]; + + return output; + }; +}); diff --git a/app/filters/Humanize.js b/app/filters/Humanize.js new file mode 100644 index 0000000..d2f23a7 --- /dev/null +++ b/app/filters/Humanize.js @@ -0,0 +1,19 @@ +angular.module('cardboard.filters') + +.filter('humanize', function () { + return function humanize (input) { + var isUpper = function (s) { + return !/[^a-z\xC0-\xFF]/.test(s.toLowerCase()) && s.toUpperCase() === s; + }; + + input = input.replace(/(^\s*|\s*$)/g, '').replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase(); + if (isUpper(input.charAt(0))) { + input = '_' + input; + } + + input = input.replace(/_id$/,'').replace(/_/g, ' ').replace(/(^\s*|\s*$)/g, ''); + input = input.substr(0, 1).toUpperCase() + input.substring(1).toLowerCase(); + + return input; + } +}); diff --git a/app/filters/bootstrap.js b/app/filters/bootstrap.js new file mode 100644 index 0000000..e92b7a6 --- /dev/null +++ b/app/filters/bootstrap.js @@ -0,0 +1 @@ +angular.module('cardboard.filters',[]); diff --git a/app/styles/custom.css b/app/styles/custom.css new file mode 100644 index 0000000..50e7f5e --- /dev/null +++ b/app/styles/custom.css @@ -0,0 +1,270 @@ +html { overflow-y: scroll; } + +body{ + font-family: "Roboto", sans-serif; + background-color: #f5f5f5; +} + +header{ + display: flex; + height: 200px; + transition: background-image .5s linear .2s; +} + +.header-typer{ + flex: 1; + align-self: center; + padding: 40px 20px 0 50px; + font-weight: 400; + font-size: 8vw; + text-shadow: 0 2px 1px rgba(0,0,0,0.15); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +#more{ + position: absolute; + top: 0; + right: 0; +} +#more i{ + margin: 10px; + padding: 0 7.5px; + border-radius: 50%; +} + +#back i{ + margin-top: 80px; + margin-left: 20px; + padding: 0px 12.5px; + border-radius: 50%; + font-size: 50px; +} + +@media (min-width: 601px){ + #toast-container{ + bottom: 30px; + right: 30px; + top: initial; + left: initial; + min-width: initial; + } +} + +.modal-footer .modal-action{ + float: right; +} + +.file-path{ + margin-left: 150px; + width: 70%; +} + + +button, +.btn{ + font-size: 14px; +} +button.disabled +.btn.disabled, +.btn-flat.disabled{ + color: #b3b3b3 !important; +} + +.ng-hide{ + display: none !important; +} + +.waves-effect{ + transition-duration: 0.23s; +} + +.global.progress{ + margin: 0; + opacity: 0; + transition: opacity 0.1s; + transition-delay: 0.5s; +} + +.progress.loading{ + opacity: 1; +} + +.card{ + width: 400px; + margin: 0; + box-shadow: 0px 2px 3px rgba(0,0,0,0.1); +} +.card .card-title{ + padding: 12px 20px; + color: white; + background-color: #546e7a; +} +.card .tabs, +.card .tabs .tab{ + background-color: #546e7a; +} +.card .tabs .tab a{ + color: #f5f5f5; + text-overflow: ellipsis; + overflow: hidden; + padding: 0 5px; +} +.card .tabs .tab a:hover{ + color: white; +} +.card .tabs .indicator{ + background-color: white; + height: 4px; + z-index: 1; +} +.card .card-content{ + padding: 10px 0; + margin: 0; +} + +section.container{ + margin-top: 10px; + margin-bottom: 10px; + border-radius: 2px; + font-size: 14px; + min-width: 400px; + padding: 20px 50px; + padding-bottom: 0; +} + +.md-select{ + width: 300px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAeCAYAAADZ7LXbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAKRJREFUeNrs1TEKwkAQheEvIoI2nsk7qFdIq1hoJ3gCC5sUVpY23sDKXnvrYOUBbGITG0kQjQriPlgYhmF/3ryFjbIs82nVfEEBEiAB8k+Q+q1IkqSDNVq4lMy3scIkjuP0FSdbjNHMLys6OwyQVlnXEsOS2QP6OL8jkzlmd70jus86eBT8FIu8PqGXg6oFX6ARGthgX+V1ReFnDJAACZAfhFwHAJI7HF2lZGQaAAAAAElFTkSuQmCC); + background-repeat: no-repeat; + background-position: right; +} + +.md-select select{ + cursor: pointer; + width: inherit; + display: block; + -webkit-appearance: none; + border: none; + outline: none; + border-bottom: 2px solid #757575; + background-color: transparent; + border-radius: 0; + transition: border-color 0.3s; +} + +.md-select select:hover, +.md-select select:focus{ + border-color: #4db6ac; +} + +input[type="file"]{ + margin: 20px 0px -20px 20px; + padding: 10px; + outline: none; + width: 80%; +} + +input[type="file"]::-webkit-file-upload-button{ + text-decoration: none; + color: #FFF; + background-color: #26a69a; + text-align: center; + letter-spacing: 0.5px; + transition: 0.2s ease-out; + cursor: pointer; + display: inline-block; + height: 36px; + margin-bottom: 15px; + padding: 0 2rem; + border-radius: 2px; + background-clip: padding-box; + line-height: 36px; + text-transform: uppercase; + border: none; + outline: none; + -webkit-tap-highlight-color: transparent; + box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12); +} + +input[type="file"]::-webkit-file-upload-button:hover{ + box-shadow: 0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15); + background-color: #2bbbad; +} + + +.category{ + margin-bottom: 40px; +} +.sub-header{ + color: #26a69a; + font-size: 14px; + font-weight: 500; + margin-bottom: 20px; + text-transform: uppercase; +} +.sub-setting{ + margin: 30px 0; +} +.sub-setting label{ + font-size: 14px; +} +.switch label .lever{ + margin: 0 20px; +} + +h4{ + font-size: 20px; + color: #616161; +} + +.github{ + background-color: #f0f0f0 !important; + color: #424242; +} + +/************** COLUMNS ***************/ +/* +#feed{ +width: 840px; +margin: 10px auto; +-webkit-column-width: 420px; +-webkit-column-gap: 0px; +} + +.card-wrapper{ +-webkit-column-break-inside: avoid; +display: inline-block; +margin: 10px 0; +} +*/ + +/************** PACKERY ***************/ + +/* For an alternate way of centering the container +see https://github.com/metafizzy/packery/issues/8 */ + +#feed{ + padding: 10px; + width: 830px; + margin: 0 auto; +} + +@media (max-width: 839px) { + #feed { + width: 420px; + } +} +@media (min-width: 1240px) { + #feed { + width: 1240px; + } +} +.packery-object{ + transition: box-shadow 0.2s; +} +.packery-object.is-dragging { + box-shadow: 0 10px 30px rgba(100,100,100,0.1), 0 8px 10px rgba(100,100,100,0.2) +} + +/************** END PACKERY ***************/ diff --git a/app/templates/Feed.html b/app/templates/Feed.html new file mode 100644 index 0000000..3769a0a --- /dev/null +++ b/app/templates/Feed.html @@ -0,0 +1,5 @@ +
+ +
+
+
diff --git a/app/templates/Settings.html b/app/templates/Settings.html new file mode 100644 index 0000000..a6c3deb --- /dev/null +++ b/app/templates/Settings.html @@ -0,0 +1,71 @@ +
+ +
+
Header
+
+ +
+ +
+
+ + +
+
+
+
+ +
+
Cards
+
+
+
+
+ +
+
About
+

+ Cardboard is developed by a young french developer when he's not busy + working on his startup, praying thy Lord Duarte or fighting exploding kittens. +

+ +

Have 1 min?

+

+ Help me improve Cardboard by taking 1 minute to review and report bugs +

+ Feedback + +

Stay tuned

+

Follow the project

+ Google + + github +
+
+ + + + + + + + + diff --git a/app/templates/cards/AppCard.html b/app/templates/cards/AppCard.html new file mode 100644 index 0000000..7c49f89 --- /dev/null +++ b/app/templates/cards/AppCard.html @@ -0,0 +1,54 @@ + + +
+
Apps
+ +
+ diff --git a/app/templates/cards/BookmarkCard.html b/app/templates/cards/BookmarkCard.html new file mode 100644 index 0000000..e070b1f --- /dev/null +++ b/app/templates/cards/BookmarkCard.html @@ -0,0 +1,94 @@ + + + +
+
Bookmarks
+ +
    +
  • +
+
    +
  • + + {{parentNode.title}} +
  • +
  • +
+ + + +
+
diff --git a/app/templates/cards/DownloadCard.html b/app/templates/cards/DownloadCard.html new file mode 100644 index 0000000..f97f1b7 --- /dev/null +++ b/app/templates/cards/DownloadCard.html @@ -0,0 +1,103 @@ + + +
+
Dowloads
+
    +
  • +
    + +
    +
    +
    +
    + +
    +
    {{download.filename | filename}}
    + {{download.bytesReceived | bytes}} / {{download.totalBytes | bytes}} - + {{download.url | host}} +
    + +
    {{getStatus() | lowercase }}
    +
    + +
  • +
+
+
diff --git a/app/templates/cards/HistoryCard.html b/app/templates/cards/HistoryCard.html new file mode 100644 index 0000000..d14562b --- /dev/null +++ b/app/templates/cards/HistoryCard.html @@ -0,0 +1,58 @@ + + + + diff --git a/app/templates/cards/QuickSettingsCard.html b/app/templates/cards/QuickSettingsCard.html new file mode 100644 index 0000000..d1f025b --- /dev/null +++ b/app/templates/cards/QuickSettingsCard.html @@ -0,0 +1,40 @@ + + +
+
Quick Settings
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+ +
+
+
diff --git a/app/templates/cards/SessionsCard.html b/app/templates/cards/SessionsCard.html new file mode 100644 index 0000000..01da8c8 --- /dev/null +++ b/app/templates/cards/SessionsCard.html @@ -0,0 +1,70 @@ + + + + diff --git a/app/templates/cards/SystemCard.html b/app/templates/cards/SystemCard.html new file mode 100644 index 0000000..47ecd32 --- /dev/null +++ b/app/templates/cards/SystemCard.html @@ -0,0 +1,119 @@ + + +
+
System
+
+
+
+ +
CPU
+
+
+

{{cpu.modelName}}

+

{{cpu.archName}} - {{cpu.numOfProcessors}} core{{cpu.numOfProcessors > 1 ? 's':''}}

+ + +
+
+
+
+ +
Memory
+
+
+

{{memory.availableCapacity | bytes}} available of {{memory.capacity | bytes}}

+ + +
+
+
+
+ +
Storage
+
+
    +
  • + +

    {{unit.name}}

    +

    {{unit.capacity | bytes}}

    +
  • +
+
+
+
+
diff --git a/app/templates/cards/TopSitesCard.html b/app/templates/cards/TopSitesCard.html new file mode 100644 index 0000000..5231e0d --- /dev/null +++ b/app/templates/cards/TopSitesCard.html @@ -0,0 +1,49 @@ + + +
+
Top Sites
+ +
+
diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..0b8c7fe --- /dev/null +++ b/bower.json @@ -0,0 +1,41 @@ +{ + "name": "cardboard", + "version": "2.0.0", + "homepage": "https://github.com/virtual-dev/cardboard", + "authors": [ + "virtual-dev" + ], + "description": "The default New Tab is not Google enough ? Try Cardboard, Now with more Material Design (plus nifty features)", + "main": "index.html", + "keywords": [ + "google", + "chrome", + "new", + "tab", + "page", + "material", + "design", + "md", + "now", + "card", + "board", + "cardboard" + ], + "private": true, + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "angular": "~1.3.12", + "angular-route": "~1.3.12", + "bluebird": "~2.9.6", + "angular-packery": "~1.0.1", + "materialize": "=0.95.1", + "moment": "~2.9.0" + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..06077b5 --- /dev/null +++ b/index.html @@ -0,0 +1,71 @@ + + + + + + New Tab + + + + + + +
+
+ + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..ed5fde8 --- /dev/null +++ b/manifest.json @@ -0,0 +1,34 @@ +{ + "manifest_version": 2, + + "name": "Cardboard - New Tab Page", + "author": "virtual-dev", + "description": "The default New Tab is not Google enough ? Try Cardboard, Now with more Material Design (plus nifty features)", + "version": "2.0.0", + "chrome_url_overrides" : { + "newtab": "index.html" + }, + "icons": { + "16": "resources/icon16.png", + "48": "resources/icon48.png", + "128": "resources/icon128.png" + }, + "permissions": [ + "storage", + "sessions", + "browsingData", + "downloads", + "downloads.open", + "system.cpu", + "system.memory", + "system.storage", + "https://hawttrends.appspot.com/api/terms/" + ], + "optional_permissions": [ + "tabs", + "topSites", + "bookmarks", + "management", + "history" + ] +} diff --git a/release/app/Controllers.js b/release/app/Controllers.js deleted file mode 100644 index 6c64d4d..0000000 --- a/release/app/Controllers.js +++ /dev/null @@ -1,294 +0,0 @@ -// CardboardCtrl = main controller with settings & header -cardboard.controller('CardboardCtrl', ['$scope','$location','SettingsFactory','SearchFactory','AppFactory','PermissionFactory','ToolFactory', function($scope, $location, sf, schf, af, pf, tf){ - - // Get SyncArea settings - sf.update().then(function(update){ - $scope.settings = update.content; - $scope.checkPermissions(); - $scope.update = update.state; - if($scope.update == 1) - $location.path("welcome"); - }); - - // Get bgDataUrl from LocalArea storage - sf.getLocal("bgDataUrl").then(function(value){ - // Avoid non-blocking/minors errors at load (because settings are not yet defined) - if($scope.settings){ - $scope.settings.bgDataUrl = value; - - // if no local bg, delete the matching record and put back to default bg - if(!value && ($scope.settings.backgrounds[$scope.settings.backgroundId].type == "Custom")){ - $scope.settings.backgrounds.pop(); - $scope.settings.backgroundId = 4; - $scope.background = $scope.settings.backgrounds[4]; - sf.set({backgroundId : 4}); - sf.set({backgrounds : $scope.settings.backgrounds}); - alert("No custom background found here. Back to default"); - } - } - }); - - - // Why the hell do I need this function ? ==> fix this - $scope.dismiss = function(){ - $scope.update = 0; - }; - - $scope.checkPermissions = function(){ - // Allows cards based on settings and permissions - for(var i in $scope.settings.cards){ - // Closure: Yo dawg we heard yo' like functions... So we put a function in yo' function: http://www.apaxsoftware.com/2012/05/common-javascript-mistakes-loops-and-callbacks/ - (function(i_copy){ - pf.verify($scope.settings.cards[i_copy].permissions).then(function(granted){ - if(granted) - $scope.settings.cards[i_copy].allowed = true; - else - $scope.settings.cards[i_copy].allowed = false; - }); - }(i)); - } - }; - - $scope.goTo = function(url){ - chrome.tabs.update({url:url}); - }; - $scope.getHeaderStyle = function(noLogo){ - var style = {}; - var bgUrl; - var bgImg = true; - // Avoid non-blocking/minors errors at load (because settings are not yet defined) - if($scope.settings){ - // if noLogo is true don't display google logo - var logo = (!noLogo ? $scope.settings.backgroundLogo : false); - var customBg = ($scope.settings.backgrounds[$scope.settings.backgroundId].type == "Custom"); - if(customBg) - if($scope.settings.bgDataUrl) - bgUrl = $scope.settings.bgDataUrl; - else // if undefined (due to speed of exec) background-image = none - bgImg = false; - else - bgUrl = $scope.settings.backgrounds[$scope.settings.backgroundId].url+"_"+tf.getTime()+".webp"; - - if(bgImg) - style.backgroundImage = "url("+(logo ? "../img/google.webp), url(":"")+bgUrl+")"; - else - style.backgroundImage = "none"; - style.backgroundPosition = (logo ? "center 25px,":"")+$scope.settings.backgroundPosition; - style.backgroundSize = (logo ? "280px,":"")+"cover"; - } - return style; - }; - $scope.suggestions = function(input){ - // suggestions for typeahead - return schf.getSuggestions(input); - }; - $scope.onSelect = function (item) { - switch(item.type){ - case "app": - af.launchApp(item.data.id); - break; - case "history": - case "bookmark": - this.goTo(item.data.url); - break; - case "web": - default: - this.search(); - }; - }; - $scope.search = function(){ - // Process the google search - if(this.query && this.query.length>0){ - this.isLoading = true; - this.goTo(this.settings.searchEngine + this.query); - } - }; -}]); - -// AppCtrl -cardboard.controller('AppCtrl', ['$scope','AppFactory', function($scope, af){ - af.getApps().then(function(apps){ - $scope.apps = apps; - }); - $scope.launch = function(){ - af.launchApp(this.app); - }; - $scope.viewPermissions = function(){ - this.permissions = af.getPermissions(this.app.id); - }; - $scope.uninstall = function(){ - if(confirm("Uninstall "+this.app.name+" ?")){ - af.uninstall(this.app.id); - $scope.apps.splice(this.key,1); - } - }; - $scope.getIcon = function(){ - var icon_url; - if(this.app.icons) - icon_url = this.app.icons[this.app.icons.length-1].url; - else - icon_url = "chrome://extension-icon/khopmbdjffemhegeeobelklnbglcdgfh/256/1"; - if(!this.app.enabled) - icon_url+="?grayscale=true"; - return icon_url; - }; -}]); - -// BookmarkCtrl -cardboard.controller('BookmarkCtrl', ['$scope','BookmarkFactory', function($scope, bf){ - bf.getRecent(5).then(function(bookmarks){ - $scope.bookmarks = bookmarks; - }); -}]); - -// DownloadCtrl -cardboard.controller('DownloadCtrl', ['$scope','DownloadFactory', function($scope, df){ - df.getRecent(5).then(function(downloads){ - $scope.downloads = downloads; - }); - // Watch changes in download states and apply them to the model - chrome.downloads.onChanged.addListener(function(downloadDelta){ - for (i in $scope.downloads){ - if($scope.downloads[i].id == downloadDelta.id){ - for (j in downloadDelta) - if(j != "id") - $scope.downloads[i][j] = downloadDelta[j].current; - $scope.$apply(); - break; - } - } - }); - // whatch if a download is created and add it to the card - chrome.downloads.onCreated.addListener(function(downloadCreated){ - $scope.$apply(function(){ - $scope.downloads.pop(); // remove the last element - $scope.downloads.unshift(downloadCreated); // add the newly created at the beggining - }); - }); - - $scope.show = function(){ - df.show(this.download.id); - }; - $scope.open = function(){ - df.open(this.download.id); - }; - $scope.pause = function(){ - df.pause(this.download.id); - }; - $scope.resume = function(){ - df.resume(this.download.id); - }; - $scope.cancel = function(){ - df.cancel(this.download.id); - }; - $scope.retry = function(){ - df.download(this.download.url); - }; -}]); - - -// QuickSettingsCtrl -cardboard.controller('QuickSettingsCtrl', ['$scope','QuickSettingsFactory', function($scope, qsf){ - $scope.isWorking = false; - - $scope.clearCache = function(){ - $scope.isWorking = true; - qsf.clearCache().then(function(){ $scope.isWorking = false;}); - }; - $scope.clearCookies = function(){ - if(confirm("Clear Cookies?")){ - $scope.isWorking = true; - qsf.clearCookies().then(function(){$scope.isWorking = false;}); - } - }; - $scope.clearHistory = function(){ - if(confirm("Clear Browser History?")){ - $scope.isWorking = true; - qsf.clearHistory().then(function(){$scope.isWorking = false;}); - } - }; - $scope.clearLocalStorage = function(){ - if(confirm("Clear Local Storage?")){ - $scope.isWorking = true; - qsf.clearLocalStorage().then(function(){$scope.isWorking = false;}); - } - }; -}]); - -// TopSitesCtrl -cardboard.controller('TopSitesCtrl', ['$scope','TopSitesFactory', function($scope, tsf){ - tsf.get(5).then(function(topSites){ - $scope.topSites = topSites; - }); -}]); - -// StorageCtrl -cardboard.controller('StorageCtrl', ['$scope','StorageFactory', function($scope, sf){ - sf.getInfo().then(function(storageUnits){ - $scope.storageUnits = storageUnits; - }); -}]); - -/******************************************************************/ -/* SETTINGS */ -/******************************************************************/ - - -cardboard.controller('AppearanceCtrl', ['$scope','SettingsFactory', function($scope, sf){ - $scope.background; - $scope.updateBg = function(){ - $scope.settings.backgroundId = this.background.id; - sf.set({backgroundId : this.background.id}); - }; - $scope.updateBgPos = function(){ - sf.set({backgroundPosition : this.settings.backgroundPosition}); - }; - $scope.updateBgLogo = function(){ - sf.set({backgroundLogo : this.settings.backgroundLogo}); - }; -}]); - -cardboard.controller('CardsCtrl', ['$scope','SettingsFactory','PermissionFactory', function($scope, sf, pf){ - $scope.updateCards = function(){ - // delete the allow property for security measure (even if permissions are verified at load) - // Plus it saves unnecessary bits from sync storage - delete this.settings.cards.allowed; - sf.set({cards:this.settings.cards}); - }; - $scope.request = function(){ - var cardId = this.key; - if(!this.card.allowed) - pf.request(this.card.permissions).then(function(granted){ - if(granted) - $scope.settings.cards[cardId].allowed = true; - }); - else - console.log("already granted"); - }; - $scope.revokeAll = function(){ - // revoke the cards permissions - var warning = "Be careful, this will revoke all permissions for this extension."; - warning += "\nThis will disable cards that needs authorization until you grant corresponding permission again."; - warning += "\nIMPORTANT : Due to a odd chrome behavior you won't see any confirm popup next time you grant permissions."; - warning += "\nMore details here: https://plus.google.com/115967816314012668475/posts/VepEbyyw7yf"; - - if(confirm(warning)) - for(i in $scope.settings.cards){ - (function(i_copy){ - pf.revoke($scope.settings.cards[i_copy].permissions).then(function(revoked){ - if(revoked) - $scope.settings.cards[i_copy].allowed = false; - else - console.log("Error while revoking permission"); - }); - }(i)); - } - }; -}]); - -cardboard.controller('WelcomeCtrl', ['$scope', function($scope){ - $scope.nextCard = 0; - $scope.next = function(){ - $scope.nextCard++; - }; -}]); diff --git a/release/app/Directives.js b/release/app/Directives.js deleted file mode 100644 index 40530fe..0000000 --- a/release/app/Directives.js +++ /dev/null @@ -1,108 +0,0 @@ -cardboard.directive('escFocus', function() { - return { - restrict: 'A', - link: function(scope, elem, attrs) { - elem.bind('keyup', function (e) { - // esc - if (e.keyCode == 27) { - if(!scope.$first) { - elem[0].blur(); - } - } - }); - } - }; -}); - -cardboard.directive('pieDownloader', ['DownloadFactory','$interval','$timeout', function(df,$interval,$timeout) { - return { - restrict: 'A', - link: function(scope, elem, attrs) { - - // create the canvas and appends it in the element - var canvas = document.createElement('canvas'); - var savedIconUrl = scope.download.iconUrl; - canvas.width = canvas.height = 38; - elem.prepend(canvas); - var ctx = canvas.getContext('2d'); - - Math.TAU = 2 * Math.PI; - - // Draw one time the progression - drawProgressSpinner(ctx, (scope.download.bytesReceived / scope.download.totalBytes)); - // update the progression each 1000ms - $interval(pollProgress,1000,0,false); - - function pollProgress(){ - if(scope.download.state == "in_progress" && !scope.download.paused) - df.search({id:scope.download.id}).then(function(dl){ - // update received bytes and estimated time at each iteration - scope.download.bytesReceived = dl[0].bytesReceived; - scope.download.totalBytes = dl[0].totalBytes; - scope.download.estimatedEndTime = dl[0].estimatedEndTime; - - drawProgressSpinner(ctx, (scope.download.bytesReceived / scope.download.totalBytes)); - }); - } - - function drawProgressSpinner(ctx, stage) { - ctx.fillStyle = ctx.strokeStyle = "#009ddc"; // green: #53a93f - - var clocktop = -Math.TAU/4; - drawProgressArc(ctx, clocktop, clocktop + (stage * Math.TAU)); - } - - function drawProgressArc(ctx, startAngle, endAngle) { - var center = ctx.canvas.width/2; - ctx.lineWidth = Math.round(ctx.canvas.width*0.1); - ctx.beginPath(); - ctx.moveTo(center, center); - ctx.arc(center, center, center * 0.9, startAngle, endAngle, false); - ctx.fill(); - } - - } - }; -}]); - -cardboard.directive('bgPick', ['SettingsFactory',function(sf) { - return { - restrict: 'E', - replace: true, - template: '', - link: function(scope, elem, attrs) { - - elem.bind('change', function(input) { - - if (input.target.files && input.target.files[0]) { - var reader = new FileReader(); - var filename = input.target.value.replace("C:\\fakepath\\",""); - - // we store the background as a dataURL in the local storage (no sync because too large) - reader.readAsDataURL(input.target.files[0]); - reader.onload = function (e) { - chrome.storage.local.set({"bgDataUrl": e.target.result}, function(){ - var lastId = scope.settings.backgrounds.length; - // replace the previous custom bg if there is any; - if(scope.settings.backgrounds[lastId-1].type == "Custom") - lastId--; - - var userBackground = {id: lastId, name: filename, type: "Custom" }; - - // the custom bg gets pushed into the array of default bgs - scope.settings.backgrounds[lastId] = userBackground; - // save the new bgs array in sync settings - sf.set({backgrounds: scope.settings.backgrounds}).then(function(){ - // update the bg immediatly on screen/scope - scope.background = userBackground; - scope.settings.bgDataUrl = e.target.result; - scope.updateBg(); - }); - }); - } - - } - }); - } - }; -}]); \ No newline at end of file diff --git a/release/app/Factories.js b/release/app/Factories.js deleted file mode 100644 index 10088e1..0000000 --- a/release/app/Factories.js +++ /dev/null @@ -1,571 +0,0 @@ -// SearchFactory -cardboard.factory('SearchFactory', ['$q','WebFactory','BookmarkFactory','HistoryFactory', function($q, wf, bf, hf){ - return{ - getSuggestions : function(query){ - - var maxWebSuggest = 4; - var maxBookmarkSuggest = 3; - var maxAppSuggest = 3; - var maxHistorySuggest = 3; - - var p_web = wf.getWebSuggestions(query, maxWebSuggest); - var p_bookmark = []; // bf.getSearchResults(query, maxBookmarkSuggest); - var p_history = []; // hf.getSearchResults({text: query, maxResults: maxHistorySuggest}); - - // when all the suggestions part are loaded we merge into one array - return $q.all([p_web, p_bookmark, p_history]).then(function(arrays){ - // the first element is always the typed query - var all_suggest = [{ - type: "web", - icon: "fa-search", // class for font-awesome icons (only show the first) - label: query - }]; - // then we concatenate with other suggestions - for(i in arrays){ - all_suggest = all_suggest.concat(arrays[i]); - } - return all_suggest; - }); - } - } - -}]); - - -// WebFactory -cardboard.factory('WebFactory', ['$http','$q', function($http, $q){ - return{ - getWebSuggestions : function(query, max){ - return $http.get('https://suggestqueries.google.com/complete/search?client=firefox&hl=en&q='+query).then(function(suggestions){ - // the [0] is the query, the [1] is the suggestions - var web_suggestions = []; - for(var i=0; i= max) - return true; - if(value.name.toLowerCase().indexOf(query) !=-1){ - this.push({ - type: "app", - icon: "fa-puzzle-piece", // class for font-awesome icons - label: value.name, - data: value - }); - cpt++; - } - }, search_results); - deferred.resolve(search_results); - }); - return deferred.promise; - }, - getPermissions : function(id){ - var deferred = $q.defer(); - chrome.management.getPermissionWarningsById(id, function(perms){ - $rootScope.$apply(deferred.resolve(perms)); - }); - return deferred.promise; - }, - launchApp : function(app){ - chrome.management.launchApp(app.id); - var dataObj = {}; - dataObj[app.id] = {"frequency" : (app.frequency)+1}; - sf.set(dataObj); - }, - enable : function(id, enable){ - chrome.management.setEnabled(id, enable); - }, - uninstall: function(id){ - chrome.management.uninstall(id); - } - } -}]); - -// BookmarkFactory -cardboard.factory('BookmarkFactory', ['$q', '$rootScope', function($q, $rootScope){ - return { - getAll : function(){ - var deferred = $q.defer(); - chrome.bookmarks.getTree(function(bookmarks){ - $rootScope.$apply(deferred.resolve(bookmarks)); - }); - return deferred.promise; - }, - getRecent : function(limit){ - var deferred = $q.defer(); - chrome.bookmarks.getRecent(limit, function(bookmarks){ - $rootScope.$apply(deferred.resolve(bookmarks)); - }); - return deferred.promise; - }, - getSearchResults : function(query, max){ - var deferred = $q.defer(); - var search_results = []; - chrome.bookmarks.search(query, function(bookmarks){ - var cpt = 0; - angular.forEach(bookmarks, function(value, key){ - if(cpt >= max) - return true; - this.push({ - type: "bookmark", - icon: "fa-star-o"+((key!=0) ? " blank": ""), // class for font-awesome icons (only show the first) - label: value.title, - data: value - }); - cpt++; - }, search_results); - $rootScope.$apply(deferred.resolve(search_results)); - }); - return deferred.promise; - } - } -}]); - -// QuickSettingsFactory -cardboard.factory('QuickSettingsFactory', ['$q', '$rootScope', function($q, $rootScope){ - return { - clearCache : function(){ - var deferred = $q.defer(); - chrome.browsingData.remove({ - "since": 0 - }, { - "cache": true, - }, function(){ - $rootScope.$apply(deferred.resolve()); - }); - return deferred.promise; - }, - clearCookies : function(){ - var deferred = $q.defer(); - chrome.browsingData.remove({ - "since": 0 - }, { - "cookies": true, - }, function(){ - $rootScope.$apply(deferred.resolve()); - }); - return deferred.promise; - }, - clearHistory : function(){ - var deferred = $q.defer(); - chrome.browsingData.remove({ - "since": 0 - }, { - "history": true, - }, function(){ - $rootScope.$apply(deferred.resolve()); - }); - return deferred.promise; - }, - clearLocalStorage : function(){ - var deferred = $q.defer(); - chrome.browsingData.remove({ - "since": 0 - }, { - "localStorage": true, - }, function(){ - $rootScope.$apply(deferred.resolve()); - }); - return deferred.promise; - } - } -}]); - -// HistoryFactory -cardboard.factory('HistoryFactory', ['$q', '$rootScope', function($q, $rootScope){ - return { - getAll : function(){ - var deferred = $q.defer(); - chrome.bookmarks.getTree(function(bookmarks){ - $rootScope.$apply(deferred.resolve(bookmarks)); - }); - return deferred.promise; - }, - getRecent : function(nb){ - var deferred = $q.defer(); - chrome.bookmarks.getRecent(nb, function(bookmarks){ - $rootScope.$apply(deferred.resolve(bookmarks)); - }); - return deferred.promise; - }, - getSearchResults : function(query){ - var deferred = $q.defer(); - chrome.history.search(query, function(history){ - var search_results = []; - angular.forEach(history, function(value, key){ - this.push({ - type: "history", - icon: "fa-clock-o"+((key!=0) ? " blank": ""), // class for font-awesome icons (only show the first) - label: value.url, - data: value - }); - }, search_results); - - $rootScope.$apply(deferred.resolve(search_results)); - }); - return deferred.promise; - } - } -}]); - -cardboard.factory('TopSitesFactory', ['$q', '$rootScope', function($q, $rootScope){ - return{ - get: function(max){ - // if max not specified: all topSites - max = typeof max !== 'undefined' ? max : null; - var deferred = $q.defer(); - chrome.topSites.get(function(allTopSites){ - var topSites = allTopSites; - if(max != null) - topSites.length = max; - $rootScope.$apply(deferred.resolve(topSites)); - }); - return deferred.promise; - } - } -}]); - -cardboard.factory('StorageFactory', ['$q', '$rootScope', function($q, $rootScope){ - return{ - getInfo: function(){ - var deferred = $q.defer(); - chrome.system.storage.getInfo(function(storageUnits){ - console.log(storageUnits); - $rootScope.$apply(deferred.resolve(storageUnits)); - }); - return deferred.promise; - } - } -}]); - -/******************************************************************/ -/* SETTINGS */ -/******************************************************************/ - -cardboard.factory('SettingsFactory', ['$q','$rootScope','DefaultSettings','ToolFactory', function($q,$rootScope,defaultSettings,tf){ - return{ - state: { - NONE: 0, - FIRST: 1, - SETTINGS_UPDATED: 2, - APP_UPDATED: 3 - }, - getProperties: function(){ - chrome.storage.StorageArea.getBytesInUse(null,function(bytes){ - console.log("You use "+bytes+" bytes"); - }); - }, - get: function(item){ - // default value => get all - item = typeof item !== 'undefined' ? item : null; - var deferred = $q.defer(); - chrome.storage.sync.get(item, function(storage){ - if(tf.isEmptyObject(storage)) - $rootScope.$apply(deferred.resolve(null)); - else{ - if(item == null) - $rootScope.$apply(deferred.resolve(storage)); - else - $rootScope.$apply(deferred.resolve(storage[item])); - } - }); - return deferred.promise; - }, - set: function(item){ - // default value => set all - item = typeof item !== 'undefined' ? item : null; - - var deferred = $q.defer(); - chrome.storage.sync.set(item, function(){ - $rootScope.$apply(deferred.resolve(true)); - }); - return deferred.promise; - }, - update: function(){ - var deferred = $q.defer(); - var return_state = this.state.NONE; - var this_copy = this; - this.get().then(function(old_settings){ - // No settings or outdated ones => install new settings !!! user values lost !!! - if(!old_settings) - return_state = this_copy.state.FIRST; - else if(old_settings.version.settings < defaultSettings.version.settings) - return_state = this_copy.state.SETTINGS_UPDATED; - else if(old_settings.version.update < defaultSettings.version.update) - return_state = this_copy.state.APP_UPDATED; - - if(return_state == this_copy.state.SETTINGS_UPDATED || return_state == this_copy.state.FIRST){ - // we update all settings - chrome.storage.sync.clear(); - chrome.storage.sync.set(defaultSettings, function(){ - $rootScope.$apply(deferred.resolve({content: defaultSettings, state:return_state})); - }); - } - else if(return_state == this_copy.state.APP_UPDATED){ - // We update the version only - chrome.storage.sync.set({version: defaultSettings.version }, function(){ - $rootScope.$apply(deferred.resolve({content: old_settings, state:return_state})); - }); - } - else - deferred.resolve({content: old_settings, state:return_state}); - }); - return deferred.promise; - }, - setDefault: function(){ - chrome.storage.sync.set(defaultSettings); - }, - clear: function(){ - chrome.storage.sync.clear(); - }, - getLocal: function(item){ - // default value => get all - item = typeof item !== 'undefined' ? item : null; - var deferred = $q.defer(); - chrome.storage.local.get(item, function(storage){ - if(tf.isEmptyObject(storage)) - $rootScope.$apply(deferred.resolve(null)); - else{ - if(item == null) - $rootScope.$apply(deferred.resolve(storage)); - else - $rootScope.$apply(deferred.resolve(storage[item])); - } - }); - return deferred.promise; - }, - setLocal: function(item){ - // default value => set all - item = typeof item !== 'undefined' ? item : null; - - var deferred = $q.defer(); - chrome.storage.local.set(item, function(){ - $rootScope.$apply(deferred.resolve(true)); - }); - return deferred.promise; - }, - } -}]); - -/******************************************************************/ -/* PERMISSIONS */ -/******************************************************************/ - -cardboard.factory('PermissionFactory', ['$q', '$rootScope', function($q, $rootScope){ - return { - request : function(p){ - var permissions = p; - var deferred = $q.defer(); - - if(permissions){ - // if one of the arg above is not defined - if(!permissions.apis) - permissions.apis = []; - else if(!permissions.origins) - permissions.origins = []; - - chrome.permissions.request({ - permissions: permissions.apis, - origins: permissions.origins - }, function(granted) { - $rootScope.$apply(deferred.resolve(granted)); - }); - } - else // if no permissions are requested, "nothing" is granted - deferred.resolve(true); - return deferred.promise; - }, - verify : function(p){ - var permissions = p; - var deferred = $q.defer(); - - if(permissions){ - // if one of the arg above is not defined - if(!permissions.apis) - permissions.apis = []; - else if(!permissions.origins) - permissions.origins = []; - - chrome.permissions.contains({ - permissions: permissions.apis, - origins: permissions.origins - }, function(granted) { - $rootScope.$apply(deferred.resolve(granted)); - }); - } - else // if no permissions are verified, "nothing" is granted - deferred.resolve(true); - return deferred.promise; - }, - revoke : function(p){ - var permissions = p; - var deferred = $q.defer(); - - if(permissions){ - // if one of the arg above is not defined - if(!permissions.apis) - permissions.apis = []; - else if(!permissions.origins) - permissions.origins = []; - - chrome.permissions.remove({ - permissions: permissions.apis, - origins: permissions.origins - }, function(removed) { - $rootScope.$apply(deferred.resolve(removed)); - }); - } - else // if no permissions are revoked, "nothing" is revoked - deferred.resolve(true); - return deferred.promise; - }, - getAll: function(){ - var deferred = $q.defer(); - chrome.permissions.getAll(function(permissions){ - $rootScope.$apply(deferred.resolve(permissions)); - }); - return deferred.promise; - } - } -}]); - -/******************************************************************/ -/* TOOLS */ -/******************************************************************/ - -cardboard.factory('ToolFactory', ['$q', '$rootScope', function($q, $rootScope){ - return { - isEmptyObject : function(o){ - for(var i in o){ return false;} - return true; - }, - getTime : function(){ - // for the header background - var date = new Date; - date.setTime(date); - var hour = date.getHours(); - var time; - - if (hour>5 && hour<8) - time="Dawn"; - else if (hour>8 && hour<19) - time="Day"; - else if (hour>19 && hour<21) - time="Dusk"; - else - time="Night"; - return time; - } - } -}]); \ No newline at end of file diff --git a/release/app/Filters.js b/release/app/Filters.js deleted file mode 100644 index 7acd3a6..0000000 --- a/release/app/Filters.js +++ /dev/null @@ -1,54 +0,0 @@ -cardboard.filter('truncate', function () { - return function (text, length, end) { - if (isNaN(length)) - length = 40; - - if (end === undefined) - end = "..."; - - if (text.length <= length || text.length - end.length <= length) { - return text; - } - else { - return String(text).substring(0, length-end.length) + end; - } - - }; -}); - -cardboard.filter('fromNow', function() { - return function(dateString) { - return moment(new Date(dateString)).fromNow(); - }; -}); - -cardboard.filter('bytes', function() { - return function(bytes, precision) { - if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-'; - if (typeof precision === 'undefined') precision = 1; - var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], - number = Math.floor(Math.log(bytes) / Math.log(1024)); - return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number]; - } -}); - -cardboard.filter('filename', function() { - return function(filename) { - return filename.replace(/^.*[\\\/]/, ''); - } -}); - - -cardboard.filter('host', function () { - return function ( input ) { - var matches, - output = "", - urls = /\w+:\/\/([\w|\.]+)/; - - matches = urls.exec( input ); - - if ( matches !== null ) output = matches[1]; - - return output; - }; -}); \ No newline at end of file diff --git a/release/app/Values.js b/release/app/Values.js deleted file mode 100644 index 9f90cf2..0000000 --- a/release/app/Values.js +++ /dev/null @@ -1,29 +0,0 @@ -// Default Settings -cardboard.value('DefaultSettings',{ - version : { "update": 3, "settings": 2 }, - backgrounds : [ - {id: 0, name: "Austin", type: "Google Now", url: "img/headers/Austin"}, - {id: 1, name: "Beach", type: "Google Now", url: "img/headers/Beach"}, - {id: 2, name: "Berlin", type: "Google Now", url: "img/headers/Berlin"}, - {id: 3, name: "Chicago", type: "Google Now", url: "img/headers/Chicago"}, - {id: 4, name: "Default", type: "Google Now", url: "img/headers/Default"}, - {id: 5, name: "Great Plains", type: "Google Now", url: "img/headers/GreatPlains"}, - {id: 6, name: "London", type: "Google Now", url: "img/headers/London"}, - {id: 7, name: "New York", type: "Google Now", url: "img/headers/NewYork"}, - {id: 8, name: "Paris", type: "Google Now", url: "img/headers/Paris"}, - {id: 9, name: "San Francisco", type: "Google Now", url: "img/headers/SanFrancisco"}, - {id: 10, name: "Seattle", type: "Google Now", url: "img/headers/Seattle"}, - {id: 11, name: "Tahoe", type: "Google Now", url: "img/headers/Tahoe"} - ], - backgroundId : 4, - backgroundPosition : "center", - backgroundLogo : true, - cards : { - "apps": {name: "Apps & Plugins", enabled: true, partial: "app/partials/AppCard.html", permissions: {apis:["management"]} }, - "bookmarks": {name: "Recent Bookmarks", enabled: true, partial: "app/partials/BookmarkCard.html", permissions: {apis:["bookmarks"]} }, - "qsettings": {name: "Quick Settings", enabled: true, partial: "app/partials/QuickSettingsCard.html", permissions: {apis: ["browsingData"]} }, - "downloads": {name: "Recent Downloads", enabled: true, partial: "app/partials/DownloadCard.html", permissions: {apis:["downloads"]} }, - "topsites": {name: "Top Sites", enabled: true, partial: "app/partials/TopSitesCard.html", permissions: {apis:["topSites"]} } - }, - searchEngine : "https://encrypted.google.com/search?q=" -}); \ No newline at end of file diff --git a/release/app/cardboard.js b/release/app/cardboard.js deleted file mode 100644 index 45c6307..0000000 --- a/release/app/cardboard.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * CardBoard module - * - * This module encapsulate the whole application - */ -var cardboard = angular.module('cardboard', ['ngRoute','ngSanitize','ngAnimate','ui.scrollfix','ui.bootstrap']); - -cardboard.config(['$routeProvider', '$compileProvider', '$provide', function($routeProvider, $compileProvider, $provide) { - $routeProvider - .when('/cardboard', { - templateUrl: 'app/partials/CardboardView.html' - }) - .when('/welcome', { - controller: 'WelcomeCtrl', - templateUrl: 'app/partials/WelcomeView.html' - }) - .when('/settings', { - templateUrl:'app/partials/SettingsView.html' - }) - .when('/changelog', { - templateUrl: 'app/partials/ChangelogView.html' - }) - .otherwise({ redirectTo: '/cardboard'}); - - // authorize chrome urls for imgs (appcard) - $compileProvider.imgSrcSanitizationWhitelist(/^\s*(chrome):/); - -}]); \ No newline at end of file diff --git a/release/app/modules/angular1.2.2-animate.min.js b/release/app/modules/angular1.2.2-animate.min.js deleted file mode 100644 index f938405..0000000 --- a/release/app/modules/angular1.2.2-animate.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - AngularJS v1.2.2 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(B,k,D){'use strict';k.module("ngAnimate",["ng"]).config(["$provide","$animateProvider",function(L,E){var q=k.noop,s=k.forEach,V=E.$$selectors,T=1,f="$$ngAnimateState",F="ng-animate",m={running:!0};L.decorator("$animate",["$delegate","$injector","$sniffer","$rootElement","$timeout","$rootScope","$document",function(G,B,H,h,A,r,D){function M(a){if(a){var d=[],c={};a=a.substr(1).split(".");(H.transitions||H.animations)&&a.push("");for(var b=0;b=s&&a.elapsedTime>=r&&u()}var f=a.data(z);if(a.hasClass(c)&&f){var k=a[0],l=f.timings,h=f.stagger,r=f.maxDuration,p=f.activeClassName,s=1E3*Math.max(l.transitionDelay,l.animationDelay), -w=Date.now(),v=O+" "+N,t=f.ii,x,f="",n=[];if(0=c;k--)d.end&&d.end(e[k]);e.length= -c}}var b,f,e=[],l=a;for(e.last=function(){return e[e.length-1]};a;){f=!0;if(e.last()&&v[e.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(F,"$1").replace(G,"$1");d.chars&&d.chars(p(b));return""}),k("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(d.comment&&d.comment(a.substring(4,b)),a=a.substring(b+3),f=!1);else if(w.test(a)){if(b=a.match(w))a=a.replace(b[0],""),f=!1}else if(H.test(a)){if(b=a.match(x))a= -a.substring(b[0].length),b[0].replace(x,k),f=!1}else I.test(a)&&(b=a.match(y))&&(a=a.substring(b[0].length),b[0].replace(y,c),f=!1);f&&(b=a.indexOf("<"),f=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(p(f)))}if(a==l)throw J("badparse",a);l=a}k()}function p(a){q.innerHTML=a.replace(//g,">")}function A(a){var d= -!1,c=g.bind(a,a.push);return{start:function(a,b,f){a=g.lowercase(a);!d&&v[a]&&(d=a);d||!0!==B[a]||(c("<"),c(a),g.forEach(b,function(a,b){var d=g.lowercase(b);!0!==L[d]||!0===C[d]&&!a.match(M)||(c(" "),c(b),c('="'),c(z(a)),c('"'))}),c(f?"/>":">"))},end:function(a){a=g.lowercase(a);d||!0!==B[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(z(a))}}}var J=g.$$minErr("$sanitize"),y=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,x=/^<\s*\/\s*([\w:-]+)[^>]*>/, -E=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,I=/^]*?)>/i,G=/]/,d=/^mailto:/;return function(c,k){if(!c)return c;var b,f=c,e=[],l=A(e),h,m,n={};g.isDefined(k)&&(n.target=k);for(;b=f.match(a);)h=b[0],b[2]==b[3]&&(h="mailto:"+h),m=b.index,l.chars(f.substr(0,m)),n.href=h,l.start("a",n),l.chars(b[0].replace(d,"")),l.end("a"), -f=f.substring(m+b[0].length);l.chars(f);return e.join("")}})})(window,window.angular); -//@# sourceMappingURL=angular-sanitize.min.js.map \ No newline at end of file diff --git a/release/app/modules/scrollfix.js b/release/app/modules/scrollfix.js deleted file mode 100644 index 1fe9f7e..0000000 --- a/release/app/modules/scrollfix.js +++ /dev/null @@ -1,57 +0,0 @@ -/*global angular, $, document*/ -/** - * Adds a 'ui-scrollfix' class to the element when the page scrolls past it's position. - * @param [offset] {int} optional Y-offset to override the detected offset. - * Takes 300 (absolute) or -300 or +300 (relative to detected) - */ -angular.module('ui.scrollfix',[]).directive('uiScrollfix', ['$window', function ($window) { - 'use strict'; - return { - require: '^?uiScrollfixTarget', - link: function (scope, elm, attrs, uiScrollfixTarget) { - var top = elm[0].offsetTop, - $target = uiScrollfixTarget && uiScrollfixTarget.$element || angular.element($window); - - if (!attrs.uiScrollfix) { - attrs.uiScrollfix = top; - } else if (typeof(attrs.uiScrollfix) === 'string') { - // charAt is generally faster than indexOf: http://jsperf.com/indexof-vs-charat - if (attrs.uiScrollfix.charAt(0) === '-') { - attrs.uiScrollfix = top - parseFloat(attrs.uiScrollfix.substr(1)); - } else if (attrs.uiScrollfix.charAt(0) === '+') { - attrs.uiScrollfix = top + parseFloat(attrs.uiScrollfix.substr(1)); - } - } - - function onScroll() { - // if pageYOffset is defined use it, otherwise use other crap for IE - var offset; - if (angular.isDefined($window.pageYOffset)) { - offset = $window.pageYOffset; - } else { - var iebody = (document.compatMode && document.compatMode !== "BackCompat") ? document.documentElement : document.body; - offset = iebody.scrollTop; - } - if (!elm.hasClass('ui-scrollfix') && offset > attrs.uiScrollfix) { - elm.addClass('ui-scrollfix'); - } else if (elm.hasClass('ui-scrollfix') && offset < attrs.uiScrollfix) { - elm.removeClass('ui-scrollfix'); - } - } - - $target.on('scroll', onScroll); - - // Unbind scroll event handler when directive is removed - scope.$on('$destroy', function() { - $target.off('scroll', onScroll); - }); - } - }; -}]).directive('uiScrollfixTarget', [function () { - 'use strict'; - return { - controller: function($element) { - this.$element = $element; - } - }; -}]); \ No newline at end of file diff --git a/release/app/modules/ui-bootstrap-custom-0.6.0.min.js b/release/app/modules/ui-bootstrap-custom-0.6.0.min.js deleted file mode 100644 index bd41f1d..0000000 --- a/release/app/modules/ui-bootstrap-custom-0.6.0.min.js +++ /dev/null @@ -1 +0,0 @@ -angular.module("ui.bootstrap",["ui.bootstrap.position","ui.bootstrap.bindHtml","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);return f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft),{width:b.prop("offsetWidth"),height:b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:c.prop("offsetWidth"),height:c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].body.scrollTop||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].body.scrollLeft||a[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+c+"'.");return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m=i.$eval(k.typeaheadMinLength)||1,n=i.$eval(k.typeaheadWaitMs)||0,o=i.$eval(k.typeaheadEditable)!==!1,p=b(k.typeaheadLoading).assign||angular.noop,q=b(k.typeaheadOnSelect),r=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,s=b(k.ngModel).assign,t=g.parse(k.typeahead),u=angular.element("");u.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&u.attr("template-url",k.typeaheadTemplateUrl);var v=i.$new();i.$on("$destroy",function(){v.$destroy()});var w=function(){v.matches=[],v.activeIdx=-1},x=function(a){var b={$viewValue:a};p(i,!0),c.when(t.source(v,b)).then(function(c){if(a===l.$viewValue){if(c.length>0){v.activeIdx=0,v.matches.length=0;for(var d=0;d=m&&(n>0?(y&&d.cancel(y),y=d(function(){x(a)},n)):x(a)),o?a:(l.$setValidity("editable",!1),void 0)}),l.$formatters.push(function(a){var b,c,d={};return r?(d.$model=a,r(i,d)):(d[t.itemName]=a,b=t.viewMapper(i,d),d[t.itemName]=void 0,c=t.viewMapper(i,d),b!==c?b:a)}),v.select=function(a){var b,c,d={};d[t.itemName]=c=v.matches[a].model,b=t.modelMapper(i,d),s(i,b),l.$setValidity("editable",!0),q(i,{$item:c,$model:b,$label:t.viewMapper(i,d)}),w(),j[0].focus()},j.bind("keydown",function(a){0!==v.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(v.activeIdx=(v.activeIdx+1)%v.matches.length,v.$digest()):38===a.which?(v.activeIdx=(v.activeIdx?v.activeIdx:v.matches.length)-1,v.$digest()):13===a.which||9===a.which?v.$apply(function(){v.select(v.activeIdx)}):27===a.which&&(a.stopPropagation(),w(),v.$digest()))});var z=function(a){j[0]!==a.target&&(w(),v.$digest())};e.bind("click",z),i.$on("$destroy",function(){e.unbind("click",z)}),j.after(a(u)(v))}}}]).directive("typeaheadPopup",function(){return{restrict:"E",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"E",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?b.replace(new RegExp(a(c),"gi"),"$&"):b}}); \ No newline at end of file diff --git a/release/app/partials/AppCard.html b/release/app/partials/AppCard.html deleted file mode 100644 index 3c1dc70..0000000 --- a/release/app/partials/AppCard.html +++ /dev/null @@ -1,52 +0,0 @@ - -
-
- {{settings.cards['apps'].name}} -
-
    -
  • - - - -
    More Apps
    -
  • -
  • - - -
    {{app.name}}
    -
  • -
-
\ No newline at end of file diff --git a/release/app/partials/AppearanceCard.html b/release/app/partials/AppearanceCard.html deleted file mode 100644 index 364fdbd..0000000 --- a/release/app/partials/AppearanceCard.html +++ /dev/null @@ -1,23 +0,0 @@ - -
-
Appearance
-
- Background image - - Or - -
-
- Background position - -
-
- - -
-
-
\ No newline at end of file diff --git a/release/app/partials/BookmarkCard.html b/release/app/partials/BookmarkCard.html deleted file mode 100644 index 2939e12..0000000 --- a/release/app/partials/BookmarkCard.html +++ /dev/null @@ -1,56 +0,0 @@ - -
-
- {{settings.cards['bookmarks'].name}} -
-
    -
  • -
- - -
\ No newline at end of file diff --git a/release/app/partials/CardboardView.html b/release/app/partials/CardboardView.html deleted file mode 100644 index 66259c7..0000000 --- a/release/app/partials/CardboardView.html +++ /dev/null @@ -1,15 +0,0 @@ -
- -
- -
-
-
-
-
- -
- - \ No newline at end of file diff --git a/release/app/partials/CardsCard.html b/release/app/partials/CardsCard.html deleted file mode 100644 index 8b069e5..0000000 --- a/release/app/partials/CardsCard.html +++ /dev/null @@ -1,40 +0,0 @@ - - -
-
Cards
-
    -
  • - - -
    -
  • -
  • - -
    Revoke All
    -
  • -
-
\ No newline at end of file diff --git a/release/app/partials/ChangelogView.html b/release/app/partials/ChangelogView.html deleted file mode 100644 index fc8fd47..0000000 --- a/release/app/partials/ChangelogView.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
- - \ No newline at end of file diff --git a/release/app/partials/DownloadCard.html b/release/app/partials/DownloadCard.html deleted file mode 100644 index c766ebd..0000000 --- a/release/app/partials/DownloadCard.html +++ /dev/null @@ -1,171 +0,0 @@ - -
-
- {{settings.cards['downloads'].name}} -
-
    -
  • - -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    {{download.filename | filename}}
    - {{download.bytesReceived | bytes}} / {{download.totalBytes | bytes}} - - {{download.url | host}} -
    - -
    -
    -
    -
    -
    paused
    - - -
    -
    -
    {{download.estimatedEndTime | fromNow}}
    - - -
    -
    -
    -
    {{download.error}}
    - -
    -
    -
    {{download.endTime | fromNow}}
    - Canceled - -
    -
    -
    - -
  • -
-
\ No newline at end of file diff --git a/release/app/partials/FeedbackCard.html b/release/app/partials/FeedbackCard.html deleted file mode 100644 index b67dbb5..0000000 --- a/release/app/partials/FeedbackCard.html +++ /dev/null @@ -1,42 +0,0 @@ - -
- About Card Board -
-
-

This application is still in beta and may contains bugs. Please be indulgent as I will do my best to fix them as quickly as possible. - I do this for free, for fun and because I enjoy sharing cool stuff :D

- -
-
-

Have 1 min?

-

Help me improve this application by taking 1 minute to review and report bugs

- Feedback -
- -
-

Stay tuned

-

Follow the project on his Google+ Page

- Google + -
-
- -
\ No newline at end of file diff --git a/release/app/partials/QuickSettingsCard.html b/release/app/partials/QuickSettingsCard.html deleted file mode 100644 index fc5e8df..0000000 --- a/release/app/partials/QuickSettingsCard.html +++ /dev/null @@ -1,41 +0,0 @@ - -
-
- - {{settings.cards['qsettings'].name}} -
-
-
    -
  • -

    Cache

    -
    Clear
    -
  • -
  • -

    Cookies

    -
    Clear
    -
  • -
  • -

    History

    -
    Clear
    -
  • -
  • -

    Local Storage

    -
    Clear
    -
  • -
-
-
\ No newline at end of file diff --git a/release/app/partials/SettingsView.html b/release/app/partials/SettingsView.html deleted file mode 100644 index 21ba7f6..0000000 --- a/release/app/partials/SettingsView.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
- -
- - \ No newline at end of file diff --git a/release/app/partials/StorageCard.html b/release/app/partials/StorageCard.html deleted file mode 100644 index 8c26283..0000000 --- a/release/app/partials/StorageCard.html +++ /dev/null @@ -1,10 +0,0 @@ -
- {{settings.cards['storage'].name}} -
-
    -
  • -
    name: {{su.name}}
    -
    type: {{su.type}}
    -
    capacity: {{su.capacity}}
    -
  • -
\ No newline at end of file diff --git a/release/app/partials/TopSitesCard.html b/release/app/partials/TopSitesCard.html deleted file mode 100644 index f418aa4..0000000 --- a/release/app/partials/TopSitesCard.html +++ /dev/null @@ -1,34 +0,0 @@ - -
-
- {{settings.cards['topsites'].name}} -
- -
\ No newline at end of file diff --git a/release/app/partials/WelcomeView.html b/release/app/partials/WelcomeView.html deleted file mode 100644 index b830f56..0000000 --- a/release/app/partials/WelcomeView.html +++ /dev/null @@ -1,85 +0,0 @@ - -
- -
-
Welcome
-
-

This is your AWESOME New Tab Page

-
-
- -
-
-
-

This is a card, it shows useful information about your browser.

- -
-
-
-
Why CardBoard is Awesome
-
    -
  • Preferences synced accross your Chrome sessions when signed into your Google Account
  • -
  • Fine control over your data thanks to in-app permissions management
  • -
  • Awesome & Responsive design
  • -
-
-
- -
-
-
-
-

Some cards need your consent because they display your data such as apps, bookmarks and downloads.

-

Each permission needs to be granted only once and you can always manage them later on the settings page.

-

Go ahead, allow some cards...

-
- -
-
- -
-
- -
-
You're done !
-
- Your Awesome New Tab Page is set up -
-
- Show me -
-
- - - -
\ No newline at end of file diff --git a/release/app/partials/WhatsNewCard.html b/release/app/partials/WhatsNewCard.html deleted file mode 100644 index cc44606..0000000 --- a/release/app/partials/WhatsNewCard.html +++ /dev/null @@ -1,40 +0,0 @@ - -
- What's New ? -
-
-
    -
  • Due to an update involving settings, your preferences have been reset. Sorry for the inconvenience
  • -
  • New Card: Top Sites
  • -
  • Pick your own background and more
  • -
  • Apps organised by frequency from now on
  • -
  • Uninstall apps on the fly with
  • -
  • Bug fixes
  • -
- - -
-
    -
  • Got it !
  • -
\ No newline at end of file diff --git a/release/css/cardui.css b/release/css/cardui.css deleted file mode 100644 index 1a52da1..0000000 --- a/release/css/cardui.css +++ /dev/null @@ -1,435 +0,0 @@ -/******************************************************/ -/* CARD UI CSS */ -/* by virtual-dev */ -/******************************************************/ - -/* ---------- FONT-FACE ---------- */ -@font-face{ - font-family: "RobotoRegular"; - src: url(../fonts/roboto/RobotoRegular.woff); -} - -@font-face{ - font-family: "RobotoLight"; - src: url(../fonts/roboto/RobotoLight.woff); -} - -@font-face{ - font-family: "RobotoThin"; - src: url(../fonts/roboto/RobotoThin.woff); -} -/* ------------------------------- */ - -.card *{ - margin: 0; - padding: 0; -} - -.card { - position: relative; - display: inline-block; - - margin: 10px; - min-height: 100px; - width: 400px; - - font-family: "RobotoLight", sans-serif; - background: #fff; - border-radius: 3px; - box-shadow: 0px 2px 3px rgba(0,0,0,0.1); -} - -.card .title, -.card .category, -.card .content{ - margin: 0 10px; - padding: 15px 5px; -} - -.card .title{ - padding-bottom: 0; - font-size: 20px; - font-weight: normal; - font-family: "RobotoThin"; - color: #777; -} - -.card .category{ - padding-bottom: 13px; - border-bottom: 1px solid #e5e5e5; - - font-size: 12px; - font-weight: normal; - font-family: "RobotoThin"; - color: #999; -} -.card .category span[ng-click]:hover{ - cursor: pointer; - text-decoration: underline; -} - -.card .content { - font-size: 13px; - color: #999; -} - -/* ----------- MEDIA ----------- */ - -.card .media{ - height: 150px; - width: 100%; - - background-repeat: no-repeat; - background-position: center; - background-size: cover; -} - -.card .media img{ - height: inherit; - width: inherit; -} - -.card .media.inline{ - display: table-cell; - margin-left: 10px; - - height: 100%; - width: 170px; -} - -/* ----------- ACTIONS ----------- */ - -.card .actions{ - margin: 0 10px; - - font-size: 14px; - border-top: 1px solid #e5e5e5; -} - -.card .action{ - display: block; - padding: 5px; - - cursor: pointer; - list-style: none; - color: #33A1E5; -} - -.card .action:not(:last-child){ - border-color: #e5e5e5; - border-width: 1px; - border-bottom-style: solid; -} - -.card .actions.inline{ - display: table; - width: 100%; - margin: 0; - padding: 3px 0; - - text-align: center; -} - -.card .actions.inline .action{ - display: table-cell; - padding: 2px; - - border-bottom-style: none; -} - -.card .actions.inline .action:not(:last-child){ - border-right-style: solid; -} - -.card .action i{ - margin-right: 10px; - font-size: 16px; -} - -/* ----------- MENU ----------- */ - -.card .menu{ - visibility: hidden; - opacity: 0; - position: absolute; - z-index: 2; - top: 0; - left: 100%; - margin-left: 7px; - - min-width: 150px; - padding: 5px; - - border-radius: 3px; - background-color: rgba(10,10,10,0.9); - font-size: 12px; - - -webkit-transition: visibility 0s linear, .2s opacity ease-in; - -moz-transition: visibility 0s linear, .2s opacity ease-in; - -ms-transition: visibility 0s linear, .2s opacity ease-in; - -o-transition: visibility 0s linear, .2s opacity ease-in; - transition: visibility 0s linear, .2s opacity ease-in; -} - -.card .menu.active{ visibility: visible; opacity: 1;} - -/* small triangle for popup */ -.card .menu:before{ - content:''; - display:block; - width:0; - height:0; - position:absolute; - - border-top: 8px solid transparent; - border-bottom: 8px solid transparent; - border-right:8px solid rgba(10,10,10,0.9); - left:-8px; - - top:7px; -} - - -.card .menu-item{ - cursor: pointer; - padding: 7px; - list-style: none; - color: #aaa; -} - -.card .menu-item:not(:last-child){ - border-color: #333; - border-width: 1px; - border-bottom-style: solid; -} - -/* ----------- BUTTONS ----------- */ - -.btn{ - display: inline-block; - height: 28px; - line-height: 28px; - min-width: 54px; - padding: 0 8px; - - color: #404040; - font-size: 12px; - font-family: "RobotoRegular", sans-serif; - text-align: center; - white-space: nowrap; - - background-color: #f5f5f5; - - border-radius: 2px; - border: 1px solid #d9d9d9; - - cursor: pointer; - -webkit-transition: border .15s, color .15s, background-color .15s; -} -.btn:hover, -.btn:focus{ - outline: none; - border-color: #b8b8b8; - -webkit-box-shadow: 0 1px 0 0 rgba(0,0,0,.1); -} -.btn:active{ - -webkit-box-shadow: inset 0 2px 0 #ddd; - background: #e5e5e5; - color: #262626; -} - -.btn.blue, -.btn.red, -.btn.green{ - color: #fff; - font-family: "RobotoLight", sans-serif; - border-color: transparent; -} - -.btn.blue{ - background-color: #427fed; -} -.btn.blue:hover, -.btn.blue:focus{ - -webkit-box-shadow: inset 0 -1px 0 #2f69c2; - background-color: #4285f4; - border-bottom-color: #2f69c2; -} -.btn.blue:active{ - -webkit-box-shadow: inset 0 1px 0 #21448d; - background-color: #2c56b1; - border-top-color: #21448d; -} - -.btn.green{ - background-color: #53a93f; -} -.btn.green:hover, -.btn.green:focus{ - -webkit-box-shadow: inset 0 -1px 0 #4c8534; - background-color: #65b045; - border-bottom-color: #4c8534; -} -.btn.green:active{ - -webkit-box-shadow: inset 0 1px 0 #2f6124; - background-color: #3e802f; - border-top-color: #2f6124; -} - -.btn.red{ - background-color: #d73d32; -} -.btn.red:hover, -.btn.red:focus{ - -webkit-box-shadow: inset 0 -1px 0 #bd3d2a; - background-color: #e74b37; - border-bottom-color: #bd3d2a; -} -.btn.red:active{ - -webkit-box-shadow: inset 0 1px 0 #9a3323; - background-color: #be3e2e; - border-top-color: #9a3323; -} - -/* ----------- TEXTBOXES ----------- */ - -input.textbox{ - display: inline-block; - box-sizing: border-box; - height: 30px; - padding: 5px 10px; - - color: #444; - font-size: 13px; - font-family: "RobotoLight", "Lucida Grande", sans-serif; - - border-radius: 3px; - border: 1px solid rgba(0,0,0,0.3); - - -webkit-transition: border .20s; -} - -input.textbox:focus{ - outline: none; - border-color: #38E; -} - -/* ----------- LISTS ----------- */ - -.content li{ - list-style: none; - padding: 5px; - margin: 0 3px; -} - -.content li.bullet{ - list-style: disc inside; -} - -/* ----------- ICONS ----------- */ - -/* Moved to font-awesome ==> http://fontawesome.io/ */ - -/* ----------- DROPDOWNS ----------- */ - -.card select{ - -webkit-appearance : none; - display: inline-block; - height: 28px; - min-width: 60px; - max-width: 135px; - padding: 0 6px; - padding-right: 18px; - margin: 0 5px; - - color: #404040; - font-family: "RobotoRegular", sans-serif; - - background-color: #FFF; - - border-radius: 2px; - border: 1px solid #d9d9d9; - outline: none; - - cursor: pointer; - -webkit-transition: all .15s; - - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAAOklEQVQYV2P4//8/AwxHRkb+B2I4H13iP7ICbBJwBbgkwBhuLDaMXxLZddgk8duJTQKnP7E6CFkChAFpxL/ydoaj+QAAAABJRU5ErkJggg==); - background-repeat: no-repeat; - background-position: 95%; -} -.card select:focus{ - box-shadow: 0px 0px 2px 1px rgba(0,0,0,0.1); -} -.card select:hover{ - border-color: #b8b8b8; - box-shadow: 0 1px 0 0 rgba(0,0,0,.1); -} - -/* ----------- FILE INPUTS ----------- */ - -.card input[type="file"]{ - color: transparent; - outline: none; - cursor: pointer; - width: 85px; - height: 30px; - overflow: hidden; - margin: 0 5px; - margin-bottom: -11px; -} -.card input[type="file"]::-webkit-file-upload-button { - visibility: hidden; -} -.card input[type="file"]::before { - content: 'Pick your own'; - display: inline-block; - line-height: 27px; - padding: 0 6px; - color: #404040; - font-family: "RobotoRegular", sans-serif; - background-color: #FFF; - border-radius: 2px; - border: 1px solid #d9d9d9; - cursor: pointer; - -webkit-transition: all .15s; -} - -.card input[type="file"]:focus::before{ - box-shadow: 0px 0px 2px 2px rgba(0,0,0,0.1); -} -.card input[type="file"]:hover::before{ - border-color: #b8b8b8; - box-shadow: 0 1px 0 0 rgba(0,0,0,.1); -} - -/* ----------- CHECKBOXES ----------- */ - -.card input[type="checkbox"]{ - -webkit-appearance : none; - height: 13px; - width: 13px; - border: 1px solid #C6C6C6; - border-radius: 1px; - margin: 0 5px; - outline: none; -} -.card input[type="checkbox"]:checked{ - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAtklEQVQ4y2P4//8/A7Ux1Q0cxoaCADIbCUgCMTvVXAoE5kA8CYidyXYpGrAH4iVAHIXiCwoMDQTimUBcBsRMlBrKCsTpUANzkC0j11BuIK6EGlgKsoAkQ4FgChD7AzELVI8YEDdDDawDYk6YQaQY6gg1oAqILYC4D8oHGcyLbBAphoJAKtQgGO4EYiHk2CLHUJAXm6AG9gCxNHoSIMdQEJCFGqiALaGSayjMxQwUGzq0S6nhZygA2ojsbh6J67kAAAAASUVORK5CYII=); - background-size: 20px; - background-position: center; - border-color: #4D90FE; -} -.card input[type="checkbox"]:hover:not(:disabled){ - box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); - cursor: pointer; -} -.card input[type="checkbox"]:active:not(:disabled){ - background-color: #ebebeb; -} -.card input[type="checkbox"]:focus:not(:disabled){ - box-shadow: 0px 0px 2px 1px rgba(0,0,0,0.1); -} -.card input[type="checkbox"]:disabled{ - opacity: .3; -} \ No newline at end of file diff --git a/release/css/font-awesome.min.css b/release/css/font-awesome.min.css deleted file mode 100644 index 449d6ac..0000000 --- a/release/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"} \ No newline at end of file diff --git a/release/css/perso.css b/release/css/perso.css deleted file mode 100644 index a907855..0000000 --- a/release/css/perso.css +++ /dev/null @@ -1,337 +0,0 @@ -/* ------------- ANIMATIONS ------------- */ - -@-webkit-keyframes pulsate { - 0% { - -webkit-transform: scale(0.1, 0.1); opacity: 0.0; - } - 50% { - opacity: 1.0; - } - 100% { - -webkit-transform: scale(1.2, 1.2); opacity: 0.0; - } -} - -/* slideUp (from down) animation */ -.slideUp{ - transition: -webkit-transform ease .5s, opacity ease .2s; - transition-delay: .2s; -} -.slideUp.ng-enter{ - -webkit-transform: translateY(50px); - opacity: 0; -} -.slideUp.ng-leave, -.slideUp.ng-enter.ng-enter-active{ - -webkit-transform: translateY(0); - opacity: 1; -} -.slideUp.ng-leave.ng-leave-active{ - -webkit-transform: translateX(50px); - opacity: 0; -} - -/* cascading hard-coded effect */ -.slideUp.t1{ transition-delay: .3s;} -.slideUp.t2{ transition-delay: .4s;} -.slideUp.t3{ transition-delay: .5s;} -.slideUp.t4{ transition-delay: .6s;} - -/* slideDown (from up) animation */ -.slideDown{ - transition: all ease .3s; -} -.slideDown.ng-hide-remove{ - -webkit-transform: translateY(-15px); - opacity: 0; -} -.slideDown.ng-hide-remove.ng-hide-remove-active{ - -webkit-transform: translateY(0); - opacity: 1; -} - -/* ----------- CARD + ----------- */ - -strong{ - font-family: "RobotoRegular"; - font-weight: normal; -} - -.card a{ - text-decoration: none; - color: #999; -} - -.card a:not(.btn):hover{ - color: #33A1E5; -} - -.card a:focus{ - outline: none; - color: #33A1E5; -} - -.card .category i{ - float: right; - font-size: 20px; - cursor: pointer; -} - -/* card info block for in between cards */ -.card.info{ - min-height: 30px; - background-color: transparent; - border: 1px solid #bbb; - border-left: 0; - border-right: 0; - border-radius: 0; - box-shadow: 0 0 0 0; -} -.card.info .content{ - display: flex; - justify-content: space-between; - align-items: center; -} -.card.info .content .text{ - flex-grow: 1; -} -.card.info .content i{ - flex-shrink: 0; - font-size: 15px; -} -.card.info .content a{ - text-decoration: underline; -} - -/* ----------- GENERAL ----------- */ - -*{ - margin: 0; - padding: 0; -} - -body{ - background-color: #E9E9E9; -} - -::-webkit-scrollbar { - display: none; -} - -.ng-hide{ - display: none; -} - -i.fa-circle-o{ - -webkit-animation: pulsate .8s ease-out; - -webkit-animation-iteration-count: infinite; -} -i.fa-check{ - margin-right: 7px; - color: #53B853; -} -i.fa-warning{ - color: #FF8500; -} -i.fa.blank{ - visibility: hidden; -} -i.fa-arrow-down{ - color: #33A1E5; -} - -/* ----------- FOOTER ----------- */ - - -footer{ - font-family: "RobotoThin"; - text-align: center; - width: 100%; - height: 30px; - padding: 10px 0; -} - -footer a{ - transition: all ease .2s; - font-size: 20px; - color: #999; - text-decoration: none; -} - -footer a:hover, -footer a:focus{ - outline: none; - color: #777; -} - -footer i{ - margin-left: 10px; -} - -/* ----------- HEADER ----------- */ - -header{ - height: 200px; - min-width: 420px; - - background-position: center; - background-size: cover; - background-repeat: no-repeat; -} - -header h1{ - opacity: 0; - width: 100%; - height: 120px; - margin-bottom: 20px; -} - -header a:focus{ - outline: none; -} - -header form{ - display: flex; - padding: 0 15px; - height: 35px; - margin: auto; - min-width: 390px; - max-width: 800px; -} - -header form.ui-scrollfix{ - position: fixed; - padding: 0; - left: 15px; - right: 15px; - top: 10px; - z-index: 20; -} - -header form .searchbox{ - z-index: 2; - width: 100%; - height: inherit; -} - -header form .searchbox input[type="text"]{ - width: inherit; - height: inherit; - border: none; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - box-shadow: 1px 2px 8px rgba(0,0,0,0.3); -} - -header form button.search{ - min-width: 70px; - height: inherit; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - font-size: 14px; - box-shadow: 1px 2px 8px rgba(0,0,0,0.3) !important; -} - -header button.search:hover, -header button.search:focus{ - border-bottom-width: 2px; -} - -header form input[type="submit"]{ - display: none; -} - -/* ----------- TYPEAHEAD ----------- */ - -.typeahead{ - z-index: -1; - position: relative; - margin-top: 4px; - - background-color: white; - font-family: sans-serif; - font-size: 13px; - color: #555; - overflow: hidden; - - border-radius: 2px; - - box-shadow: 1px 2px 8px rgba(0,0,0,0.3); -} - -/* fix for buggy animation of ng-show */ -.typeahead.ng-hide{ - display: block; -} - -.typeahead li{ - font-family: "RobotoLight"; - list-style: none; - padding: 5px; - cursor: pointer; - border-left: 3px solid transparent; -} - -.typeahead li a{ - display: block; - background-size: 18px; - background-repeat: no-repeat; - background-position: 2px center; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.typeahead li a i{ - margin-right: 10px; - color: #427fed; -} - -.typeahead li.active{ - border-color: #427fed; - background-color: #EFEFEF; -} - -/* ----------- FEED ----------- */ - -#feed{ - min-width: 420px; - transition: -webkit-filter .5s ease; - -webkit-filter: blur(0); -} - -#feed.blur{ - -webkit-filter: blur(2px); -} - -/* Flex method */ -/*#feed{ - display: -webkit-flex; - -webkit-flex-wrap: wrap; - -webkit-justify-content: center; - -webkit-align-items: center; -}*/ - -/* Column method */ -#feed{ - /*width: 1680px;*/ - width: 840px; - margin: 0 auto; - -webkit-column-width: 420px; - -webkit-column-gap: 0px; -} -/*@media (max-width: 1679px) { - #feed { - width: 1260px; - } -} -@media (max-width: 1259px) { - #feed { - width: 840px; - } -}*/ -@media (max-width: 839px) { - #feed { - width: 420px; - } -} \ No newline at end of file diff --git a/release/fonts/fontawesome-webfont.woff b/release/fonts/fontawesome-webfont.woff deleted file mode 100755 index 8c1748a..0000000 Binary files a/release/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/release/fonts/roboto/RobotoLight.woff b/release/fonts/roboto/RobotoLight.woff deleted file mode 100644 index dde495f..0000000 Binary files a/release/fonts/roboto/RobotoLight.woff and /dev/null differ diff --git a/release/fonts/roboto/RobotoRegular.woff b/release/fonts/roboto/RobotoRegular.woff deleted file mode 100644 index c43402d..0000000 Binary files a/release/fonts/roboto/RobotoRegular.woff and /dev/null differ diff --git a/release/fonts/roboto/RobotoThin.woff b/release/fonts/roboto/RobotoThin.woff deleted file mode 100644 index 4814014..0000000 Binary files a/release/fonts/roboto/RobotoThin.woff and /dev/null differ diff --git a/release/img/cws128.png b/release/img/cws128.png deleted file mode 100644 index 28b90f2..0000000 Binary files a/release/img/cws128.png and /dev/null differ diff --git a/release/img/google.webp b/release/img/google.webp deleted file mode 100644 index ef1f3f1..0000000 Binary files a/release/img/google.webp and /dev/null differ diff --git a/release/img/headers/Austin_Dawn.webp b/release/img/headers/Austin_Dawn.webp deleted file mode 100644 index 5f32e1d..0000000 Binary files a/release/img/headers/Austin_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Austin_Day.webp b/release/img/headers/Austin_Day.webp deleted file mode 100644 index 5bda865..0000000 Binary files a/release/img/headers/Austin_Day.webp and /dev/null differ diff --git a/release/img/headers/Austin_Dusk.webp b/release/img/headers/Austin_Dusk.webp deleted file mode 100644 index c1710b8..0000000 Binary files a/release/img/headers/Austin_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Austin_Night.webp b/release/img/headers/Austin_Night.webp deleted file mode 100644 index 6fe5fbf..0000000 Binary files a/release/img/headers/Austin_Night.webp and /dev/null differ diff --git a/release/img/headers/Beach_Dawn.webp b/release/img/headers/Beach_Dawn.webp deleted file mode 100644 index 96c05eb..0000000 Binary files a/release/img/headers/Beach_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Beach_Day.webp b/release/img/headers/Beach_Day.webp deleted file mode 100644 index 3430f5e..0000000 Binary files a/release/img/headers/Beach_Day.webp and /dev/null differ diff --git a/release/img/headers/Beach_Dusk.webp b/release/img/headers/Beach_Dusk.webp deleted file mode 100644 index 61afd05..0000000 Binary files a/release/img/headers/Beach_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Beach_Night.webp b/release/img/headers/Beach_Night.webp deleted file mode 100644 index cbc5c70..0000000 Binary files a/release/img/headers/Beach_Night.webp and /dev/null differ diff --git a/release/img/headers/Berlin_Dawn.webp b/release/img/headers/Berlin_Dawn.webp deleted file mode 100644 index 98d4a59..0000000 Binary files a/release/img/headers/Berlin_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Berlin_Day.webp b/release/img/headers/Berlin_Day.webp deleted file mode 100644 index 5de78ff..0000000 Binary files a/release/img/headers/Berlin_Day.webp and /dev/null differ diff --git a/release/img/headers/Berlin_Dusk.webp b/release/img/headers/Berlin_Dusk.webp deleted file mode 100644 index 46553e7..0000000 Binary files a/release/img/headers/Berlin_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Berlin_Night.webp b/release/img/headers/Berlin_Night.webp deleted file mode 100644 index b9b38e6..0000000 Binary files a/release/img/headers/Berlin_Night.webp and /dev/null differ diff --git a/release/img/headers/Chicago_Dawn.webp b/release/img/headers/Chicago_Dawn.webp deleted file mode 100644 index 29d4b5b..0000000 Binary files a/release/img/headers/Chicago_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Chicago_Day.webp b/release/img/headers/Chicago_Day.webp deleted file mode 100644 index 261f1f9..0000000 Binary files a/release/img/headers/Chicago_Day.webp and /dev/null differ diff --git a/release/img/headers/Chicago_Dusk.webp b/release/img/headers/Chicago_Dusk.webp deleted file mode 100644 index f150ea6..0000000 Binary files a/release/img/headers/Chicago_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Chicago_Night.webp b/release/img/headers/Chicago_Night.webp deleted file mode 100644 index 73668a2..0000000 Binary files a/release/img/headers/Chicago_Night.webp and /dev/null differ diff --git a/release/img/headers/Default_Dawn.webp b/release/img/headers/Default_Dawn.webp deleted file mode 100644 index 1873693..0000000 Binary files a/release/img/headers/Default_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Default_Day.webp b/release/img/headers/Default_Day.webp deleted file mode 100644 index d6fed81..0000000 Binary files a/release/img/headers/Default_Day.webp and /dev/null differ diff --git a/release/img/headers/Default_Dusk.webp b/release/img/headers/Default_Dusk.webp deleted file mode 100644 index c11a808..0000000 Binary files a/release/img/headers/Default_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Default_Night.webp b/release/img/headers/Default_Night.webp deleted file mode 100644 index e141df2..0000000 Binary files a/release/img/headers/Default_Night.webp and /dev/null differ diff --git a/release/img/headers/GreatPlains_Dawn.webp b/release/img/headers/GreatPlains_Dawn.webp deleted file mode 100644 index 2e24cd7..0000000 Binary files a/release/img/headers/GreatPlains_Dawn.webp and /dev/null differ diff --git a/release/img/headers/GreatPlains_Day.webp b/release/img/headers/GreatPlains_Day.webp deleted file mode 100644 index 2c1626c..0000000 Binary files a/release/img/headers/GreatPlains_Day.webp and /dev/null differ diff --git a/release/img/headers/GreatPlains_Dusk.webp b/release/img/headers/GreatPlains_Dusk.webp deleted file mode 100644 index 3de23ec..0000000 Binary files a/release/img/headers/GreatPlains_Dusk.webp and /dev/null differ diff --git a/release/img/headers/GreatPlains_Night.webp b/release/img/headers/GreatPlains_Night.webp deleted file mode 100644 index 8c919e8..0000000 Binary files a/release/img/headers/GreatPlains_Night.webp and /dev/null differ diff --git a/release/img/headers/London_Dawn.webp b/release/img/headers/London_Dawn.webp deleted file mode 100644 index 3cfd129..0000000 Binary files a/release/img/headers/London_Dawn.webp and /dev/null differ diff --git a/release/img/headers/London_Day.webp b/release/img/headers/London_Day.webp deleted file mode 100644 index 0cf350d..0000000 Binary files a/release/img/headers/London_Day.webp and /dev/null differ diff --git a/release/img/headers/London_Dusk.webp b/release/img/headers/London_Dusk.webp deleted file mode 100644 index 1ecd438..0000000 Binary files a/release/img/headers/London_Dusk.webp and /dev/null differ diff --git a/release/img/headers/London_Night.webp b/release/img/headers/London_Night.webp deleted file mode 100644 index df91b67..0000000 Binary files a/release/img/headers/London_Night.webp and /dev/null differ diff --git a/release/img/headers/NewYork_Dawn.webp b/release/img/headers/NewYork_Dawn.webp deleted file mode 100644 index d6fefd0..0000000 Binary files a/release/img/headers/NewYork_Dawn.webp and /dev/null differ diff --git a/release/img/headers/NewYork_Day.webp b/release/img/headers/NewYork_Day.webp deleted file mode 100644 index de5e3c6..0000000 Binary files a/release/img/headers/NewYork_Day.webp and /dev/null differ diff --git a/release/img/headers/NewYork_Dusk.webp b/release/img/headers/NewYork_Dusk.webp deleted file mode 100644 index de6eb41..0000000 Binary files a/release/img/headers/NewYork_Dusk.webp and /dev/null differ diff --git a/release/img/headers/NewYork_Night.webp b/release/img/headers/NewYork_Night.webp deleted file mode 100644 index c52ef24..0000000 Binary files a/release/img/headers/NewYork_Night.webp and /dev/null differ diff --git a/release/img/headers/Paris_Dawn.webp b/release/img/headers/Paris_Dawn.webp deleted file mode 100644 index e3e13d8..0000000 Binary files a/release/img/headers/Paris_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Paris_Day.webp b/release/img/headers/Paris_Day.webp deleted file mode 100644 index e3e13d8..0000000 Binary files a/release/img/headers/Paris_Day.webp and /dev/null differ diff --git a/release/img/headers/Paris_Dusk.webp b/release/img/headers/Paris_Dusk.webp deleted file mode 100644 index 1cadb64..0000000 Binary files a/release/img/headers/Paris_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Paris_Night.webp b/release/img/headers/Paris_Night.webp deleted file mode 100644 index 1cadb64..0000000 Binary files a/release/img/headers/Paris_Night.webp and /dev/null differ diff --git a/release/img/headers/SanFrancisco_Dawn.webp b/release/img/headers/SanFrancisco_Dawn.webp deleted file mode 100644 index e608032..0000000 Binary files a/release/img/headers/SanFrancisco_Dawn.webp and /dev/null differ diff --git a/release/img/headers/SanFrancisco_Day.webp b/release/img/headers/SanFrancisco_Day.webp deleted file mode 100644 index 1adeef8..0000000 Binary files a/release/img/headers/SanFrancisco_Day.webp and /dev/null differ diff --git a/release/img/headers/SanFrancisco_Dusk.webp b/release/img/headers/SanFrancisco_Dusk.webp deleted file mode 100644 index f65e693..0000000 Binary files a/release/img/headers/SanFrancisco_Dusk.webp and /dev/null differ diff --git a/release/img/headers/SanFrancisco_Night.webp b/release/img/headers/SanFrancisco_Night.webp deleted file mode 100644 index 655ffb9..0000000 Binary files a/release/img/headers/SanFrancisco_Night.webp and /dev/null differ diff --git a/release/img/headers/Seattle_Dawn.webp b/release/img/headers/Seattle_Dawn.webp deleted file mode 100644 index cb97ea4..0000000 Binary files a/release/img/headers/Seattle_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Seattle_Day.webp b/release/img/headers/Seattle_Day.webp deleted file mode 100644 index a083102..0000000 Binary files a/release/img/headers/Seattle_Day.webp and /dev/null differ diff --git a/release/img/headers/Seattle_Dusk.webp b/release/img/headers/Seattle_Dusk.webp deleted file mode 100644 index 5ae6191..0000000 Binary files a/release/img/headers/Seattle_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Seattle_Night.webp b/release/img/headers/Seattle_Night.webp deleted file mode 100644 index 09fe873..0000000 Binary files a/release/img/headers/Seattle_Night.webp and /dev/null differ diff --git a/release/img/headers/Tahoe_Dawn.webp b/release/img/headers/Tahoe_Dawn.webp deleted file mode 100644 index 22ec467..0000000 Binary files a/release/img/headers/Tahoe_Dawn.webp and /dev/null differ diff --git a/release/img/headers/Tahoe_Day.webp b/release/img/headers/Tahoe_Day.webp deleted file mode 100644 index 08850ac..0000000 Binary files a/release/img/headers/Tahoe_Day.webp and /dev/null differ diff --git a/release/img/headers/Tahoe_Dusk.webp b/release/img/headers/Tahoe_Dusk.webp deleted file mode 100644 index 7670f58..0000000 Binary files a/release/img/headers/Tahoe_Dusk.webp and /dev/null differ diff --git a/release/img/headers/Tahoe_Night.webp b/release/img/headers/Tahoe_Night.webp deleted file mode 100644 index d41f2d8..0000000 Binary files a/release/img/headers/Tahoe_Night.webp and /dev/null differ diff --git a/release/index.html b/release/index.html deleted file mode 100644 index 18243bd..0000000 --- a/release/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - New Tab - - - -
-

Google

-
- - - -
-
- -
- - - - - - - - - - - - - - - - - diff --git a/release/lib/angular1.2.2.min.js b/release/lib/angular1.2.2.min.js deleted file mode 100644 index 8712f96..0000000 --- a/release/lib/angular1.2.2.min.js +++ /dev/null @@ -1,200 +0,0 @@ -/* - AngularJS v1.2.2 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(Z,P,s){'use strict';function C(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.2/"+(b?b+"/":"")+a;for(c=1;c").append(b).html();try{return 3===b[0].nodeType?v(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+v(b)})}catch(d){return v(c)}}function Ub(b){try{return decodeURIComponent(b)}catch(a){}} -function Vb(b){var a={},c,d;q((b||"").split("&"),function(b){b&&(c=b.split("="),d=Ub(c[0]),F(d)&&(b=F(c[1])?Ub(c[1]):!0,a[d]?K(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Wb(b){var a=[];q(b,function(b,d){K(b)?q(b,function(b){a.push(ua(d,!0)+(!0===b?"":"="+ua(b,!0)))}):a.push(ua(d,!0)+(!0===b?"":"="+ua(b,!0)))});return a.length?a.join("&"):""}function rb(b){return ua(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ua(b,a){return encodeURIComponent(b).replace(/%40/gi, -"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Sc(b,a){function c(a){a&&d.push(a)}var d=[b],e,h,g=["ng:app","ng-app","x-ng-app","data-ng-app"],f=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;q(g,function(a){g[a]=!0;c(P.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(q(b.querySelectorAll("."+a),c),q(b.querySelectorAll("."+a+"\\:"),c),q(b.querySelectorAll("["+a+"]"),c))});q(d,function(a){if(!e){var b=f.exec(" "+a.className+" ");b?(e=a,h= -(b[2]||"").replace(/\s+/g,",")):q(a.attributes,function(b){!e&&g[b.name]&&(e=a,h=b.value)})}});e&&a(e,h?[h]:[])}function Xb(b,a){var c=function(){b=y(b);if(b.injector()){var c=b[0]===P?"document":ha(b);throw La("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=Yb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/; -if(Z&&!d.test(Z.name))return c();Z.name=Z.name.replace(d,"");ab.resumeBootstrap=function(b){q(b,function(b){a.push(b)});c()}}function bb(b,a){a=a||"_";return b.replace(Tc,function(b,d){return(d?a:"")+b.toLowerCase()})}function sb(b,a,c){if(!b)throw La("areq",a||"?",c||"required");return b}function Na(b,a,c){c&&K(b)&&(b=b[b.length-1]);sb(L(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b));return b}function va(b,a){if("hasOwnProperty"===b)throw La("badname", -a);}function tb(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,h=a.length,g=0;g 
"+b;a.removeChild(a.firstChild);xb(this,a.childNodes);y(P.createDocumentFragment()).append(this)}else xb(this,b)}function yb(b){return b.cloneNode(!0)}function Pa(b){Zb(b);var a=0;for(b=b.childNodes|| -[];a=N?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Da(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=Xa()):c=b;return a+":"+c}function Ra(b){q(b,this.put,this)}function ec(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(Zc,""),c=c.match($c), -q(c[1].split(ad),function(b){b.replace(bd,function(b,c,d){a.push(d)})})),b.$inject=a):K(b)?(c=b.length-1,Na(b[c],"fn"),a=b.slice(0,c)):Na(b,"fn",!0);return a}function Yb(b){function a(a){return function(b,c){if(X(b))q(b,Pb(a));else return a(b,c)}}function c(a,b){va(a,"service");if(L(b)||K(b))b=n.instantiate(b);if(!b.$get)throw Sa("pget",a);return l[a+f]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,f,h;q(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(B(a))for(c=Ta(a),b=b.concat(e(c.requires)).concat(c._runBlocks), -d=c._invokeQueue,f=0,h=d.length;f 4096 bytes)!"));else{if(m.cookie!==S)for(S=m.cookie,d=S.split("; "),$={},f=0;fk&&this.remove(r.key),b},get:function(a){var b=l[a];if(b)return e(b),m[a]},remove:function(a){var b=l[a];b&&(b==n&&(n=b.p),b==r&&(r=b.n),h(b.n,b.p),delete l[a],delete m[a],g--)},removeAll:function(){m={};g=0;l={};n=r=null},destroy:function(){l= -f=m=null;delete a[b]},info:function(){return u({},f,{size:g})}}}var a={};b.info=function(){var b={};q(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function gd(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function gc(b){var a={},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,h=/^\s*(https?|ftp|mailto|tel|file):/,g=/^\s*(https?|ftp|file):|data:image\//,f=/^(on[a-z]+|formaction)$/;this.directive=function k(d, -e){va(d,"directive");B(d)?(sb(e,"directiveFactory"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];q(a[d],function(a,f){try{var h=b.invoke(a);L(h)?h={compile:da(h)}:!h.compile&&h.link&&(h.compile=da(h.link));h.priority=h.priority||0;h.index=f;h.name=h.name||d;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"A";e.push(h)}catch(g){c(g)}});return e}])),a[d].push(e)):q(d,Pb(k));return this};this.aHrefSanitizationWhitelist=function(a){return F(a)? -(h=a,this):h};this.imgSrcSanitizationWhitelist=function(a){return F(a)?(g=a,this):g};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate",function(b,l,n,r,p,A,J,U,w,D,E){function t(a,b,c,d,e){a instanceof y||(a=y(a));q(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=y(b).wrap("").parent()[0])});var f=R(a,b,a,c,d,e);return function(b,c,d){sb(b,"scope");var e=c?Ea.clone.call(a): -a;q(d,function(a,b){e.data("$"+b+"Controller",a)});d=0;for(var h=e.length;darguments.length&&(b=a,a=s);ia&&(c=S);return k(a,b,c)}var t,ea,U,E,ca,I,S={},Q;t=b===e?c:Qc(c,new Db(y(e),c.$attr));ea=t.$$element;if(R){var V=/^\s*([@=&])(\??)\s*(\w*)\s*$/;f=y(e);I=d.$new(!0);$&&$===R.$$originalDirective?f.data("$isolateScope",I):f.data("$isolateScopeNoTemplate",I);H(f,"ng-isolate-scope");q(R.scope,function(a,b){var c=a.match(V)|| -[],e=c[3]||b,f="?"==c[2],c=c[1],h,g,k;I.$$isolateBindings[b]=c+e;switch(c){case "@":t.$observe(e,function(a){I[b]=a});t.$$observers[e].$$scope=d;t[e]&&(I[b]=l(t[e])(d));break;case "=":if(f&&!t[e])break;g=A(t[e]);k=g.assign||function(){h=I[b]=g(d);throw ja("nonassign",t[e],R.name);};h=I[b]=g(d);I.$watch(function(){var a=g(d);a!==I[b]&&(a!==h?h=I[b]=a:k(d,a=h=I[b]));return a});break;case "&":g=A(t[e]);I[b]=function(a){return g(d,a)};break;default:throw ja("iscp",R.name,b,a);}})}Q=k&&p;w&&q(w,function(a){var b= -{$scope:a===R||a.$$isolateScope?I:d,$element:ea,$attrs:t,$transclude:Q},c;ca=a.controller;"@"==ca&&(ca=t[a.name]);c=J(ca,b);S[a.name]=c;ia||ea.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});f=0;for(U=h.length;fG.priority)break;if(O=G.scope)E=E||G,G.templateUrl||(z("new/isolated scope",R,G,Y),X(O)&&(R=G));x=G.name;!G.templateUrl&&G.controller&&(O=G.controller,w=w||{},z("'"+x+"' controller",w[x],G,Y), -w[x]=G);if(O=G.transclude)wa=!0,G.$$tlb||(z("transclusion",k,G,Y),k=G),"element"==O?(ia=!0,U=G.priority,O=ca(b,N,fb),Y=c.$$element=y(P.createComment(" "+x+": "+c[x]+" ")),b=Y[0],T(e,y(ta.call(O,0)),b),v=t(O,d,U,f&&f.name,{nonTlbTranscludeDirective:k})):(O=y(yb(b)).contents(),Y.html(""),v=t(O,d));if(G.template)if(z("template",$,G,Y),$=G,O=L(G.template)?G.template(Y,c):G.template,O=hc(O),G.replace){f=G;O=y("
"+ba(O)+"
").contents();b=O[0];if(1!=O.length||1!==b.nodeType)throw ja("tplrt",x,""); -T(e,Y,b);M={$attr:{}};O=S(b,[],M);var Eb=a.splice(C+1,a.length-(C+1));R&&V(O);a=a.concat(O).concat(Eb);fc(c,M);M=a.length}else Y.html(O);if(G.templateUrl)z("template",$,G,Y),$=G,G.replace&&(f=G),D=F(a.splice(C,a.length-C),Y,c,e,v,h,g,{controllerDirectives:w,newIsolateScopeDirective:R,templateDirective:$,nonTlbTranscludeDirective:k}),M=a.length;else if(G.compile)try{u=G.compile(Y,c,v),L(u)?p(null,u,N,fb):u&&p(u.pre,u.post,N,fb)}catch(Z){n(Z,ha(Y))}G.terminal&&(D.terminal=!0,U=Math.max(U,G.priority))}D.scope= -E&&!0===E.scope;D.transclude=wa&&v;return D}function V(a){for(var b=0,c=a.length;br.priority)&&-1!=r.restrict.indexOf(f)&&(l&&(r=Rb(r,{$$start:l,$$end:p})),d.push(r),g=r)}catch(J){n(J)}}return g}function fc(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e? -";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,f){"class"==f?(H(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function F(a,b,c,d,e,f,h,g){var k=[],l,n,A=b[0],t=a.shift(),J=u({},t,{templateUrl:null,transclude:null,replace:null,$$originalDirective:t}),H=L(t.templateUrl)?t.templateUrl(b,c):t.templateUrl;b.html("");r.get(D.getTrustedResourceUrl(H), -{cache:p}).success(function(p){var r,D;p=hc(p);if(t.replace){p=y("
"+ba(p)+"
").contents();r=p[0];if(1!=p.length||1!==r.nodeType)throw ja("tplrt",t.name,H);p={$attr:{}};T(d,b,r);var E=S(r,[],p);X(t.scope)&&V(E);a=E.concat(a);fc(c,p)}else r=A,b.html(p);a.unshift(J);l=wa(a,r,c,e,b,t,f,h,g);q(d,function(a,c){a==r&&(d[c]=b[0])});for(n=R(b[0].childNodes,e);k.length;){p=k.shift();D=k.shift();var U=k.shift(),ca=k.shift(),E=b[0];D!==A&&(E=yb(r),T(U,y(D),E));D=l.transclude?$(p,l.transclude):ca;l(n, -p,E,d,D)}k=null}).error(function(a,b,c,d){throw ja("tpload",d.url);});return function(a,b,c,d,e){k?(k.push(b),k.push(c),k.push(d),k.push(e)):l(n,b,c,d,e)}}function x(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.namea.status? -b:n.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f=function(a){function b(a){var c;q(a,function(b,d){L(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=u({},a.headers),f,h,c=u({},c.common,c[v(a.method)]);b(c);b(d);a:for(f in c){a=v(f);for(h in d)if(v(h)===a)continue a;d[f]=c[f]}return d}(a);u(d,a);d.headers=f;d.method=Ga(d.method);(a=Fb(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var h= -[function(a){f=a.headers;var b=lc(a.data,kc(f),a.transformRequest);z(a.data)&&q(f,function(a,b){"content-type"===v(b)&&delete f[b]});z(a.withCredentials)&&!z(e.withCredentials)&&(a.withCredentials=e.withCredentials);return A(a,b,f).then(c,c)},s],g=n.when(d);for(q(w,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&h.push(a.response,a.responseError)});h.length;){a=h.shift();var k=h.shift(),g=g.then(a,k)}g.success=function(a){g.then(function(b){a(b.data, -b.status,b.headers,d)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,d)});return g};return g}function A(b,c,h){function g(a,b,c){q&&(200<=a&&300>a?q.put(s,[a,b,jc(c)]):q.remove(s));k(b,a,c);d.$$phase||d.$apply()}function k(a,c,d){c=Math.max(c,0);(200<=c&&300>c?r.resolve:r.reject)({data:a,status:c,headers:kc(d),config:b})}function m(){var a=$a(p.pendingRequests,b);-1!==a&&p.pendingRequests.splice(a,1)}var r=n.defer(),A=r.promise,q,w,s=J(b.url,b.params);p.pendingRequests.push(b); -A.then(m,m);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(q=X(b.cache)?b.cache:X(e.cache)?e.cache:U);if(q)if(w=q.get(s),F(w)){if(w.then)return w.then(m,m),w;K(w)?k(w[1],w[0],ga(w[2])):k(w,200,{})}else q.put(s,A);z(w)&&a(b.method,s,c,g,h,b.timeout,b.withCredentials,b.responseType);return A}function J(a,b){if(!b)return a;var c=[];Nc(b,function(a,b){null===a||z(a)||(K(a)||(a=[a]),q(a,function(a){X(a)&&(a=oa(a));c.push(ua(b)+"="+ua(a))}))});return a+(-1==a.indexOf("?")?"?":"&")+c.join("&")}var U= -c("$http"),w=[];q(h,function(a){w.unshift(B(a)?r.get(a):r.invoke(a))});q(g,function(a,b){var c=B(a)?r.get(a):r.invoke(a);w.splice(b,0,{response:function(a){return c(n.when(a))},responseError:function(a){return c(n.reject(a))}})});p.pendingRequests=[];(function(a){q(arguments,function(a){p[a]=function(b,c){return p(u(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){p[a]=function(b,c,d){return p(u(d||{},{method:a,url:b,data:c}))}})})("post","put");p.defaults= -e;return p}]}function nd(){this.$get=["$browser","$window","$document",function(b,a,c){return od(b,pd,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]}function od(b,a,c,d,e,h){function g(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange=c.onload=c.onerror=null;e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;N&&8>=N?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()};e.body.appendChild(c); -return d}var f=-1;return function(e,k,l,n,r,p,A,J){function U(){D=f;t&&t();H&&H.abort()}function w(a,d,e,f){var g=h||xa(k).protocol;s&&c.cancel(s);t=H=null;d="file"==g?e?200:404:d;a(1223==d?204:d,e,f);b.$$completeOutstandingRequest(x)}var D;b.$$incOutstandingRequestCount();k=k||b.url();if("jsonp"==v(e)){var E="_"+(d.counter++).toString(36);d[E]=function(a){d[E].data=a};var t=g(k.replace("JSON_CALLBACK","angular.callbacks."+E),function(){d[E].data?w(n,200,d[E].data):w(n,D||-2);delete d[E]})}else{var H= -new a;H.open(e,k,!0);q(r,function(a,b){F(a)&&H.setRequestHeader(b,a)});H.onreadystatechange=function(){if(4==H.readyState){var a=null,b=null;D!==f&&(a=H.getAllResponseHeaders(),b=H.responseType?H.response:H.responseText);w(n,D||H.status,b,a)}};A&&(H.withCredentials=!0);J&&(H.responseType=J);H.send(l||null)}if(0=f&&(n.resolve(p), -l(r.$$intervalId),delete e[r.$$intervalId]);A||b.$apply()},g);e[r.$$intervalId]=n;return r}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],!0):!1};return d}]}function sd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4", -posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y", -mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function nc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=rb(b[a]);return b.join("/")}function oc(b,a,c){b=xa(b,c);a.$$protocol=b.protocol;a.$$host=b.hostname;a.$$port=T(b.port)||td[b.protocol]||null}function pc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=xa(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search= -Vb(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function na(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ua(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Gb(b){return b.substr(0,Ua(b).lastIndexOf("/")+1)}function qc(b,a){this.$$html5=!0;a=a||"";var c=Gb(b);oc(b,this,b);this.$$parse=function(a){var e=na(c,a);if(!B(e))throw Hb("ipthprfx",a,c);pc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose= -function(){var a=Wb(this.$$search),b=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=nc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=na(b,d))!==s)return d=e,(e=na(a,e))!==s?c+(na("/",e)||e):b+d;if((e=na(c,d))!==s)return c+e;if(c==d+"/")return c}}function Ib(b,a){var c=Gb(b);oc(b,this,b);this.$$parse=function(d){var e=na(b,d)||na(c,d),e="#"==e.charAt(0)?na(a,e):this.$$html5?e:"";if(!B(e))throw Hb("ihshprfx",d,a);pc(e,this,b);this.$$compose()}; -this.$$compose=function(){var c=Wb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=nc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Ua(b)==Ua(a))return a}}function rc(b,a){this.$$html5=!0;Ib.apply(this,arguments);var c=Gb(b);this.$$rewrite=function(d){var e;if(b==Ua(d))return d;if(e=na(c,d))return b+a+e;if(c===d+"/")return c}}function gb(b){return function(){return this[b]}}function sc(b,a){return function(c){if(z(c))return this[b]; -this[b]=a(c);this.$$compose();return this}}function ud(){var b="",a=!1;this.hashPrefix=function(a){return F(a)?(b=a,this):b};this.html5Mode=function(b){return F(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,h){function g(a){c.$broadcast("$locationChangeSuccess",f.absUrl(),a)}var f,m=d.baseHref(),k=d.url();a?(m=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(m||"/"),e=e.history?qc:rc):(m=Ua(k),e=Ib);f=new e(m,"#"+b);f.$$parse(f.$$rewrite(k));h.on("click", -function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=y(a.target);"a"!==v(b[0].nodeName);)if(b[0]===h[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=f.$$rewrite(e);e&&(!b.attr("target")&&g&&!a.isDefaultPrevented())&&(a.preventDefault(),g!=d.url()&&(f.$$parse(g),c.$apply(),Z.angular["ff-684208-preventDefault"]=!0))}});f.absUrl()!=k&&d.url(f.absUrl(),!0);d.onUrlChange(function(a){f.absUrl()!=a&&(c.$broadcast("$locationChangeStart",a,f.absUrl()).defaultPrevented?d.url(f.absUrl()):(c.$evalAsync(function(){var b= -f.absUrl();f.$$parse(a);g(b)}),c.$$phase||c.$digest()))});var l=0;c.$watch(function(){var a=d.url(),b=f.$$replace;l&&a==f.absUrl()||(l++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),g(a))}));f.$$replace=!1;return l});return f}]}function vd(){var b=!0,a=this;this.debugEnabled=function(a){return F(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)? -"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||x;return e.apply?function(){var a=[];q(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function pa(b,a){if("constructor"===b)throw ya("isecfld",a);return b} -function Va(b,a){if(b&&b.constructor===b)throw ya("isecfn",a);if(b&&b.document&&b.location&&b.alert&&b.setInterval)throw ya("isecwindow",a);if(b&&(b.nodeName||b.on&&b.find))throw ya("isecdom",a);return b}function hb(b,a,c,d,e){e=e||{};a=a.split(".");for(var h,g=0;1e?tc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,f){var h=0,g;do g=tc(d[h++],d[h++],d[h++],d[h++],d[h++],c,a)(b,f),f=s,b=g;while(ha)for(b in g++,d)d.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(m--,delete d[b])}else d!==f&&(d=f,g++);return g},function(){b(f,d,c)})},$digest:function(){var c,e,g,h,m=this.$$asyncQueue,q=this.$$postDigestQueue,s,D,E=b,t,H=[],y,x,S;f("$digest");do{D=!1;for(t=this;m.length;)try{S=m.shift(),S.scope.$eval(S.expression)}catch(F){d(F)}do{if(h=t.$$watchers)for(s=h.length;s--;)try{(c= -h[s])&&((e=c.get(t))!==(g=c.last)&&!(c.eq?Ba(e,g):"number"==typeof e&&"number"==typeof g&&isNaN(e)&&isNaN(g)))&&(D=!0,c.last=c.eq?ga(e):e,c.fn(e,g===k?e:g,t),5>E&&(y=4-E,H[y]||(H[y]=[]),x=L(c.exp)?"fn: "+(c.exp.name||c.exp.toString()):c.exp,x+="; newVal: "+oa(e)+"; oldVal: "+oa(g),H[y].push(x)))}catch(Q){d(Q)}if(!(h=t.$$childHead||t!==this&&t.$$nextSibling))for(;t!==this&&!(h=t.$$nextSibling);)t=t.$parent}while(t=h);if(D&&!E--)throw l.$$phase=null,a("infdig",b,oa(H));}while(D||m.length);for(l.$$phase= -null;q.length;)try{q.shift()()}catch(z){d(z)}},$destroy:function(){if(l!=this&&!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail= -null}},$eval:function(a,b){return e(a)(this,b)},$evalAsync:function(a){l.$$phase||l.$$asyncQueue.length||h.defer(function(){l.$$asyncQueue.length&&l.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return f("$apply"),this.$eval(a)}catch(b){d(b)}finally{l.$$phase=null;try{l.$digest()}catch(c){throw d(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[$a(c, -b)]=null}},$emit:function(a,b){var c=[],e,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(ta.call(arguments,1)),l,m;do{e=f.$$listeners[a]||c;h.currentScope=f;l=0;for(m=e.length;lc.msieDocumentMode)throw ra("iequirks");var e=ga(fa);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Aa);e.parseAs= -function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var h=e.parseAs,g=e.getTrusted,f=e.trustAs;q(fa,function(a,b){var c=v(b);e[Oa("parse_as_"+c)]=function(b){return h(a,b)};e[Oa("get_trusted_"+c)]=function(b){return g(a,b)};e[Oa("trust_as_"+c)]=function(b){return f(a,b)}});return e}]}function Dd(){this.$get=["$window","$document",function(b,a){var c={},d=T((/android (\d+)/.exec(v((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator|| -{}).userAgent),h=a[0]||{},g=h.documentMode,f,m=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=h.body&&h.body.style,l=!1,n=!1;if(k){for(var r in k)if(l=m.exec(r)){f=l[0];f=f.substr(0,1).toUpperCase()+f.substr(1);break}f||(f="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||f+"Transition"in k);n=!!("animation"in k||f+"Animation"in k);!d||l&&n||(l=B(h.body.style.webkitTransition),n=B(h.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||7< -g),hasEvent:function(a){if("input"==a&&9==N)return!1;if(z(c[a])){var b=h.createElement("div");c[a]="on"+a in b}return c[a]},csp:Sb(),vendorPrefix:f,transitions:l,animations:n,msie:N,msieDocumentMode:g}}]}function Ed(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,f,m){var k=c.defer(),l=k.promise,n=F(m)&&!m;f=a.defer(function(){try{k.resolve(e())}catch(a){k.reject(a),d(a)}finally{delete h[l.$$timeoutId]}n||b.$apply()},f);l.$$timeoutId=f;h[f]=k;return l} -var h={};e.cancel=function(b){return b&&b.$$timeoutId in h?(h[b.$$timeoutId].reject("canceled"),delete h[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return e}]}function xa(b,a){var c=b;N&&(aa.setAttribute("href",c),c=aa.href);aa.setAttribute("href",c);var c=aa.pathname,d=b;0===d.indexOf(a)&&(d=d.replace(a,""));xc.exec(d)||(c=(d=xc.exec(c))?d[1]:c);c="/"===c.charAt(0)?c:"/"+c;return{href:aa.href,protocol:aa.protocol?aa.protocol.replace(/:$/,""):"",host:aa.host,search:aa.search?aa.search.replace(/^\?/, -""):"",hash:aa.hash?aa.hash.replace(/^#/,""):"",hostname:aa.hostname,port:aa.port,pathname:c}}function Fb(b){b=B(b)?xa(b):b;return b.protocol===yc.protocol&&b.host===yc.host}function Fd(){this.$get=da(Z)}function zc(b){function a(d,e){if(X(d)){var h={};q(d,function(b,c){h[c]=a(c,b)});return h}return b.factory(d+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Ac);a("date",Bc);a("filter",Gd);a("json",Hd);a("limitTo",Id);a("lowercase", -Jd);a("number",Cc);a("orderBy",Dc);a("uppercase",Kd)}function Gd(){return function(b,a,c){if(!K(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;bb;b=Math.abs(b);var g=b+"",f="",m=[],k=!1;if(-1!==g.indexOf("e")){var l= -g.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?g="0":(f=g,k=!0)}if(k)0b)&&(f=b.toFixed(e));else{g=(g.split(Fc)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));g=Math.pow(10,e);b=Math.round(b*g)/g;b=(""+b).split(Fc);g=b[0];b=b[1]||"";var l=0,n=a.lgSize,r=a.gSize;if(g.length>=n+r)for(l=g.length-n,k=0;kb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Lb(e,a,d)}}function ib(b,a){return function(c,d){var e=c["get"+b](),h=Ga(a?"SHORT"+b:b);return d[h][e]}}function Bc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var h= -0,g=0,f=b[8]?a.setUTCFullYear:a.setFullYear,m=b[8]?a.setUTCHours:a.setHours;b[9]&&(h=T(b[9]+b[10]),g=T(b[9]+b[11]));f.call(a,T(b[1]),T(b[2])-1,T(b[3]));h=T(b[4]||0)-h;g=T(b[5]||0)-g;f=T(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));m.call(a,h,g,f,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var h="",g=[],f,m;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;B(c)&&(c=Ld.test(c)?T(c):a(c));pb(c)&&(c= -new Date(c));if(!Ja(c))return c;for(;e;)(m=Md.exec(e))?(g=g.concat(ta.call(m,1)),e=g.pop()):(g.push(e),e=null);q(g,function(a){f=Nd[a];h+=f?f(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return h}}function Hd(){return function(b){return oa(b,!0)}}function Id(){return function(b,a){if(!K(b)&&!B(b))return b;a=T(a);if(B(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0a||37<=a&&40>=a)||k()});a.on("change",f);if(e.hasEvent("paste"))a.on("paste cut",k)}d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var l=c.ngPattern,n=function(a,b){if(d.$isEmpty(b)||a.test(b))return d.$setValidity("pattern",!0),b;d.$setValidity("pattern",!1);return s};l&&((e=l.match(/^\/(.*)\/([gim]*)$/))?(l=RegExp(e[1],e[2]),e=function(a){return n(l,a)}):e=function(c){var d=b.$eval(l);if(!d||!d.test)throw C("ngPattern")("noregexp", -l,d,ha(a));return n(d,c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var r=T(c.ngMinlength);e=function(a){if(!d.$isEmpty(a)&&a.lengthp)return d.$setValidity("maxlength",!1),s;d.$setValidity("maxlength",!0);return a};d.$parsers.push(e);d.$formatters.push(e)}}function Mb(b,a){b= -"ngClass"+b;return function(){return{restrict:"AC",link:function(c,d,e){function h(b){if(!0===a||c.$index%2===a){var d=g(b||"");f?Ba(b,f)||e.$updateClass(d,g(f)):e.$addClass(d)}f=ga(b)}function g(a){if(K(a))return a.join(" ");if(X(a)){var b=[];q(a,function(a,c){a&&b.push(c)});return b.join(" ")}return a}var f;c.$watch(e[b],h,!0);e.$observe("class",function(a){h(c.$eval(e[b]))});"ngClass"!==b&&c.$watch("$index",function(d,f){var h=d&1;if(h!==f&1){var n=g(c.$eval(e[b]));h===a?e.$addClass(n):e.$removeClass(n)}})}}}} -var v=function(b){return B(b)?b.toLowerCase():b},Ga=function(b){return B(b)?b.toUpperCase():b},N,y,Ca,ta=[].slice,Od=[].push,Ya=Object.prototype.toString,La=C("ng"),ab=Z.angular||(Z.angular={}),Ta,Fa,ka=["0","0","0"];N=T((/msie (\d+)/.exec(v(navigator.userAgent))||[])[1]);isNaN(N)&&(N=T((/trident\/.*; rv:(\d+)/.exec(v(navigator.userAgent))||[])[1]));x.$inject=[];Aa.$inject=[];var ba=function(){return String.prototype.trim?function(b){return B(b)?b.trim():b}:function(b){return B(b)?b.replace(/^\s*/, -"").replace(/\s*$/,""):b}}();Fa=9>N?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ga(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Tc=/[A-Z]/g,Pd={full:"1.2.2",major:1,minor:2,dot:2,codeName:"consciousness-inertia"},Qa=M.cache={},cb=M.expando="ng-"+(new Date).getTime(),Xc=1,Hc=Z.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},zb=Z.document.removeEventListener? -function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},Vc=/([\:\-\_]+(.))/g,Wc=/^moz([A-Z])/,wb=C("jqLite"),Ea=M.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===P.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),M(Z).on("load",a))},toString:function(){var b=[];q(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?y(this[b]):y(this[this.length+b])},length:0,push:Od,sort:[].sort,splice:[].splice}, -eb={};q("multiple selected checked disabled readOnly required open".split(" "),function(b){eb[v(b)]=b});var dc={};q("input select option textarea button form details".split(" "),function(b){dc[Ga(b)]=!0});q({data:ac,inheritedData:db,scope:function(b){return y(b).data("$scope")||db(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return y(b).data("$isolateScope")||y(b).data("$isolateScopeNoTemplate")},controller:bc,injector:function(b){return db(b,"$injector")},removeAttr:function(b, -a){b.removeAttribute(a)},hasClass:Ab,css:function(b,a,c){a=Oa(a);if(F(c))b.style[a]=c;else{var d;8>=N&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=N&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=v(a);if(eb[d])if(F(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||x).specified?d:s;else if(F(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b, -a,c){if(F(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(z(d))return e?b[e]:"";b[e]=d}var a=[];9>N?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(z(a)){if("SELECT"===Fa(b)&&b.multiple){var c=[];q(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Td={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Kb=function(a){this.options=a};Kb.prototype={constructor:Kb,lex:function(a){this.text=a; -this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"=== -a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=F(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ya("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+", -"-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(Wa.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=uc(d,this.options,this.text);return u(function(c,d,f){return e(f|| -a(c,d),d)},{assign:function(e,g,f){return hb(a(e,f),d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return u(function(e,h){var g=a(e,h),f=d(e,h),m;if(!g)return s;(g=Va(g[f],c.text))&&(g.then&&c.options.unwrapPromises)&&(m=g,"$$v"in g||(m.$$v=s,m.then(function(a){m.$$v=a})),g=g.$$v);return g},{assign:function(e,h,g){var f=d(e,g);return Va(a(e,g),c.text)[f]=h}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression()); -while(this.expect(","))}this.consume(")");var e=this;return function(h,g){for(var f=[],m=c?c(h,g):h,k=0;ka.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Lb(Math[0=N&&(c.href||c.name||c.$set("href",""),a.append(P.createComment("IE fix")));return function(a,c){c.on("click",function(a){c.attr("href")|| -a.preventDefault()})}}}),Nb={};q(eb,function(a,c){if("multiple"!=a){var d=ma("ng-"+c);Nb[d]=function(){return{priority:100,compile:function(){return function(a,h,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}}});q(["src","srcset","href"],function(a){var c=ma("ng-"+a);Nb[c]=function(){return{priority:99,link:function(d,e,h){h.$observe(c,function(c){c&&(h.$set(a,c),N&&e.prop(a,h[a]))})}}}});var lb={$addControl:x,$removeControl:x,$setValidity:x,$setDirty:x,$setPristine:x};Gc.$inject=["$element","$attrs", -"$scope"];var Ic=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Gc,compile:function(){return{pre:function(a,e,h,g){if(!h.action){var f=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Hc(e[0],"submit",f);e.on("$destroy",function(){c(function(){zb(e[0],"submit",f)},0,!1)})}var m=e.parent().controller("form"),k=h.name||h.ngForm;k&&hb(a,k,g,k);if(m)e.on("$destroy",function(){m.$removeControl(g);k&&hb(a,k,s,k);u(g,lb)})}}}}}]},Vd=Ic(),Wd= -Ic(!0),Xd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Yd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/,Zd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Jc={text:nb,number:function(a,c,d,e,h,g){nb(a,c,d,e,h,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Zd.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c= -parseFloat(d.min);if(!e.$isEmpty(a)&&ac)return e.$setValidity("max",!1),s;e.$setValidity("max",!0);return a},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){if(e.$isEmpty(a)||pb(a))return e.$setValidity("number",!0),a;e.$setValidity("number",!1);return s})},url:function(a,c,d,e,h,g){nb(a,c,d,e, -h,g);a=function(a){if(e.$isEmpty(a)||Xd.test(a))return e.$setValidity("url",!0),a;e.$setValidity("url",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,h,g){nb(a,c,d,e,h,g);a=function(a){if(e.$isEmpty(a)||Yd.test(a))return e.$setValidity("email",!0),a;e.$setValidity("email",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){z(d.name)&&c.attr("name",Xa());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})}); -e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var h=d.ngTrueValue,g=d.ngFalseValue;B(h)||(h=!0);B(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==h};e.$formatters.push(function(a){return a===h});e.$parsers.push(function(a){return a?h:g})},hidden:x,button:x,submit:x,reset:x},Kc=["$browser","$sniffer",function(a, -c){return{restrict:"E",require:"?ngModel",link:function(d,e,h,g){g&&(Jc[v(h.type)]||Jc.text)(d,e,h,g,c,a)}}}],kb="ng-valid",jb="ng-invalid",Ha="ng-pristine",mb="ng-dirty",$d=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,h){function g(a,c){c=c?"-"+bb(c,"-"):"";e.removeClass((a?jb:kb)+c).addClass((a?kb:jb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid= -!1;this.$name=d.name;var f=h(d.ngModel),m=f.assign;if(!m)throw C("ngModel")("nonassign",d.ngModel,ha(e));this.$render=x;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var k=e.inheritedData("$formController")||lb,l=0,n=this.$error={};e.addClass(Ha);g(!0);this.$setValidity=function(a,c){n[a]!==!c&&(c?(n[a]&&l--,l||(g(!0),this.$valid=!0,this.$invalid=!1)):(g(!1),this.$invalid=!0,this.$valid=!1,l++),n[a]=!c,g(c,a),k.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1; -this.$pristine=!0;e.removeClass(mb).addClass(Ha)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,e.removeClass(Ha).addClass(mb),k.$setDirty());q(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,m(a,d),q(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var r=this;a.$watch(function(){var c=f(a);if(r.$modelValue!==c){var d=r.$formatters,e=d.length;for(r.$modelValue=c;e--;)c=d[e](c);r.$viewValue!==c&&(r.$viewValue= -c,r.$render())}})}],ae=function(){return{require:["ngModel","^?form"],controller:$d,link:function(a,c,d,e){var h=e[0],g=e[1]||lb;g.$addControl(h);a.$on("$destroy",function(){g.$removeControl(h)})}}},be=da({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Lc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var h=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required", -!0),a};e.$formatters.push(h);e.$parsers.unshift(h);d.$observe("required",function(){h(e.$viewValue)})}}}},ce=function(){return{require:"ngModel",link:function(a,c,d,e){var h=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!z(a)){var c=[];a&&q(a.split(h),function(a){a&&c.push(ba(a))});return c}});e.$formatters.push(function(a){return K(a)?a.join(", "):s});e.$isEmpty=function(a){return!a||!a.length}}}},de=/^(true|false|\d+)$/,ee=function(){return{priority:100, -compile:function(a,c){return de.test(c.ngValue)?function(a,c,h){h.$set("value",a.$eval(h.ngValue))}:function(a,c,h){a.$watch(h.ngValue,function(a){h.$set("value",a)})}}}},fe=sa(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),ge=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],he=["$sce","$parse", -function(a,c){return function(d,e,h){e.addClass("ng-binding").data("$binding",h.ngBindHtml);var g=c(h.ngBindHtml);d.$watch(function(){return(g(d)||"").toString()},function(c){e.html(a.getTrustedHtml(g(d))||"")})}}],ie=Mb("",!0),je=Mb("Odd",0),ke=Mb("Even",1),le=sa({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),me=[function(){return{scope:!0,controller:"@",priority:500}}],Mc={};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "), -function(a){var c=ma("ng-"+a);Mc[c]=["$parse",function(d){return{compile:function(e,h){var g=d(h[c]);return function(c,d,e){d.on(v(a),function(a){c.$apply(function(){g(c,{$event:a})})})}}}}]});var ne=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,h,g){var f,m;c.$watch(e.ngIf,function(h){Ma(h)?m||(m=c.$new(),g(m,function(c){f={startNode:c[0],endNode:c[c.length++]=P.createComment(" end ngIf: "+e.ngIf+" ")};a.enter(c,d.parent(), -d)})):(m&&(m.$destroy(),m=null),f&&(a.leave(ub(f)),f=null))})}}}],oe=["$http","$templateCache","$anchorScroll","$compile","$animate","$sce",function(a,c,d,e,h,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",compile:function(f,m){var k=m.ngInclude||m.src,l=m.onload||"",n=m.autoscroll;return function(f,m,q,s,y){var w=0,D,E,t=function(){D&&(D.$destroy(),D=null);E&&(h.leave(E),E=null)};f.$watch(g.parseAsResourceUrl(k),function(g){var k=function(){!F(n)||n&&!f.$eval(n)||d()},q=++w; -g?(a.get(g,{cache:c}).success(function(a){if(q===w){var c=f.$new(),d=y(c,x);t();D=c;E=d;E.html(a);h.enter(E,null,m,k);e(E.contents())(D);D.$emit("$includeContentLoaded");f.$eval(l)}}).error(function(){q===w&&t()}),f.$emit("$includeContentRequested")):t()})}}}}],pe=sa({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),qe=sa({terminal:!0,priority:1E3}),re=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,h,g){var f=g.count,m=g.$attr.when&&h.attr(g.$attr.when), -k=g.offset||0,l=e.$eval(m)||{},n={},r=c.startSymbol(),p=c.endSymbol(),s=/^when(Minus)?(.+)$/;q(g,function(a,c){s.test(c)&&(l[v(c.replace("when","").replace("Minus","-"))]=h.attr(g.$attr[c]))});q(l,function(a,e){n[e]=c(a.replace(d,r+f+"-"+k+p))});e.$watch(function(){var c=parseFloat(e.$eval(f));if(isNaN(c))return"";c in l||(c=a.pluralCat(c-k));return n[c](e,h,!0)},function(a){h.text(a)})}}}],se=["$parse","$animate",function(a,c){var d=C("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0, -$$tlb:!0,link:function(e,h,g,f,m){var k=g.ngRepeat,l=k.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),n,r,p,s,x,F,w={$id:Da};if(!l)throw d("iexp",k);g=l[1];f=l[2];(l=l[4])?(n=a(l),r=function(a,c,d){F&&(w[F]=a);w[x]=c;w.$index=d;return n(e,w)}):(p=function(a,c){return Da(c)},s=function(a){return a});l=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp",g);x=l[3]||l[1];F=l[2];var D={};e.$watchCollection(f,function(a){var f,g,l=h[0],n,S={},w,Q,z,V,B,u,v=[];if(ob(a))B= -a,n=r||p;else{n=r||s;B=[];for(z in a)a.hasOwnProperty(z)&&"$"!=z.charAt(0)&&B.push(z);B.sort()}w=B.length;g=v.length=B.length;for(f=0;fI;)w.pop().element.remove()}for(;y.length>v;)y.pop()[0].element.remove()}var k;if(!(k=u.match(d)))throw Be("iexp",u,ha(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],p=c(k[3]||""),q=c(k[2]?k[1]:m),r=c(k[7]),t=k[8]?c(k[8]):null, -y=[[{element:f,label:""}]];x&&(a(x)(e),x.removeClass("ng-scope"),x.remove());f.html("");f.on("change",function(){e.$apply(function(){var a,c=r(e)||[],d={},g,k,l,p,u,w,v;if(A)for(k=[],p=0,w=y.length;p@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-start{border-spacing:1px 1px;-ms-zoom:1.0001;}.ng-animate-active{border-spacing:0px 0px;-ms-zoom:1;}'); -//@# sourceMappingURL=angular.min.js.map diff --git a/release/lib/moment-v2.1.0.min.js b/release/lib/moment-v2.1.0.min.js deleted file mode 100644 index 62b1697..0000000 --- a/release/lib/moment-v2.1.0.min.js +++ /dev/null @@ -1,6 +0,0 @@ -// moment.js -// version : 2.1.0 -// author : Tim Wood -// license : MIT -// momentjs.com -!function(t){function e(t,e){return function(n){return u(t.call(this,n),e)}}function n(t,e){return function(n){return this.lang().ordinal(t.call(this,n),e)}}function s(){}function i(t){a(this,t)}function r(t){var e=t.years||t.year||t.y||0,n=t.months||t.month||t.M||0,s=t.weeks||t.week||t.w||0,i=t.days||t.day||t.d||0,r=t.hours||t.hour||t.h||0,a=t.minutes||t.minute||t.m||0,o=t.seconds||t.second||t.s||0,u=t.milliseconds||t.millisecond||t.ms||0;this._input=t,this._milliseconds=u+1e3*o+6e4*a+36e5*r,this._days=i+7*s,this._months=n+12*e,this._data={},this._bubble()}function a(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function o(t){return 0>t?Math.ceil(t):Math.floor(t)}function u(t,e){for(var n=t+"";n.lengthn;n++)~~t[n]!==~~e[n]&&r++;return r+i}function f(t){return t?ie[t]||t.toLowerCase().replace(/(.)s$/,"$1"):t}function l(t,e){return e.abbr=t,x[t]||(x[t]=new s),x[t].set(e),x[t]}function _(t){if(!t)return H.fn._lang;if(!x[t]&&A)try{require("./lang/"+t)}catch(e){return H.fn._lang}return x[t]}function m(t){return t.match(/\[.*\]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function y(t){var e,n,s=t.match(E);for(e=0,n=s.length;n>e;e++)s[e]=ue[s[e]]?ue[s[e]]:m(s[e]);return function(i){var r="";for(e=0;n>e;e++)r+=s[e]instanceof Function?s[e].call(i,t):s[e];return r}}function M(t,e){function n(e){return t.lang().longDateFormat(e)||e}for(var s=5;s--&&N.test(e);)e=e.replace(N,n);return re[e]||(re[e]=y(e)),re[e](t)}function g(t,e){switch(t){case"DDDD":return V;case"YYYY":return X;case"YYYYY":return $;case"S":case"SS":case"SSS":case"DDD":return I;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return R;case"a":case"A":return _(e._l)._meridiemParse;case"X":return B;case"Z":case"ZZ":return j;case"T":return q;case"MM":case"DD":case"YY":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":return J;default:return new RegExp(t.replace("\\",""))}}function p(t){var e=(j.exec(t)||[])[0],n=(e+"").match(ee)||["-",0,0],s=+(60*n[1])+~~n[2];return"+"===n[0]?-s:s}function D(t,e,n){var s,i=n._a;switch(t){case"M":case"MM":i[1]=null==e?0:~~e-1;break;case"MMM":case"MMMM":s=_(n._l).monthsParse(e),null!=s?i[1]=s:n._isValid=!1;break;case"D":case"DD":case"DDD":case"DDDD":null!=e&&(i[2]=~~e);break;case"YY":i[0]=~~e+(~~e>68?1900:2e3);break;case"YYYY":case"YYYYY":i[0]=~~e;break;case"a":case"A":n._isPm=_(n._l).isPM(e);break;case"H":case"HH":case"h":case"hh":i[3]=~~e;break;case"m":case"mm":i[4]=~~e;break;case"s":case"ss":i[5]=~~e;break;case"S":case"SS":case"SSS":i[6]=~~(1e3*("0."+e));break;case"X":n._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":n._useUTC=!0,n._tzm=p(e)}null==e&&(n._isValid=!1)}function Y(t){var e,n,s=[];if(!t._d){for(e=0;7>e;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];s[3]+=~~((t._tzm||0)/60),s[4]+=~~((t._tzm||0)%60),n=new Date(0),t._useUTC?(n.setUTCFullYear(s[0],s[1],s[2]),n.setUTCHours(s[3],s[4],s[5],s[6])):(n.setFullYear(s[0],s[1],s[2]),n.setHours(s[3],s[4],s[5],s[6])),t._d=n}}function w(t){var e,n,s=t._f.match(E),i=t._i;for(t._a=[],e=0;eo&&(u=o,s=n);a(t,s)}function v(t){var e,n=t._i,s=K.exec(n);if(s){for(t._f="YYYY-MM-DD"+(s[2]||" "),e=0;4>e;e++)if(te[e][1].exec(n)){t._f+=te[e][0];break}j.exec(n)&&(t._f+=" Z"),w(t)}else t._d=new Date(n)}function T(e){var n=e._i,s=G.exec(n);n===t?e._d=new Date:s?e._d=new Date(+s[1]):"string"==typeof n?v(e):d(n)?(e._a=n.slice(0),Y(e)):e._d=n instanceof Date?new Date(+n):new Date(n)}function b(t,e,n,s,i){return i.relativeTime(e||1,!!n,t,s)}function S(t,e,n){var s=W(Math.abs(t)/1e3),i=W(s/60),r=W(i/60),a=W(r/24),o=W(a/365),u=45>s&&["s",s]||1===i&&["m"]||45>i&&["mm",i]||1===r&&["h"]||22>r&&["hh",r]||1===a&&["d"]||25>=a&&["dd",a]||45>=a&&["M"]||345>a&&["MM",W(a/30)]||1===o&&["y"]||["yy",o];return u[2]=e,u[3]=t>0,u[4]=n,b.apply({},u)}function F(t,e,n){var s,i=n-e,r=n-t.day();return r>i&&(r-=7),i-7>r&&(r+=7),s=H(t).add("d",r),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function O(t){var e=t._i,n=t._f;return null===e||""===e?null:("string"==typeof e&&(t._i=e=_().preparse(e)),H.isMoment(e)?(t=a({},e),t._d=new Date(+e._d)):n?d(n)?k(t):w(t):T(t),new i(t))}function z(t,e){H.fn[t]=H.fn[t+"s"]=function(t){var n=this._isUTC?"UTC":"";return null!=t?(this._d["set"+n+e](t),H.updateOffset(this),this):this._d["get"+n+e]()}}function C(t){H.duration.fn[t]=function(){return this._data[t]}}function L(t,e){H.duration.fn["as"+t]=function(){return+this/e}}for(var H,P,U="2.1.0",W=Math.round,x={},A="undefined"!=typeof module&&module.exports,G=/^\/?Date\((\-?\d+)/i,Z=/(\-)?(\d*)?\.?(\d+)\:(\d+)\:(\d+)\.?(\d{3})?/,E=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g,N=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,J=/\d\d?/,I=/\d{1,3}/,V=/\d{3}/,X=/\d{1,4}/,$=/[+\-]?\d{1,6}/,R=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,j=/Z|[\+\-]\d\d:?\d\d/i,q=/T/i,B=/[\+\-]?\d+(\.\d{1,3})?/,K=/^\s*\d{4}-\d\d-\d\d((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/,Q="YYYY-MM-DDTHH:mm:ssZ",te=[["HH:mm:ss.S",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],ee=/([\+\-]|\d\d)/gi,ne="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),se={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},ie={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",w:"week",M:"month",y:"year"},re={},ae="DDD w W M D d".split(" "),oe="M D H h m s w W".split(" "),ue={M:function(){return this.month()+1},MMM:function(t){return this.lang().monthsShort(this,t)},MMMM:function(t){return this.lang().months(this,t)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(t){return this.lang().weekdaysMin(this,t)},ddd:function(t){return this.lang().weekdaysShort(this,t)},dddd:function(t){return this.lang().weekdays(this,t)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return u(this.year()%100,2)},YYYY:function(){return u(this.year(),4)},YYYYY:function(){return u(this.year(),5)},gg:function(){return u(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return u(this.weekYear(),5)},GG:function(){return u(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return u(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return~~(this.milliseconds()/100)},SS:function(){return u(~~(this.milliseconds()/10),2)},SSS:function(){return u(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(~~(t/60),2)+":"+u(~~t%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+u(~~(10*t/6),4)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()}};ae.length;)P=ae.pop(),ue[P+"o"]=n(ue[P],P);for(;oe.length;)P=oe.pop(),ue[P+P]=e(ue[P],2);for(ue.DDDD=e(ue.DDD,3),s.prototype={set:function(t){var e,n;for(n in t)e=t[n],"function"==typeof e?this[n]=e:this["_"+n]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,n,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(n=H([2e3,e]),s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,n,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(n=H([2e3,1]).day(e),s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase()[0]},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var n=this._calendar[t];return"function"==typeof n?n.apply(e):n},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,n,s){var i=this._relativeTime[n];return"function"==typeof i?i(t,e,n,s):i.replace(/%d/i,t)},pastFuture:function(t,e){var n=this._relativeTime[t>0?"future":"past"];return"function"==typeof n?n(e):n.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return F(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6}},H=function(t,e,n){return O({_i:t,_f:e,_l:n,_isUTC:!1})},H.utc=function(t,e,n){return O({_useUTC:!0,_isUTC:!0,_l:n,_i:t,_f:e})},H.unix=function(t){return H(1e3*t)},H.duration=function(t,e){var n,s,i=H.isDuration(t),a="number"==typeof t,o=i?t._input:a?{}:t,u=Z.exec(t);return a?e?o[e]=t:o.milliseconds=t:u&&(n="-"===u[1]?-1:1,o={y:0,d:~~u[2]*n,h:~~u[3]*n,m:~~u[4]*n,s:~~u[5]*n,ms:~~u[6]*n}),s=new r(o),i&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},H.version=U,H.defaultFormat=Q,H.updateOffset=function(){},H.lang=function(t,e){return t?(e?l(t,e):x[t]||_(t),H.duration.fn._lang=H.fn._lang=_(t),void 0):H.fn._lang._abbr},H.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),_(t)},H.isMoment=function(t){return t instanceof i},H.isDuration=function(t){return t instanceof r},H.fn=i.prototype={clone:function(){return H(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){return M(H(this).utc(),"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var t=this;return[t.year(),t.month(),t.date(),t.hours(),t.minutes(),t.seconds(),t.milliseconds()]},isValid:function(){return null==this._isValid&&(this._isValid=this._a?!c(this._a,(this._isUTC?H.utc(this._a):H(this._a)).toArray()):!isNaN(this._d.getTime())),!!this._isValid},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=M(this,t||H.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var n;return n="string"==typeof t?H.duration(+e,t):H.duration(t,e),h(this,n,1),this},subtract:function(t,e){var n;return n="string"==typeof t?H.duration(+e,t):H.duration(t,e),h(this,n,-1),this},diff:function(t,e,n){var s,i,r=this._isUTC?H(t).zone(this._offset||0):H(t).local(),a=6e4*(this.zone()-r.zone());return e=f(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+r.daysInMonth()),i=12*(this.year()-r.year())+(this.month()-r.month()),i+=(this-H(this).startOf("month")-(r-H(r).startOf("month")))/s,i-=6e4*(this.zone()-H(this).startOf("month").zone()-(r.zone()-H(r).startOf("month").zone()))/s,"year"===e&&(i/=12)):(s=this-r,i="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),n?i:o(i)},from:function(t,e){return H.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(H(),t)},calendar:function(){var t=this.diff(H().startOf("day"),"days",!0),e=-6>t?"sameElse":-1>t?"lastWeek":0>t?"lastDay":1>t?"sameDay":2>t?"nextDay":7>t?"nextWeek":"sameElse";return this.format(this.lang().calendar(e,this))},isLeapYear:function(){var t=this.year();return 0===t%4&&0!==t%100||0===t%400},isDST:function(){return this.zone()+H(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+H(t).startOf(e)},isSame:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)===+H(t).startOf(e)},min:function(t){return t=H.apply(null,arguments),this>t?this:t},max:function(t){return t=H.apply(null,arguments),t>this?this:t},zone:function(t){var e=this._offset||0;return null==t?this._isUTC?e:this._d.getTimezoneOffset():("string"==typeof t&&(t=p(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,e!==t&&h(this,H.duration(e-t,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},daysInMonth:function(){return H.utc([this.year(),this.month()+1,0]).date()},dayOfYear:function(t){var e=W((H(this).startOf("day")-H(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},weekYear:function(t){var e=F(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=F(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=F(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this._d.getDay()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},lang:function(e){return e===t?this._lang:(this._lang=_(e),this)}},P=0;P - - - \ No newline at end of file diff --git a/release/template/typeahead/typeahead-popup.html b/release/template/typeahead/typeahead-popup.html deleted file mode 100644 index ecd9838..0000000 --- a/release/template/typeahead/typeahead-popup.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/resources/cws128.webp b/resources/cws128.webp new file mode 100644 index 0000000..5eaa31f Binary files /dev/null and b/resources/cws128.webp differ diff --git a/release/icon128.png b/resources/icon128.png similarity index 100% rename from release/icon128.png rename to resources/icon128.png diff --git a/release/icon16.png b/resources/icon16.png similarity index 100% rename from release/icon16.png rename to resources/icon16.png diff --git a/release/icon48.png b/resources/icon48.png similarity index 100% rename from release/icon48.png rename to resources/icon48.png diff --git a/ressources/cardboard.png b/ressources/cardboard.png deleted file mode 100644 index 063d0ac..0000000 Binary files a/ressources/cardboard.png and /dev/null differ diff --git a/ressources/cardboard_promo_large.png b/ressources/cardboard_promo_large.png deleted file mode 100644 index 58fafb2..0000000 Binary files a/ressources/cardboard_promo_large.png and /dev/null differ diff --git a/ressources/cardboard_promo_small.png b/ressources/cardboard_promo_small.png deleted file mode 100644 index 0012ee1..0000000 Binary files a/ressources/cardboard_promo_small.png and /dev/null differ diff --git a/ressources/google.png b/ressources/google.png deleted file mode 100644 index 30a9445..0000000 Binary files a/ressources/google.png and /dev/null differ diff --git a/ressources/headers/Austin/Austin_Dawn.png b/ressources/headers/Austin/Austin_Dawn.png deleted file mode 100644 index 9fedea5..0000000 Binary files a/ressources/headers/Austin/Austin_Dawn.png and /dev/null differ diff --git a/ressources/headers/Austin/Austin_Day.png b/ressources/headers/Austin/Austin_Day.png deleted file mode 100644 index 062c3f4..0000000 Binary files a/ressources/headers/Austin/Austin_Day.png and /dev/null differ diff --git a/ressources/headers/Austin/Austin_Dusk.png b/ressources/headers/Austin/Austin_Dusk.png deleted file mode 100644 index 80a9c98..0000000 Binary files a/ressources/headers/Austin/Austin_Dusk.png and /dev/null differ diff --git a/ressources/headers/Austin/Austin_Night.png b/ressources/headers/Austin/Austin_Night.png deleted file mode 100644 index 833888f..0000000 Binary files a/ressources/headers/Austin/Austin_Night.png and /dev/null differ diff --git a/ressources/headers/Beach/Beach_Dawn.png b/ressources/headers/Beach/Beach_Dawn.png deleted file mode 100644 index e0ea255..0000000 Binary files a/ressources/headers/Beach/Beach_Dawn.png and /dev/null differ diff --git a/ressources/headers/Beach/Beach_Day.png b/ressources/headers/Beach/Beach_Day.png deleted file mode 100644 index f1a8823..0000000 Binary files a/ressources/headers/Beach/Beach_Day.png and /dev/null differ diff --git a/ressources/headers/Beach/Beach_Dusk.png b/ressources/headers/Beach/Beach_Dusk.png deleted file mode 100644 index 7cd9af8..0000000 Binary files a/ressources/headers/Beach/Beach_Dusk.png and /dev/null differ diff --git a/ressources/headers/Beach/Beach_Night.png b/ressources/headers/Beach/Beach_Night.png deleted file mode 100644 index 0938663..0000000 Binary files a/ressources/headers/Beach/Beach_Night.png and /dev/null differ diff --git a/ressources/headers/Berlin/Berlin_Dawn.png b/ressources/headers/Berlin/Berlin_Dawn.png deleted file mode 100644 index 9d3f86e..0000000 Binary files a/ressources/headers/Berlin/Berlin_Dawn.png and /dev/null differ diff --git a/ressources/headers/Berlin/Berlin_Day.png b/ressources/headers/Berlin/Berlin_Day.png deleted file mode 100644 index 06f5ff9..0000000 Binary files a/ressources/headers/Berlin/Berlin_Day.png and /dev/null differ diff --git a/ressources/headers/Berlin/Berlin_Dusk.png b/ressources/headers/Berlin/Berlin_Dusk.png deleted file mode 100644 index a0064d7..0000000 Binary files a/ressources/headers/Berlin/Berlin_Dusk.png and /dev/null differ diff --git a/ressources/headers/Berlin/Berlin_Night.png b/ressources/headers/Berlin/Berlin_Night.png deleted file mode 100644 index 8520f0a..0000000 Binary files a/ressources/headers/Berlin/Berlin_Night.png and /dev/null differ diff --git a/ressources/headers/Chicago/Chicago_Dawn.png b/ressources/headers/Chicago/Chicago_Dawn.png deleted file mode 100644 index 04558c5..0000000 Binary files a/ressources/headers/Chicago/Chicago_Dawn.png and /dev/null differ diff --git a/ressources/headers/Chicago/Chicago_Day.png b/ressources/headers/Chicago/Chicago_Day.png deleted file mode 100644 index 45f30dc..0000000 Binary files a/ressources/headers/Chicago/Chicago_Day.png and /dev/null differ diff --git a/ressources/headers/Chicago/Chicago_Dusk.png b/ressources/headers/Chicago/Chicago_Dusk.png deleted file mode 100644 index e01c098..0000000 Binary files a/ressources/headers/Chicago/Chicago_Dusk.png and /dev/null differ diff --git a/ressources/headers/Chicago/Chicago_Night.png b/ressources/headers/Chicago/Chicago_Night.png deleted file mode 100644 index 27e6a0d..0000000 Binary files a/ressources/headers/Chicago/Chicago_Night.png and /dev/null differ diff --git a/ressources/headers/Default/Default_Dawn.png b/ressources/headers/Default/Default_Dawn.png deleted file mode 100644 index aa64993..0000000 Binary files a/ressources/headers/Default/Default_Dawn.png and /dev/null differ diff --git a/ressources/headers/Default/Default_Day.png b/ressources/headers/Default/Default_Day.png deleted file mode 100644 index fa08a49..0000000 Binary files a/ressources/headers/Default/Default_Day.png and /dev/null differ diff --git a/ressources/headers/Default/Default_Dusk.png b/ressources/headers/Default/Default_Dusk.png deleted file mode 100644 index abbaa22..0000000 Binary files a/ressources/headers/Default/Default_Dusk.png and /dev/null differ diff --git a/ressources/headers/Default/Default_Night.png b/ressources/headers/Default/Default_Night.png deleted file mode 100644 index 0eaf45e..0000000 Binary files a/ressources/headers/Default/Default_Night.png and /dev/null differ diff --git a/ressources/headers/GreatPlains/GreatPlains_Dawn.png b/ressources/headers/GreatPlains/GreatPlains_Dawn.png deleted file mode 100644 index c6ef1a0..0000000 Binary files a/ressources/headers/GreatPlains/GreatPlains_Dawn.png and /dev/null differ diff --git a/ressources/headers/GreatPlains/GreatPlains_Day.png b/ressources/headers/GreatPlains/GreatPlains_Day.png deleted file mode 100644 index fe35673..0000000 Binary files a/ressources/headers/GreatPlains/GreatPlains_Day.png and /dev/null differ diff --git a/ressources/headers/GreatPlains/GreatPlains_Dusk.png b/ressources/headers/GreatPlains/GreatPlains_Dusk.png deleted file mode 100644 index 6103143..0000000 Binary files a/ressources/headers/GreatPlains/GreatPlains_Dusk.png and /dev/null differ diff --git a/ressources/headers/GreatPlains/GreatPlains_Night.png b/ressources/headers/GreatPlains/GreatPlains_Night.png deleted file mode 100644 index a5aa22f..0000000 Binary files a/ressources/headers/GreatPlains/GreatPlains_Night.png and /dev/null differ diff --git a/ressources/headers/London/London_Dawn.png b/ressources/headers/London/London_Dawn.png deleted file mode 100644 index 7b890b7..0000000 Binary files a/ressources/headers/London/London_Dawn.png and /dev/null differ diff --git a/ressources/headers/London/London_Day.png b/ressources/headers/London/London_Day.png deleted file mode 100644 index 425ec99..0000000 Binary files a/ressources/headers/London/London_Day.png and /dev/null differ diff --git a/ressources/headers/London/London_Dusk.png b/ressources/headers/London/London_Dusk.png deleted file mode 100644 index 288a392..0000000 Binary files a/ressources/headers/London/London_Dusk.png and /dev/null differ diff --git a/ressources/headers/London/London_Night.png b/ressources/headers/London/London_Night.png deleted file mode 100644 index 71dbe34..0000000 Binary files a/ressources/headers/London/London_Night.png and /dev/null differ diff --git a/ressources/headers/NewYork/NewYork_Dawn.png b/ressources/headers/NewYork/NewYork_Dawn.png deleted file mode 100644 index a4e786a..0000000 Binary files a/ressources/headers/NewYork/NewYork_Dawn.png and /dev/null differ diff --git a/ressources/headers/NewYork/NewYork_Day.png b/ressources/headers/NewYork/NewYork_Day.png deleted file mode 100644 index 806f828..0000000 Binary files a/ressources/headers/NewYork/NewYork_Day.png and /dev/null differ diff --git a/ressources/headers/NewYork/NewYork_Dusk.png b/ressources/headers/NewYork/NewYork_Dusk.png deleted file mode 100644 index cc624e3..0000000 Binary files a/ressources/headers/NewYork/NewYork_Dusk.png and /dev/null differ diff --git a/ressources/headers/NewYork/NewYork_Night.png b/ressources/headers/NewYork/NewYork_Night.png deleted file mode 100644 index 0e81864..0000000 Binary files a/ressources/headers/NewYork/NewYork_Night.png and /dev/null differ diff --git a/ressources/headers/Paris/Paris_Dawn.png b/ressources/headers/Paris/Paris_Dawn.png deleted file mode 100644 index ad90622..0000000 Binary files a/ressources/headers/Paris/Paris_Dawn.png and /dev/null differ diff --git a/ressources/headers/Paris/Paris_Day.png b/ressources/headers/Paris/Paris_Day.png deleted file mode 100644 index ad90622..0000000 Binary files a/ressources/headers/Paris/Paris_Day.png and /dev/null differ diff --git a/ressources/headers/Paris/Paris_Dusk.png b/ressources/headers/Paris/Paris_Dusk.png deleted file mode 100644 index 60b0685..0000000 Binary files a/ressources/headers/Paris/Paris_Dusk.png and /dev/null differ diff --git a/ressources/headers/Paris/Paris_Night.png b/ressources/headers/Paris/Paris_Night.png deleted file mode 100644 index 60b0685..0000000 Binary files a/ressources/headers/Paris/Paris_Night.png and /dev/null differ diff --git a/ressources/headers/SanFrancisco/SanFrancisco_Dawn.png b/ressources/headers/SanFrancisco/SanFrancisco_Dawn.png deleted file mode 100644 index 5f888db..0000000 Binary files a/ressources/headers/SanFrancisco/SanFrancisco_Dawn.png and /dev/null differ diff --git a/ressources/headers/SanFrancisco/SanFrancisco_Day.png b/ressources/headers/SanFrancisco/SanFrancisco_Day.png deleted file mode 100644 index dbd313a..0000000 Binary files a/ressources/headers/SanFrancisco/SanFrancisco_Day.png and /dev/null differ diff --git a/ressources/headers/SanFrancisco/SanFrancisco_Dusk.png b/ressources/headers/SanFrancisco/SanFrancisco_Dusk.png deleted file mode 100644 index bece9a4..0000000 Binary files a/ressources/headers/SanFrancisco/SanFrancisco_Dusk.png and /dev/null differ diff --git a/ressources/headers/SanFrancisco/SanFrancisco_Night.png b/ressources/headers/SanFrancisco/SanFrancisco_Night.png deleted file mode 100644 index 81fb912..0000000 Binary files a/ressources/headers/SanFrancisco/SanFrancisco_Night.png and /dev/null differ diff --git a/ressources/headers/Seattle/Seattle_Dawn.png b/ressources/headers/Seattle/Seattle_Dawn.png deleted file mode 100644 index 6574925..0000000 Binary files a/ressources/headers/Seattle/Seattle_Dawn.png and /dev/null differ diff --git a/ressources/headers/Seattle/Seattle_Day.png b/ressources/headers/Seattle/Seattle_Day.png deleted file mode 100644 index 6f45949..0000000 Binary files a/ressources/headers/Seattle/Seattle_Day.png and /dev/null differ diff --git a/ressources/headers/Seattle/Seattle_Dusk.png b/ressources/headers/Seattle/Seattle_Dusk.png deleted file mode 100644 index bfdf5dc..0000000 Binary files a/ressources/headers/Seattle/Seattle_Dusk.png and /dev/null differ diff --git a/ressources/headers/Seattle/Seattle_Night.png b/ressources/headers/Seattle/Seattle_Night.png deleted file mode 100644 index eec83bd..0000000 Binary files a/ressources/headers/Seattle/Seattle_Night.png and /dev/null differ diff --git a/ressources/headers/Tahoe/Tahoe_Dawn.png b/ressources/headers/Tahoe/Tahoe_Dawn.png deleted file mode 100644 index db0876c..0000000 Binary files a/ressources/headers/Tahoe/Tahoe_Dawn.png and /dev/null differ diff --git a/ressources/headers/Tahoe/Tahoe_Day.png b/ressources/headers/Tahoe/Tahoe_Day.png deleted file mode 100644 index 8c0530d..0000000 Binary files a/ressources/headers/Tahoe/Tahoe_Day.png and /dev/null differ diff --git a/ressources/headers/Tahoe/Tahoe_Dusk.png b/ressources/headers/Tahoe/Tahoe_Dusk.png deleted file mode 100644 index f19757c..0000000 Binary files a/ressources/headers/Tahoe/Tahoe_Dusk.png and /dev/null differ diff --git a/ressources/headers/Tahoe/Tahoe_Night.png b/ressources/headers/Tahoe/Tahoe_Night.png deleted file mode 100644 index e81caae..0000000 Binary files a/ressources/headers/Tahoe/Tahoe_Night.png and /dev/null differ diff --git a/ressources/psd/cardboard_favicon.psd b/ressources/psd/cardboard_favicon.psd deleted file mode 100644 index 721721f..0000000 Binary files a/ressources/psd/cardboard_favicon.psd and /dev/null differ diff --git a/ressources/psd/cardboard_icon.psd b/ressources/psd/cardboard_icon.psd deleted file mode 100644 index 028d417..0000000 Binary files a/ressources/psd/cardboard_icon.psd and /dev/null differ diff --git a/ressources/psd/cardboard_promo_large.psd b/ressources/psd/cardboard_promo_large.psd deleted file mode 100644 index 2ff5d87..0000000 Binary files a/ressources/psd/cardboard_promo_large.psd and /dev/null differ diff --git a/ressources/psd/cardboard_promo_small.psd b/ressources/psd/cardboard_promo_small.psd deleted file mode 100644 index 1fddab2..0000000 Binary files a/ressources/psd/cardboard_promo_small.psd and /dev/null differ diff --git a/ressources/screen/cardboard_screen.png b/ressources/screen/cardboard_screen.png deleted file mode 100644 index 6392635..0000000 Binary files a/ressources/screen/cardboard_screen.png and /dev/null differ diff --git a/ressources/screen/cardboard_screen2.png b/ressources/screen/cardboard_screen2.png deleted file mode 100644 index d6d7640..0000000 Binary files a/ressources/screen/cardboard_screen2.png and /dev/null differ diff --git a/ressources/screen/cardboard_screen3.png b/ressources/screen/cardboard_screen3.png deleted file mode 100644 index 2849d1d..0000000 Binary files a/ressources/screen/cardboard_screen3.png and /dev/null differ