├── .gitmodules ├── .parse.local ├── .parse.project ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── cloud ├── app.js ├── controllers │ ├── admin.js │ ├── api.js │ ├── default.js │ └── requestPlugins.js ├── main.js ├── models.js └── views │ ├── admin │ ├── dashboard.ejs │ ├── footer.ejs │ ├── header.ejs │ ├── nav.ejs │ └── users │ │ ├── employees.ejs │ │ ├── guests.ejs │ │ └── list.ejs │ └── front │ ├── footer.ejs │ ├── header.ejs │ ├── homepage.ejs │ ├── login.ejs │ └── signup.ejs └── public ├── css ├── bootstrap-rtl.css ├── bootstrap-rtl.min.css ├── bootstrap.css ├── bootstrap.min.css ├── bootstrap.min.css.map ├── font-awesome.min.css ├── ie │ ├── PIE.htc │ ├── backgroundsize.min.htc │ ├── html5shiv.js │ └── v8.css ├── images │ └── bracket.svg ├── jTinder.css ├── plugins │ └── morris.css ├── sb-admin-rtl.css ├── sb-admin.css ├── skel.css ├── style-1000px.css ├── style-desktop.css ├── style-mobile.css └── style.css ├── font-awesome ├── css │ ├── font-awesome.css │ └── font-awesome.min.css ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── less │ ├── bordered-pulled.less │ ├── core.less │ ├── fixed-width.less │ ├── font-awesome.less │ ├── icons.less │ ├── larger.less │ ├── list.less │ ├── mixins.less │ ├── path.less │ ├── rotated-flipped.less │ ├── spinning.less │ ├── stacked.less │ └── variables.less └── scss │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _path.scss │ ├── _rotated-flipped.scss │ ├── _spinning.scss │ ├── _stacked.scss │ ├── _variables.scss │ └── font-awesome.scss ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff ├── fontawesome-webfont.woff2 ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── images ├── ajax-loading.gif ├── banner.jpg ├── default_picture.png ├── dislike_button.png ├── favicon.ico ├── imeals-logo.png ├── like_button.png ├── liked.png ├── monthly │ ├── 102015 │ │ ├── potm1.jpg │ │ ├── potm2.jpg │ │ └── winner.jpg │ └── 112015 │ │ ├── potm1.jpg │ │ ├── potm2.jpg │ │ └── potm3.jpg ├── nope.png ├── pic01.jpg ├── pic02.jpg ├── pic03.jpg ├── pic04.jpg ├── pic05.jpg ├── pic06.jpg ├── pic07.jpg ├── picpoll.png └── picpoll_text.png └── js ├── bootstrap.js ├── bootstrap.min.js ├── html5shiv.js ├── init.js ├── jquery-1.10.2.min.map ├── jquery.dropotron.min.js ├── jquery.highcharts-3d.min.js ├── jquery.highcharts.min.js ├── jquery.jTinder.js ├── jquery.js ├── jquery.min.js ├── jquery.transform2d.js ├── plugins ├── flot │ ├── excanvas.min.js │ ├── flot-data.js │ ├── jquery.flot.js │ ├── jquery.flot.pie.js │ ├── jquery.flot.resize.js │ └── jquery.flot.tooltip.min.js └── morris │ ├── morris-data.js │ ├── morris.js │ ├── morris.min.js │ └── raphael.min.js ├── skel-layers.min.js └── skel.min.js /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "cloud/3rdparty/parse-facebook-user-session"] 2 | path = cloud/3rdparty/parse-facebook-user-session 3 | url = git@github.com:ParsePlatform/parse-facebook-user-session.git 4 | -------------------------------------------------------------------------------- /.parse.local: -------------------------------------------------------------------------------- 1 | { 2 | "applications": { 3 | "YOUR_PARSE_APP": { 4 | "applicationId": "YOUR_PARSE_APP_ID" 5 | }, 6 | "_default": { 7 | "link": "YOUR_PARSE_APP" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /.parse.project: -------------------------------------------------------------------------------- 1 | { 2 | "project_type": 1, 3 | "parse": { 4 | "jssdk": "latest" 5 | }, 6 | "email": "greg@evias.be" 7 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ### [0.0.1](https://github.com/evias/iMeals/compare/2c86794...HEAD) 3 | 4 | * initial iMeals repository commit 5 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2015 Grégory Saive 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## evias/iMeals 2 | iMeals is a Open Source Food Delivery and Restaurant Management App. This 3 | package can be installed on Parse.com free tiers (allowing up to 30 requests 4 | per second with the Free plan). This package aims to provide a full-featured 5 | Restaurant Management and Food Delivery application package. 6 | 7 | A Demo of this App deployed to a Parse Hosting can be found at following 8 | URL : https://imeals.parseapp.com 9 | 10 | Deployment is very easy as the App can be deployed on the free Parse.com 11 | tiers. You'll find more informations about this here: https://www.parse.com/docs/cloudcode 12 | 13 | ### Installation 14 | Please make sure to have the Parse Command-Line Tools installed and configured 15 | as described here: https://www.parse.com/docs/cloudcode/guide#command-line 16 | 17 | For this installation example I will assume that you have already created 18 | a Parse App with the name "myRestaurantApp". 19 | 20 | First thing to do to be able to install the iMeals App is to clone 21 | the git repository with the source code. 22 | 23 | $ git clone https://github.com/evias/iMeals.git 24 | $ cd iMeals 25 | 26 | Now that you have the source code, you will see a public/ directory and a 27 | cloud/ directory. These two directories are important for the CloudCode API 28 | provided by Parse.com. See following link for more details about CloudCode 29 | Apps on Parse: https://www.parse.com/docs/cloudcode/guide 30 | 31 | The last step of the installation is to deploy the application to the Parse 32 | App "myRestaurantApp" you created earlier. The command-line tools from Parse 33 | make this process very easy: 34 | 35 | $ parse new -a myRestaurantApp 36 | $ parse deploy myRestaurantApp 37 | 38 | Your iMeals Restaurant app is now online ! 39 | 40 | ### Dependencies 41 | * jQuery 1.11 42 | * Parse CloudCode 43 | 44 | ### Hints / Advices 45 | Using git, when you will modify your .parse.local file of the clone in order 46 | to configure your parse command line tools to use your own Parse App, git will 47 | see the .parse.local file as modified. To avoid having to communicate my Parse 48 | App details, I use following command to mark the .parse.local file unchanged: 49 | 50 | $ git update-index [--assume-unchanged|--no-assume-unchanged] 51 | 52 | ### Git Branching 53 | 2 git branches will usually be updated in this repository, being the branch 54 | *master* for releases (see git tags) and the branch *develop* for development 55 | of features. Hotfixes might branch from *master* but will usually be tackled 56 | from a *develop* branch or sub-branch. 57 | 58 | ### Support / Contact 59 | You can contact me anytime at my e-mail address and I will be glad to answer 60 | any type of questions related to this project. 61 | 62 | Contributions are welcome if you see anything missing or have detected a 63 | bug, want to develop a new API class, or whatever, I will be glad to respond 64 | to pull requests! 65 | 66 | Cheers, 67 | Greg 68 | -------------------------------------------------------------------------------- /cloud/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package iMeals 19 | * @subpackage Router 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://imeals.parseapp.com 23 | **/ 24 | 25 | // dependencies 26 | express = require('express'); 27 | 28 | // express apps (modules) 29 | app = express(); 30 | api = express(); 31 | admin = express(); 32 | 33 | app.set('views', 'cloud/views'); 34 | app.set('view engine', 'ejs'); 35 | app.use(express.bodyParser()); 36 | app.use(express.cookieParser()); 37 | 38 | // cookie session security, initialized with random 39 | // hashes. hash creation resolved through sha1 of: 40 | // iMeals by Grégory Saive - Secret Key X 41 | app.use(express.cookieSession({ 42 | name: "iMeals", 43 | keys: [ 44 | "4187c220dde05025a878e823410bef6d0b8c604f", 45 | "ca4752cea947b404e803f503194e3489a415e6cc", 46 | "1d9546a4930ae1fcfbf1b818bd7a23ce5f57fdf3", 47 | "b8ac4006b48b7b87da28ca7cab25371dfab90c7b", 48 | "87621280299dbafa72a8511241bbee35ef49919d" 49 | ], 50 | secret: "ca8d4ed0467c9044e216c6fad62fe24beedf8ff1"})); 51 | 52 | /** 53 | * Middleware for handling modules of the application. 54 | * This middleware defines all the applications possible request 55 | * handlers. see files for more details. 56 | **/ 57 | require('cloud/controllers/requestPlugins.js')(app); 58 | require('cloud/controllers/default.js')(app); 59 | 60 | require('cloud/controllers/admin.js')(admin); 61 | app.use("/admin", admin); 62 | 63 | require('cloud/controllers/api.js')(api); 64 | app.use("/api", api); 65 | 66 | // Attach the Express apps to Cloud Code. 67 | app.listen(); 68 | -------------------------------------------------------------------------------- /cloud/controllers/admin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package iMeals 19 | * @subpackage Controller 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://imeals.parseapp.com 23 | **/ 24 | 25 | module.exports = function(app) 26 | { 27 | app.use(function(request, response, next) { 28 | var currentUser = Parse.User.current(); 29 | if (! currentUser || "Guest" == currentUser.get("aclRole")) 30 | // admin available only to employees. 31 | response.redirect("/signin"); 32 | else 33 | next(); 34 | }); 35 | 36 | app.get('/', function(request, response) 37 | { 38 | var error = request.query.error; 39 | var success = request.query.success; 40 | 41 | response.render('admin/dashboard', { 42 | "errorMessage": error ? unescape(error) : false, 43 | "successMessage": success ? unescape(success) : false 44 | }); 45 | }); 46 | 47 | app.get('/users', function(request, response) 48 | { 49 | response.render('admin/users/list', {}); 50 | }); 51 | 52 | app.get('/users/employees', function(request, response) 53 | { 54 | response.render('admin/users/employees', {}); 55 | }); 56 | 57 | app.get('/users/guests', function(request, response) 58 | { 59 | response.render('admin/users/guests', {}); 60 | }); 61 | } 62 | -------------------------------------------------------------------------------- /cloud/controllers/api.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package iMeals 19 | * @subpackage Controller 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://imeals.parseapp.com 23 | **/ 24 | 25 | module.exports = function(app) 26 | { 27 | app.use(function(request, response, next) { 28 | var token = request.query.authToken; 29 | 30 | // XXX validate auth token for API access. 31 | if (true) 32 | next(); 33 | }); 34 | 35 | app.get('/', function(request, response) { 36 | 37 | var error = request.query.error; 38 | var success = request.query.success; 39 | 40 | response.status(200).send({ 41 | "version": response.locals.iMealsConfig.get("apiVersion") 42 | }); 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /cloud/controllers/default.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package iMeals 19 | * @subpackage Controller 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://imeals.parseapp.com 23 | **/ 24 | 25 | module.exports = function(app) 26 | { 27 | 28 | parseExpressHttpsRedirect = require('parse-express-https-redirect'); 29 | parseExpressCookieSession = require('parse-express-cookie-session'); 30 | parseFacebookUserSession = require('cloud/3rdparty/parse-facebook-user-session/parse-facebook-user-session'); 31 | 32 | /** 33 | * the facebookLogin middleware allows to check for a valid 34 | * facebook session and authorization for the app before 35 | * handling a given request. 36 | **/ 37 | facebookLogin = parseFacebookUserSession({ 38 | clientId: '544771132355164', 39 | appSecret: '0384224971e418557fec41ff560964fc', 40 | redirectUri: '/facebook-cb', 41 | scope: 'email', 42 | verbose: true 43 | }); 44 | 45 | /******************************************************************************* 46 | * HTTP GET requests handlers for iMeals 47 | * Following code represents the Default Controller implementation 48 | * for the iMeals frontend application. 49 | * @link https://imeals.parseapp.com 50 | *******************************************************************************/ 51 | 52 | /** 53 | * GET / 54 | * describes the homepage GET request. 55 | * this handler describes the frontend web app available after deploying 56 | * the app. Visitors can fill their cart and order delivery with the 57 | * available modules. 58 | **/ 59 | app.get('/', function(request, response) 60 | { 61 | var error = request.query.error; 62 | var success = request.query.success; 63 | 64 | response.render('front/homepage', { 65 | "errorMessage": error ? unescape(error) : false, 66 | "successMessage": success ? unescape(success) : false 67 | }); 68 | }); 69 | 70 | /** 71 | * GET /signin 72 | * describes the signin GET request. 73 | * this handler will render the login view. 74 | **/ 75 | app.get('/signin', function(request, response) 76 | { 77 | var currentUser = Parse.User.current(); 78 | if (currentUser) 79 | response.redirect("/"); 80 | else 81 | response.render('front/login', { 82 | "errorMessage": false}); 83 | }); 84 | 85 | /** 86 | * GET /signup 87 | * describes the signup GET request. 88 | * this handler will render the signup view. 89 | **/ 90 | app.get('/signup', function(request, response) 91 | { 92 | var currentUser = Parse.User.current(); 93 | if (currentUser) 94 | response.redirect("/"); 95 | else { 96 | var formValues = { 97 | "username": "", 98 | "email": "", 99 | }; 100 | response.render('front/signup', { 101 | "formValues": formValues, 102 | "errorMessage": false}); 103 | } 104 | }); 105 | 106 | /** 107 | * GET /signout 108 | * describes the signout GET request. 109 | * this handler will redirect to the /signin 110 | **/ 111 | app.get('/signout', function(request, response) 112 | { 113 | Parse.User.logOut(); 114 | request.session = null; 115 | 116 | response.redirect("/signin"); 117 | }); 118 | 119 | /******************************************************************************* 120 | * HTTP POST requests handlers for iMeals 121 | * @link https://imeals.parseapp.com 122 | *******************************************************************************/ 123 | 124 | /** 125 | * POST /signin 126 | * describes the signin POST request. 127 | * this handler is where we authenticate 128 | * a Parse.User session using the provided 129 | * signin form data. 130 | **/ 131 | app.post('/signin', function(request, response) 132 | { 133 | var username = request.body.username; 134 | var password = request.body.password; 135 | 136 | currentUser = Parse.User.logIn(username, password, { 137 | success: function(currentUser) { 138 | // user authentication credentials are OK, we can 139 | // now safely save the session token for this user 140 | // and finally redirect to the homepage. 141 | 142 | request.session.loggedState = true; 143 | request.session.sessionToken = currentUser.getSessionToken(); 144 | 145 | userAclRole = currentUser.get("aclRole"); 146 | welcomeMsg = encodeURIComponent("Welcome back " + currentUser.get("name") 147 | + ", we are glad to see you again!"); 148 | 149 | if ("Guest" == userAclRole) 150 | response.redirect("/?info=" + welcomeMsg); 151 | else if ("Admin" == userAclRole 152 | || "Manager" == userAclRole 153 | || "Employee" == userAclRole) 154 | response.redirect("/admin?info=" + welcomeMsg); 155 | }, 156 | error: function(currentUser, error) { 157 | request.session = null; 158 | 159 | response.render('front/login', { 160 | "errorMessage": error.message}); 161 | } 162 | }); 163 | }); 164 | 165 | /** 166 | * POST /signup 167 | * describes the signup POST request. 168 | * this handler is where we register new 169 | * Parse.User entries. 170 | **/ 171 | app.post('/signup', function(request, response) 172 | { 173 | var name = request.body.name; 174 | var username = request.body.username; 175 | var email = request.body.username; 176 | var password = request.body.password; 177 | var pwconfirm = request.body.pwconfirm; 178 | 179 | var formValues = { 180 | "name": name, 181 | "username": username, 182 | "email": email 183 | }; 184 | 185 | errors = []; 186 | if (!email || !email.length || !username || !username.length) 187 | errors.push("The Email adress may not be empty."); 188 | 189 | if (!name || !name.length) 190 | errors.push("The name field may not be left empty."); 191 | 192 | if (!password || !password.length) 193 | errors.push("The Password may not be empty."); 194 | 195 | if (password != pwconfirm) 196 | errors.push("The Passwords do not match !"); 197 | 198 | if (errors.length) 199 | // refresh with error messages displayed 200 | response.render("signup", { 201 | "formValues": formValues, 202 | "errorMessage": errors.join(" ", errors)}); 203 | else { 204 | // sign-up user ! 205 | var currentUser = new Parse.User(); 206 | currentUser.set("name", name); 207 | currentUser.set("username", username); 208 | currentUser.set("email", email); 209 | currentUser.set("password", password); 210 | currentUser.set("aclRole", "Guest"); 211 | 212 | currentUser.signUp(null, { 213 | success: function(currentUser) { 214 | // user registration was successfully done 215 | // we can now safely save the session token 216 | // and redirect the user to the homepage 217 | 218 | request.session.loggedState = true; 219 | request.session.sessionToken = currentUser.getSessionToken(); 220 | response.redirect("/"); 221 | }, 222 | error: function(currentUser, error) { 223 | request.session = null; 224 | 225 | response.render('front/signup', { 226 | "formValues": formValues, 227 | "errorMessage": error.message}); 228 | }}); 229 | } 230 | }); 231 | } 232 | -------------------------------------------------------------------------------- /cloud/controllers/requestPlugins.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package iMeals 19 | * @subpackage Controller 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://imeals.parseapp.com 23 | **/ 24 | 25 | module.exports = function(app) 26 | { 27 | crypto = require('crypto'); 28 | 29 | /******************************************************************************* 30 | * PRE-HTTP requests handlers for iMeals 31 | * These functions act as Plugins to the HTTP handlers. 32 | * @link https://imeals.parseapp.com 33 | *******************************************************************************/ 34 | 35 | /** 36 | * Session management PRE-HTTP request handler. 37 | * This function will try to retrieve a valid session token 38 | * and call Parse.User.become() with it in order for Parse.User 39 | * method current() to return the correct request initiating user 40 | * object. 41 | **/ 42 | app.use(function(req, res, next) 43 | { 44 | var sessionToken = req.session.sessionToken ? req.session.sessionToken : "invalidSessionToken"; 45 | var currentUser = Parse.User.current(); 46 | if (! currentUser) { 47 | Parse.User 48 | .become(sessionToken) 49 | .then( 50 | function(currentUser) { 51 | // currentUser now contains the BROWSER's logged in user. 52 | // Parse.User.current() for `req` will return the browsers user as well. 53 | 54 | if (! currentUser.get("emailVerified")) 55 | res.locals.globalErrorMessage = "Please verify your Account, " 56 | + "we have sent you an e-mail with a link for confirmation."; 57 | 58 | next(); 59 | }, 60 | function(error) { 61 | // not logged in => will result in redirection to /signin 62 | next(); 63 | }); 64 | } 65 | else 66 | next(); 67 | }); 68 | 69 | /** 70 | * Fill default local request variables. 71 | * This method fills the variables : 72 | * - currentUser : Parse.User instance or boolean false 73 | * - userHash : user hash String (SHA-1) 74 | * - iMealsConfig : Parse.Config for this Parse App instance 75 | **/ 76 | app.use(function(req, res, next) 77 | { 78 | var currentUser = Parse.User.current(); 79 | if (! currentUser) 80 | currentUser = false; 81 | 82 | var ipAddress = req.connection.remoteAddress; 83 | var userAgent = req.headers['user-agent']; 84 | var userHash = crypto.createHash("sha1") 85 | .update(userAgent + "@" + ipAddress) 86 | .digest("hex"); 87 | var infoMsg = req.query.info; 88 | var errorMsg = req.query.error; 89 | 90 | res.locals.currentUser = currentUser; 91 | res.locals.userHash = userHash; 92 | 93 | if (!errorMsg && !res.locals.globalErrorMessage) 94 | res.locals.globalErrorMessage = false; 95 | else if (errorMsg) 96 | res.locals.globalErrorMessage = errorMsg; 97 | 98 | if (!infoMsg && !res.locals.globalInfoMessage) 99 | res.locals.globalInfoMessage = false; 100 | else if (infoMsg) 101 | res.locals.globalInfoMessage = infoMsg; 102 | 103 | // load Parse App Parse.Config and store into 104 | // template locals. 105 | Parse.Config.get().then( 106 | function(config) 107 | { 108 | res.locals.iMealsConfig = config; 109 | next(); 110 | }); 111 | }); 112 | 113 | } 114 | -------------------------------------------------------------------------------- /cloud/main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package PicPoll 19 | * @subpackage CloudCode 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://picpoll.parseapp.com 23 | **/ 24 | models = require('cloud/models.js'); 25 | 26 | require('cloud/app.js'); 27 | 28 | /******************************************************************************* 29 | * Parse CloudCode Functions definition for PicPoll 30 | * @link https://picpoll.parseapp.com 31 | *******************************************************************************/ 32 | 33 | /** 34 | * The ping Parse CloudCode Functions simply responses with 35 | * a "pong" message and a timestamp. 36 | * This Function can be used to check the API availability. 37 | **/ 38 | Parse.Cloud.define("ping", function(request, response) 39 | { 40 | response.success({ping: "pong", timestamp: new Date()}); 41 | }); 42 | -------------------------------------------------------------------------------- /cloud/models.js: -------------------------------------------------------------------------------- 1 | /** 2 | * LICENSE 3 | * 4 | Copyright 2015 Grégory Saive (greg@evias.be) 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); 7 | you may not use this file except in compliance with the License. 8 | You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, 14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | See the License for the specific language governing permissions and 16 | limitations under the License. 17 | * 18 | * @package PicPoll 19 | * @subpackage Models 20 | * @author Grégory Saive 21 | * @license http://www.apache.org/licenses/LICENSE-2.0 22 | * @link https://picpoll.parseapp.com 23 | **/ 24 | 25 | module.exports = {}; 26 | -------------------------------------------------------------------------------- /cloud/views/admin/dashboard.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include header.ejs -%> 3 | 4 | 5 |
6 |
7 |

8 | Dashboard Statistics Overview 9 |

10 | 15 |
16 |
17 | 18 | 19 |
20 |
21 |
22 | 23 | Like SB Admin? Try out SB Admin 2 for additional features! 24 |
25 |
26 |
27 | 28 | 29 |
30 |
31 |
32 |
33 |
34 |
35 | 36 |
37 |
38 |
26
39 |
New Comments!
40 |
41 |
42 |
43 | 44 | 49 | 50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | 58 |
59 |
60 |
12
61 |
New Tasks!
62 |
63 |
64 |
65 | 66 | 71 | 72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | 80 |
81 |
82 |
124
83 |
New Orders!
84 |
85 |
86 |
87 | 88 | 93 | 94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 | 102 |
103 |
104 |
13
105 |
Support Tickets!
106 |
107 |
108 |
109 | 110 | 115 | 116 |
117 |
118 |
119 | 120 | 121 |
122 |
123 |
124 |
125 |

Area Chart

126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | 134 | 135 |
136 |
137 |
138 |
139 |

Donut Chart

140 |
141 |
142 |
143 |
144 | View Details 145 |
146 |
147 |
148 |
149 | 195 |
196 |
197 |
198 |

Transactions Panel

199 |
200 |
201 |
202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 |
Order #Order DateOrder TimeAmount (USD)
332610/21/20133:29 PM$321.33
332510/21/20133:20 PM$234.34
332410/21/20133:03 PM$724.17
332310/21/20133:00 PM$23.71
332210/21/20132:49 PM$8345.23
332110/21/20132:23 PM$245.12
332010/21/20132:15 PM$5663.54
331910/21/20132:13 PM$943.45
262 |
263 | 266 |
267 |
268 |
269 |
270 | 271 | 272 | <%- include footer.ejs -%> 273 | -------------------------------------------------------------------------------- /cloud/views/admin/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /cloud/views/admin/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | iMeals Admin 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | <%- include nav.ejs -%> 35 | 36 |
37 | 38 |
39 | 40 | <% if (globalErrorMessage) { %> 41 |
42 |
43 |
44 | <%= globalErrorMessage %> 45 |
46 |
47 |
48 | <% } %> 49 | 50 | <% if (globalInfoMessage) { %> 51 |
52 |
53 |
54 | 55 | <%= globalInfoMessage %> 56 |
57 |
58 |
59 | <% } %> 60 | -------------------------------------------------------------------------------- /cloud/views/admin/nav.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cloud/views/admin/users/employees.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include ../header.ejs -%> 3 | 4 |
5 |
6 |

Employees List

7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
PageVisits% New VisitsRevenue
/index.html126532.3%$321.33
/about.html26133.3%$234.12
/sales.html66521.3%$16.34
/blog.html951689.3%$1644.43
/404.html2334.3%$23.52
/services.html42160.3%$724.32
/blog/post.html123393.2%$126.34
62 |
63 |
64 |
65 | 66 | <%- include ../footer.ejs -%> 67 | -------------------------------------------------------------------------------- /cloud/views/admin/users/guests.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include ../header.ejs -%> 3 | 4 |
5 |
6 |

Guests List

7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
PageVisits% New VisitsRevenue
/index.html126532.3%$321.33
/about.html26133.3%$234.12
/sales.html66521.3%$16.34
/blog.html951689.3%$1644.43
/404.html2334.3%$23.52
/services.html42160.3%$724.32
/blog/post.html123393.2%$126.34
62 |
63 |
64 |
65 | 66 | <%- include ../footer.ejs -%> 67 | -------------------------------------------------------------------------------- /cloud/views/admin/users/list.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include ../header.ejs -%> 3 | 4 |
5 |
6 |

7 | Users Accounts Overview 8 |

9 | 14 |
15 |
16 | 17 | <%- include employees.ejs -%> 18 | <%- include guests.ejs -%> 19 | 20 | <%- include ../footer.ejs -%> 21 | -------------------------------------------------------------------------------- /cloud/views/front/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 | 7 | 8 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /cloud/views/front/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | iMeals 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 61 |
62 |
63 |
64 |
65 |
66 | 67 | <% if (globalErrorMessage) { %> 68 |
69 |

<%= globalErrorMessage %>

70 |
71 | <% } %> 72 | 73 | <% if (globalInfoMessage) { %> 74 |
75 |

<%= globalInfoMessage %>

76 |
77 | <% } %> 78 | -------------------------------------------------------------------------------- /cloud/views/front/homepage.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include header.ejs -%> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |

Welcome to iMeals, the Open Source Food & Restaurant Management 12 | App. Feel free to checkout all modules on this Demo!

13 |
14 | 15 | <%- include footer.ejs -%> 16 | -------------------------------------------------------------------------------- /cloud/views/front/login.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include header -%> 3 | 4 |
5 |
6 |
7 |

Login

8 |

Login with your username and password. You don't have an 9 | Account yet ? Signup now!

10 |
11 |
12 |
13 | <% if (errorMessage) { %> 14 |
15 |
16 |

Something went wrong. Please refresh and try again. (Error: <%= errorMessage %>)

17 |
18 |
19 | <% } %> 20 | 25 |
26 | 27 |
28 | 29 | 30 |
31 |
32 | 33 | 34 |
35 | 36 |
37 |
38 |
39 | 40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | 48 | 59 | 60 | <%- include footer -%> 61 | -------------------------------------------------------------------------------- /cloud/views/front/signup.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%- include header -%> 3 | 4 |
5 |
6 |
7 |

Register Now

8 |

Signup for an account today !

9 |

Already have an account ? Login

10 |
11 |
12 |
13 | <% if (errorMessage) { %> 14 |
15 |
16 |

Error: <%= errorMessage %>

17 |
18 |
19 | <% } %> 20 |
21 | 22 |
23 | 24 | 25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 37 |
38 | 39 |
We take privacy seriously.
40 |
41 |
42 |
43 |  Signup 44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | 52 | <%- include footer -%> 53 | -------------------------------------------------------------------------------- /public/css/ie/backgroundsize.min.htc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/css/ie/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d .last-child, 34 | article > .last-child 35 | { 36 | margin-bottom: 0; 37 | } 38 | 39 | section.last-child, 40 | article.last-child 41 | { 42 | margin-bottom: 0; 43 | } 44 | 45 | /*********************************************************************************/ 46 | /* Wrappers */ 47 | /*********************************************************************************/ 48 | 49 | #banner-wrapper 50 | { 51 | } 52 | 53 | #banner-wrapper .inner 54 | { 55 | -ms-behavior: url('css/ie/backgroundsize.min.htc'); 56 | } -------------------------------------------------------------------------------- /public/css/images/bracket.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/css/jTinder.css: -------------------------------------------------------------------------------- 1 | 2 | .wrap { 3 | height: 600px; 4 | padding: 0 5%; 5 | } 6 | 7 | .picpollSlider { 8 | position: relative; 9 | background: #fff; 10 | width: 95%; 11 | height: 100%; 12 | } 13 | 14 | .picpollSlider ul { 15 | margin: 0; 16 | position: relative; 17 | display: block; 18 | height: 100%; 19 | } 20 | 21 | .picpollSlider li { 22 | display: block; 23 | width: 100%; 24 | height: 100%; 25 | overflow: hidden; 26 | position: absolute; 27 | top: 0; 28 | z-index: 2; 29 | left: 0; 30 | box-shadow: 0 0 20px rgba(0, 0, 0, .2); 31 | overflow: hidden; 32 | text-align: center; 33 | padding: 10px 10px 10px 10px; 34 | background: #eee; 35 | font-size: 24px; 36 | color: #000; 37 | border: 1px solid #fff; 38 | border: 1px solid #dfdfdf; 39 | border: 1px solid rgba(96, 96, 96, 0.2); 40 | -webkit-transform: translate3d(0%,0,0) scale3d(1,1,1); 41 | -moz-transform: translate3d(0%,0,0) scale3d(1,1,1); 42 | -ms-transform: translate3d(0%,0,0) scale3d(1,1,1); 43 | -o-transform: translate3d(0%,0,0) scale3d(1,1,1); 44 | transform: translate3d(0%,0,0) scale3d(1,1,1); 45 | backface-visibility: hidden; 46 | -webkit-backface-visibility: hidden; 47 | } 48 | 49 | /* Image text */ 50 | .picpollSlider li h2 { 51 | color: #fff; 52 | font-size: 30px; 53 | text-align: center; 54 | position: absolute; 55 | top: 40%; 56 | left: 0; 57 | width: 100%; 58 | text-shadow: -1px -1px 0 rgba(0, 0, 0, .2); 59 | } 60 | 61 | /* Image rotation */ 62 | .picpollSlider li.pane1 { 63 | -webkit-transform: rotate(-1deg); 64 | -moz-transform: rotate(-1deg); 65 | -o-transform: rotate(-1deg); 66 | -ms-transform: rotate(-1deg); 67 | transform: rotate(-1deg); 68 | } 69 | 70 | .picpollSlider li.pane2 { 71 | -webkit-transform: rotate(2deg); 72 | -moz-transform: rotate(2deg); 73 | -o-transform: rotate(2deg); 74 | -ms-transform: rotate(2deg); 75 | transform: rotate(2deg); 76 | } 77 | 78 | /* Like & dislike badge images */ 79 | .picpollSlider .like, 80 | .picpollSlider .dislike { 81 | background: url("/images/liked.png") no-repeat scroll 0 0; 82 | opacity: 0; 83 | height: 80px; 84 | position: absolute; 85 | width: 170px; 86 | left: 45px; 87 | top:40px; 88 | z-index: 1; 89 | overflow: hidden; 90 | -webkit-transform: translate3d(0%,0,0) scale3d(1,1,1); 91 | -moz-transform: translate3d(0%,0,0) scale3d(1,1,1); 92 | -ms-transform: translate3d(0%,0,0) scale3d(1,1,1); 93 | -o-transform: translate3d(0%,0,0) scale3d(1,1,1); 94 | transform: translate3d(0%,0,0) scale3d(1,1,1); 95 | -webkit-backface-visibility: hidden; 96 | backface-visibility: hidden; 97 | } 98 | 99 | .picpollSlider .dislike { 100 | right: 45px; 101 | left: auto; 102 | background: url("/images/nope.png") no-repeat scroll 0 0; 103 | } 104 | 105 | /* Image container */ 106 | .picpollSlider .img { 107 | max-height: 85%; 108 | width: 100%; 109 | margin-bottom: 5px; 110 | position: relative; 111 | -webkit-transform: translate3d(0%,0,0) scale3d(1,1,1); 112 | -moz-transform: translate3d(0%,0,0) scale3d(1,1,1); 113 | -ms-transform: translate3d(0%,0,0) scale3d(1,1,1); 114 | -o-transform: translate3d(0%,0,0) scale3d(1,1,1); 115 | transform: translate3d(0%,0,0) scale3d(1,1,1); 116 | overflow: hidden; 117 | backface-visibility: hidden; 118 | -webkit-backface-visibility: hidden; 119 | -webkit-transform: translate3d(0,0,0) scale3d(1,1,1); 120 | -webkit-transform-style: preserve-3d; 121 | } 122 | 123 | .picpollSlider .swiperPane img { 124 | max-width: 100%; 125 | } 126 | 127 | /* Action - buttons */ 128 | .actions { 129 | text-align: center; 130 | width: 304px; 131 | margin: 0 auto; 132 | overflow: hidden; 133 | } 134 | 135 | .actions div { 136 | position: relative; 137 | display: inline-block; 138 | margin-right: -4px; 139 | } 140 | 141 | .actions a i { 142 | display: inline-block; 143 | width: 40px; 144 | height: 80px; 145 | } 146 | 147 | .actions a.dislike i { 148 | background: url("/images/dislike_button.png") no-repeat scroll center center; 149 | } 150 | 151 | .actions a.like i { 152 | background: url("/images/like_button.png") no-repeat scroll center center; 153 | } 154 | 155 | .actions a { 156 | float: left; 157 | display: block; 158 | background-color: #f7f7f7; 159 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), to(#e7e7e7)); 160 | background-image: -webkit-linear-gradient(top, #f7f7f7, #e7e7e7); 161 | background-image: -moz-linear-gradient(top, #f7f7f7, #e7e7e7); 162 | background-image: -ms-linear-gradient(top, #f7f7f7, #e7e7e7); 163 | background-image: -o-linear-gradient(top, #f7f7f7, #e7e7e7); 164 | color: #a7a7a7; 165 | margin: 25px; 166 | width: 80px; 167 | height: 80px; 168 | position: relative; 169 | text-align: center; 170 | line-height: 144px; 171 | border-radius: 50%; 172 | outline: none; 173 | box-shadow: 0px 3px 8px #aaa, inset 0px 2px 3px #fff; 174 | } 175 | 176 | .actions a:hover{ 177 | text-decoration: none; 178 | color: #555; 179 | background: #f5f5f5; 180 | } 181 | 182 | /* jTinder status text */ 183 | #status { 184 | text-align: center; 185 | font-size: 18px; 186 | font-family: arial; 187 | margin-top: 30px; 188 | font-weight: bold; 189 | } 190 | 191 | .smallText { 192 | font-size: 15px; 193 | } 194 | 195 | /*********************************************************************** 196 | MOBILE / RESPONSIVENESS 197 | **********************************************************************/ 198 | 199 | @media (max-width: 480px) { 200 | .wrap { 201 | height: 300px !important; 202 | padding: 0 !important; 203 | } 204 | } -------------------------------------------------------------------------------- /public/css/plugins/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} 3 | -------------------------------------------------------------------------------- /public/css/sb-admin-rtl.css: -------------------------------------------------------------------------------- 1 | 2 | @media (min-width: 768px){ 3 | #wrapper {padding-right: 225px; padding-left: 0;} 4 | .side-nav{right: 0;left: auto;} 5 | } -------------------------------------------------------------------------------- /public/css/sb-admin.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | /* Global Styles */ 8 | 9 | body { 10 | margin-top: 100px; 11 | background-color: #222; 12 | } 13 | 14 | @media(min-width:768px) { 15 | body { 16 | margin-top: 50px; 17 | } 18 | } 19 | 20 | #wrapper { 21 | padding-left: 0; 22 | } 23 | 24 | #page-wrapper { 25 | width: 100%; 26 | padding: 0; 27 | background-color: #fff; 28 | } 29 | 30 | .huge { 31 | font-size: 50px; 32 | line-height: normal; 33 | } 34 | 35 | @media(min-width:768px) { 36 | #wrapper { 37 | padding-left: 225px; 38 | } 39 | 40 | #page-wrapper { 41 | padding: 10px; 42 | } 43 | } 44 | 45 | /* Top Navigation */ 46 | 47 | .top-nav { 48 | padding: 0 15px; 49 | } 50 | 51 | .top-nav>li { 52 | display: inline-block; 53 | float: left; 54 | } 55 | 56 | .top-nav>li>a { 57 | padding-top: 15px; 58 | padding-bottom: 15px; 59 | line-height: 20px; 60 | color: #999; 61 | } 62 | 63 | .top-nav>li>a:hover, 64 | .top-nav>li>a:focus, 65 | .top-nav>.open>a, 66 | .top-nav>.open>a:hover, 67 | .top-nav>.open>a:focus { 68 | color: #fff; 69 | background-color: #000; 70 | } 71 | 72 | .top-nav>.open>.dropdown-menu { 73 | float: left; 74 | position: absolute; 75 | margin-top: 0; 76 | border: 1px solid rgba(0,0,0,.15); 77 | border-top-left-radius: 0; 78 | border-top-right-radius: 0; 79 | background-color: #fff; 80 | -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); 81 | box-shadow: 0 6px 12px rgba(0,0,0,.175); 82 | } 83 | 84 | .top-nav>.open>.dropdown-menu>li>a { 85 | white-space: normal; 86 | } 87 | 88 | ul.message-dropdown { 89 | padding: 0; 90 | max-height: 250px; 91 | overflow-x: hidden; 92 | overflow-y: auto; 93 | } 94 | 95 | li.message-preview { 96 | width: 275px; 97 | border-bottom: 1px solid rgba(0,0,0,.15); 98 | } 99 | 100 | li.message-preview>a { 101 | padding-top: 15px; 102 | padding-bottom: 15px; 103 | } 104 | 105 | li.message-footer { 106 | margin: 5px 0; 107 | } 108 | 109 | ul.alert-dropdown { 110 | width: 200px; 111 | } 112 | 113 | /* Side Navigation */ 114 | 115 | @media(min-width:768px) { 116 | .side-nav { 117 | position: fixed; 118 | top: 51px; 119 | left: 225px; 120 | width: 225px; 121 | margin-left: -225px; 122 | border: none; 123 | border-radius: 0; 124 | overflow-y: auto; 125 | background-color: #222; 126 | bottom: 0; 127 | overflow-x: hidden; 128 | padding-bottom: 40px; 129 | } 130 | 131 | .side-nav>li>a { 132 | width: 225px; 133 | } 134 | 135 | .side-nav li a:hover, 136 | .side-nav li a:focus { 137 | outline: none; 138 | background-color: #000 !important; 139 | } 140 | } 141 | 142 | .side-nav>li>ul { 143 | padding: 0; 144 | } 145 | 146 | .side-nav>li>ul>li>a { 147 | display: block; 148 | padding: 10px 15px 10px 38px; 149 | text-decoration: none; 150 | color: #999; 151 | } 152 | 153 | .side-nav>li>ul>li>a:hover { 154 | color: #fff; 155 | } 156 | 157 | /* Flot Chart Containers */ 158 | 159 | .flot-chart { 160 | display: block; 161 | height: 400px; 162 | } 163 | 164 | .flot-chart-content { 165 | width: 100%; 166 | height: 100%; 167 | } 168 | 169 | /* Custom Colored Panels */ 170 | 171 | .huge { 172 | font-size: 40px; 173 | } 174 | 175 | .panel-green { 176 | border-color: #5cb85c; 177 | } 178 | 179 | .panel-green > .panel-heading { 180 | border-color: #5cb85c; 181 | color: #fff; 182 | background-color: #5cb85c; 183 | } 184 | 185 | .panel-green > a { 186 | color: #5cb85c; 187 | } 188 | 189 | .panel-green > a:hover { 190 | color: #3d8b3d; 191 | } 192 | 193 | .panel-red { 194 | border-color: #d9534f; 195 | } 196 | 197 | .panel-red > .panel-heading { 198 | border-color: #d9534f; 199 | color: #fff; 200 | background-color: #d9534f; 201 | } 202 | 203 | .panel-red > a { 204 | color: #d9534f; 205 | } 206 | 207 | .panel-red > a:hover { 208 | color: #b52b27; 209 | } 210 | 211 | .panel-yellow { 212 | border-color: #f0ad4e; 213 | } 214 | 215 | .panel-yellow > .panel-heading { 216 | border-color: #f0ad4e; 217 | color: #fff; 218 | background-color: #f0ad4e; 219 | } 220 | 221 | .panel-yellow > a { 222 | color: #f0ad4e; 223 | } 224 | 225 | .panel-yellow > a:hover { 226 | color: #df8a13; 227 | } 228 | 229 | #error p {color: #ee1114; font-weight: bold;} 230 | .error p {color: #ee1114; font-weight: bold;} 231 | -------------------------------------------------------------------------------- /public/css/skel.css: -------------------------------------------------------------------------------- 1 | /* Resets (http://meyerweb.com/eric/tools/css/reset/ | v2.0 | 20110126 | License: none (public domain)) */ 2 | 3 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none} 4 | 5 | /* Box Model */ 6 | 7 | *, *:before, *:after { 8 | -moz-box-sizing: border-box; 9 | -webkit-box-sizing: border-box; 10 | box-sizing: border-box; 11 | } 12 | 13 | /* Container */ 14 | 15 | .container { 16 | margin-left: auto; 17 | margin-right: auto; 18 | 19 | /* width: (containers) */ 20 | width: 1200px; 21 | } 22 | 23 | /* Modifiers */ 24 | 25 | /* 125% */ 26 | .container.\31 25\25 { 27 | width: 100%; 28 | 29 | /* max-width: (containers * 1.25) */ 30 | max-width: 1500px; 31 | 32 | /* min-width: (containers) */ 33 | min-width: 1200px; 34 | } 35 | 36 | /* 75% */ 37 | .container.\37 5\25 { 38 | 39 | /* width: (containers * 0.75) */ 40 | width: 900px; 41 | 42 | } 43 | 44 | /* 50% */ 45 | .container.\35 0\25 { 46 | 47 | /* width: (containers * 0.50) */ 48 | width: 600px; 49 | 50 | } 51 | 52 | /* 25% */ 53 | .container.\32 5\25 { 54 | 55 | /* width: (containers * 0.25) */ 56 | width: 300px; 57 | 58 | } 59 | 60 | /* Grid */ 61 | 62 | .row { 63 | border-bottom: solid 1px transparent; 64 | } 65 | 66 | .row > * { 67 | float: left; 68 | } 69 | 70 | .row:after, .row:before { 71 | content: ''; 72 | display: block; 73 | clear: both; 74 | height: 0; 75 | } 76 | 77 | .row.uniform > * > :first-child { 78 | margin-top: 0; 79 | } 80 | 81 | .row.uniform > * > :last-child { 82 | margin-bottom: 0; 83 | } 84 | 85 | /* Gutters */ 86 | 87 | /* Normal */ 88 | 89 | .row > * { 90 | /* padding: (gutters.horizontal) 0 0 (gutters.vertical) */ 91 | padding: 40px 0 0 40px; 92 | } 93 | 94 | .row { 95 | /* margin: -(gutters.horizontal) 0 -1px -(gutters.vertical) */ 96 | margin: -40px 0 -1px -40px; 97 | } 98 | 99 | .row.uniform > * { 100 | /* padding: (gutters.vertical) 0 0 (gutters.vertical) */ 101 | padding: 40px 0 0 40px; 102 | } 103 | 104 | .row.uniform { 105 | /* margin: -(gutters.vertical) 0 -1px -(gutters.vertical) */ 106 | margin: -40px 0 -1px -40px; 107 | } 108 | 109 | /* 200% */ 110 | 111 | .row.\32 00\25 > * { 112 | /* padding: (gutters.horizontal) 0 0 (gutters.vertical) */ 113 | padding: 80px 0 0 80px; 114 | } 115 | 116 | .row.\32 00\25 { 117 | /* margin: -(gutters.horizontal) 0 -1px -(gutters.vertical) */ 118 | margin: -80px 0 -1px -80px; 119 | } 120 | 121 | .row.uniform.\32 00\25 > * { 122 | /* padding: (gutters.vertical) 0 0 (gutters.vertical) */ 123 | padding: 80px 0 0 80px; 124 | } 125 | 126 | .row.uniform.\32 00\25 { 127 | /* margin: -(gutters.vertical) 0 -1px -(gutters.vertical) */ 128 | margin: -80px 0 -1px -80px; 129 | } 130 | 131 | /* 150% */ 132 | 133 | .row.\31 50\25 > * { 134 | /* padding: (gutters.horizontal) 0 0 (gutters.vertical) */ 135 | padding: 60px 0 0 60px; 136 | } 137 | 138 | .row.\31 50\25 { 139 | /* margin: -(gutters.horizontal) 0 -1px -(gutters.vertical) */ 140 | margin: -60px 0 -1px -60px; 141 | } 142 | 143 | .row.uniform.\31 50\25 > * { 144 | /* padding: (gutters.vertical) 0 0 (gutters.vertical) */ 145 | padding: 60px 0 0 60px; 146 | } 147 | 148 | .row.uniform.\31 50\25 { 149 | /* margin: -(gutters.vertical) 0 -1px -(gutters.vertical) */ 150 | margin: -60px 0 -1px -60px; 151 | } 152 | 153 | /* 50% */ 154 | 155 | .row.\35 0\25 > * { 156 | /* padding: (gutters.horizontal) 0 0 (gutters.vertical) */ 157 | padding: 20px 0 0 20px; 158 | } 159 | 160 | .row.\35 0\25 { 161 | /* margin: -(gutters.horizontal) 0 -1px -(gutters.vertical) */ 162 | margin: -20px 0 -1px -20px; 163 | } 164 | 165 | .row.uniform.\35 0\25 > * { 166 | /* padding: (gutters.vertical) 0 0 (gutters.vertical) */ 167 | padding: 20px 0 0 20px; 168 | } 169 | 170 | .row.uniform.\35 0\25 { 171 | /* margin: -(gutters.vertical) 0 -1px -(gutters.vertical) */ 172 | margin: -20px 0 -1px -20px; 173 | } 174 | 175 | /* 25% */ 176 | 177 | .row.\32 5\25 > * { 178 | /* padding: (gutters.horizontal) 0 0 (gutters.vertical) */ 179 | padding: 10px 0 0 10px; 180 | } 181 | 182 | .row.\32 5\25 { 183 | /* margin: -(gutters.horizontal) 0 -1px -(gutters.vertical) */ 184 | margin: -10px 0 -1px -10px; 185 | } 186 | 187 | .row.uniform.\32 5\25 > * { 188 | /* padding: (gutters.vertical) 0 0 (gutters.vertical) */ 189 | padding: 10px 0 0 10px; 190 | } 191 | 192 | .row.uniform.\32 5\25 { 193 | /* margin: -(gutters.vertical) 0 -1px -(gutters.vertical) */ 194 | margin: -10px 0 -1px -10px; 195 | } 196 | 197 | /* 0% */ 198 | 199 | .row.\30 \25 > * { 200 | padding: 0; 201 | } 202 | 203 | .row.\30 \25 { 204 | margin: 0 0 -1px 0; 205 | } 206 | 207 | /* Cells */ 208 | 209 | .\31 2u, .\31 2u\24 { width: 100%; clear: none; margin-left: 0; } 210 | .\31 1u, .\31 1u\24 { width: 91.6666666667%; clear: none; margin-left: 0; } 211 | .\31 0u, .\31 0u\24 { width: 83.3333333333%; clear: none; margin-left: 0; } 212 | .\39 u, .\39 u\24 { width: 75%; clear: none; margin-left: 0; } 213 | .\38 u, .\38 u\24 { width: 66.6666666667%; clear: none; margin-left: 0; } 214 | .\37 u, .\37 u\24 { width: 58.3333333333%; clear: none; margin-left: 0; } 215 | .\36 u, .\36 u\24 { width: 50%; clear: none; margin-left: 0; } 216 | .\35 u, .\35 u\24 { width: 41.6666666667%; clear: none; margin-left: 0; } 217 | .\34 u, .\34 u\24 { width: 33.3333333333%; clear: none; margin-left: 0; } 218 | .\33 u, .\33 u\24 { width: 25%; clear: none; margin-left: 0; } 219 | .\32 u, .\32 u\24 { width: 16.6666666667%; clear: none; margin-left: 0; } 220 | .\31 u, .\31 u\24 { width: 8.3333333333%; clear: none; margin-left: 0; } 221 | 222 | .\31 2u\24 + *, 223 | .\31 1u\24 + *, 224 | .\31 0u\24 + *, 225 | .\39 u\24 + *, 226 | .\38 u\24 + *, 227 | .\37 u\24 + *, 228 | .\36 u\24 + *, 229 | .\35 u\24 + *, 230 | .\34 u\24 + *, 231 | .\33 u\24 + *, 232 | .\32 u\24 + *, 233 | .\31 u\24 + * { 234 | clear: left; 235 | } 236 | 237 | .\-11u { margin-left: 91.6666666667% } 238 | .\-10u { margin-left: 83.3333333333% } 239 | .\-9u { margin-left: 75% } 240 | .\-8u { margin-left: 66.6666666667% } 241 | .\-7u { margin-left: 58.3333333333% } 242 | .\-6u { margin-left: 50% } 243 | .\-5u { margin-left: 41.6666666667% } 244 | .\-4u { margin-left: 33.3333333333% } 245 | .\-3u { margin-left: 25% } 246 | .\-2u { margin-left: 16.6666666667% } 247 | .\-1u { margin-left: 8.3333333333% } -------------------------------------------------------------------------------- /public/css/style-1000px.css: -------------------------------------------------------------------------------- 1 | /* 2 | Strongly Typed by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body 12 | { 13 | min-width: 960px; 14 | } 15 | 16 | body,input,textarea,select 17 | { 18 | line-height: 1.75em; 19 | font-size: 12pt; 20 | } 21 | 22 | h2 23 | { 24 | margin: 0 0 1em 0; 25 | font-size: 1.5em; 26 | } 27 | 28 | h3 29 | { 30 | margin: 0 0 1em 0; 31 | } 32 | 33 | h2 br, h3 br, h4 br, h5 br, h6 br 34 | { 35 | display: none; 36 | } 37 | 38 | /* Image */ 39 | 40 | .image 41 | { 42 | } 43 | 44 | .image.featured 45 | { 46 | margin: 0 0 2.5em 0; 47 | } 48 | 49 | /*********************************************************************************/ 50 | /* Wrappers */ 51 | /*********************************************************************************/ 52 | 53 | #header-wrapper 54 | { 55 | } 56 | 57 | #features-wrapper 58 | { 59 | padding: 4em 0 4em 0; 60 | } 61 | 62 | #banner-wrapper 63 | { 64 | padding: 2em 0 2em 0; 65 | } 66 | 67 | #main-wrapper 68 | { 69 | padding: 4em 0 4em 0; 70 | } 71 | 72 | #footer-wrapper 73 | { 74 | padding: 4em 0 6em 0; 75 | } 76 | 77 | /*********************************************************************************/ 78 | /* Header */ 79 | /*********************************************************************************/ 80 | 81 | #header 82 | { 83 | padding: 4em 0 2em 0; 84 | } 85 | 86 | #header h1 87 | { 88 | font-size: 2em; 89 | } 90 | 91 | #header p 92 | { 93 | margin: 1.5em 0 0 0; 94 | } 95 | 96 | /*********************************************************************************/ 97 | /* Nav */ 98 | /*********************************************************************************/ 99 | 100 | #nav 101 | { 102 | } 103 | 104 | #nav > ul > li 105 | { 106 | padding-right: 1.25em; 107 | } 108 | 109 | /*********************************************************************************/ 110 | /* Banner */ 111 | /*********************************************************************************/ 112 | 113 | #banner 114 | { 115 | padding: 7em 0 7em 0; 116 | } 117 | 118 | /*********************************************************************************/ 119 | /* Copyright */ 120 | /*********************************************************************************/ 121 | 122 | #copyright 123 | { 124 | margin-top: 5em; 125 | padding-top: 2em; 126 | } -------------------------------------------------------------------------------- /public/css/style-desktop.css: -------------------------------------------------------------------------------- 1 | /* 2 | Strongly Typed by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body,input,textarea,select 12 | { 13 | line-height: 1.65em; 14 | font-size: 13pt; 15 | } 16 | 17 | h2 18 | { 19 | font-size: 1.65em; 20 | font-weight: 400; 21 | letter-spacing: 4px; 22 | margin: 0 0 1.5em 0; 23 | line-height: 1.75em; 24 | } 25 | 26 | h3 27 | { 28 | font-size: 1em; 29 | letter-spacing: 2px; 30 | margin: 0 0 1.25em 0; 31 | } 32 | 33 | /* Table */ 34 | 35 | table 36 | { 37 | } 38 | 39 | table.default 40 | { 41 | } 42 | 43 | table.default thead 44 | { 45 | font-size: 0.85em; 46 | letter-spacing: 2px; 47 | } 48 | 49 | /* Button */ 50 | 51 | input[type="button"], 52 | input[type="submit"], 53 | input[type="reset"], 54 | .button 55 | { 56 | font-size: 0.85em; 57 | letter-spacing: 2px; 58 | padding: 0.85em 2.75em 0.85em 2.75em; 59 | } 60 | 61 | /* List */ 62 | 63 | ul.actions 64 | { 65 | } 66 | 67 | ul.actions li 68 | { 69 | display: inline-block; 70 | margin-left: 1em; 71 | } 72 | 73 | ul.actions li:first-child 74 | { 75 | margin-left: 0; 76 | } 77 | 78 | ul.divided 79 | { 80 | } 81 | 82 | ul.divided li 83 | { 84 | margin: 2.5em 0 0 0; 85 | padding: 2.5em 0 0 0; 86 | } 87 | 88 | /* Box */ 89 | 90 | .box 91 | { 92 | } 93 | 94 | .box.post 95 | { 96 | } 97 | 98 | .no-sidebar .box.post > header 99 | { 100 | text-align: center; 101 | } 102 | 103 | .box.excerpt 104 | { 105 | } 106 | 107 | .box.excerpt .date 108 | { 109 | display: inline-block; 110 | font-size: 0.85em; 111 | letter-spacing: 2px; 112 | padding: 0.25em 1em 0.25em 1em; 113 | margin: 0 0 2.5em 0; 114 | } 115 | 116 | /*********************************************************************************/ 117 | /* Wrappers */ 118 | /*********************************************************************************/ 119 | 120 | #header-wrapper 121 | { 122 | } 123 | 124 | #features-wrapper 125 | { 126 | padding: 6em 0 6em 0; 127 | } 128 | 129 | #banner-wrapper 130 | { 131 | padding: 3em 0 3em 0; 132 | } 133 | 134 | #main-wrapper 135 | { 136 | padding: 6em 0 6em 0; 137 | } 138 | 139 | #footer-wrapper 140 | { 141 | padding: 6em 0 8em 0; 142 | } 143 | 144 | /*********************************************************************************/ 145 | /* Header */ 146 | /*********************************************************************************/ 147 | 148 | #header 149 | { 150 | padding: 5em 0 2em 0; 151 | } 152 | 153 | #header h1 154 | { 155 | font-size: 3em; 156 | letter-spacing: 13px; 157 | } 158 | 159 | #header p 160 | { 161 | margin: 2.5em 0 0 0; 162 | font-size: 0.85em; 163 | letter-spacing: 3px; 164 | } 165 | 166 | /*********************************************************************************/ 167 | /* Nav */ 168 | /*********************************************************************************/ 169 | 170 | #nav 171 | { 172 | position: absolute; 173 | top: 3em; 174 | left: 0; 175 | width: 100%; 176 | } 177 | 178 | #nav > ul > li 179 | { 180 | display: inline-block; 181 | padding-right: 2em; 182 | } 183 | 184 | #nav > ul > li:last-child 185 | { 186 | padding-right: 0; 187 | } 188 | 189 | #nav > ul > li > a 190 | { 191 | display: block; 192 | } 193 | 194 | #nav > ul > li > a > span 195 | { 196 | font-size: 0.85em; 197 | letter-spacing: 3px; 198 | } 199 | 200 | #nav > ul > li > ul 201 | { 202 | display: none; 203 | } 204 | 205 | .dropotron 206 | { 207 | text-align: left; 208 | border: solid 1px #e5e5e5; 209 | border-radius: 4px; 210 | background: #fff; 211 | background: rgba(255,255,255,0.965); 212 | box-shadow: 0px 2px 2px 0px rgba(0,0,0,0.1); 213 | padding: 0.75em 0 0.5em 0; 214 | min-width: 12em; 215 | margin-top: -moz-calc(-0.5em + 1px); 216 | margin-top: -webkit-calc(-0.5em + 1px); 217 | margin-top: -o-calc(-0.5em + 1px); 218 | margin-top: -ms-calc(-0.5em + 1px); 219 | margin-top: calc(-0.5em + 1px); 220 | margin-left: -2px; 221 | } 222 | 223 | .dropotron.level-0 224 | { 225 | margin-top: 1.5em; 226 | margin-left: -1em; 227 | } 228 | 229 | .dropotron.level-0:after 230 | { 231 | content: ''; 232 | display: block; 233 | position: absolute; 234 | left: 1.25em; 235 | top: -moz-calc(-0.75em + 1px); 236 | top: -webkit-calc(-0.75em + 1px); 237 | top: -o-calc(-0.75em + 1px); 238 | top: -ms-calc(-0.75em + 1px); 239 | top: calc(-0.75em + 1px); 240 | border-left: solid 0.75em rgba(255,255,255,0); 241 | border-right: solid 0.75em rgba(255,255,255,0); 242 | border-bottom: solid 0.75em #fff; 243 | } 244 | 245 | .dropotron.level-0:before 246 | { 247 | content: ''; 248 | display: block; 249 | position: absolute; 250 | left: 1.25em; 251 | top: -0.75em; 252 | border-left: solid 0.75em rgba(255,255,255,0); 253 | border-right: solid 0.75em rgba(255,255,255,0); 254 | border-bottom: solid 0.75em #ccc; 255 | } 256 | 257 | .dropotron span, 258 | .dropotron a 259 | { 260 | display: block; 261 | padding: 0.3em 1em 0.3em 1em; 262 | border: 0; 263 | border-top: solid 1px #f0f0f0; 264 | outline: 0; 265 | } 266 | 267 | .dropotron li:first-child > span, 268 | .dropotron li:first-child > a 269 | { 270 | border-top: 0; 271 | padding-top: 0; 272 | } 273 | 274 | .dropotron li:hover > span, 275 | .dropotron li:hover > a 276 | { 277 | color: #ed786a; 278 | -moz-transition: color 0.25s ease-in-out, border-bottom-color 0.25s ease-in-out; 279 | -webkit-transition: color 0.25s ease-in-out, border-bottom-color 0.25s ease-in-out; 280 | -o-transition: color 0.25s ease-in-out, border-bottom-color 0.25s ease-in-out; 281 | -ms-transition: color 0.25s ease-in-out, border-bottom-color 0.25s ease-in-out; 282 | transition: color 0.25s ease-in-out, border-bottom-color 0.25s ease-in-out; 283 | } 284 | 285 | /*********************************************************************************/ 286 | /* Banner */ 287 | /*********************************************************************************/ 288 | 289 | #banner 290 | { 291 | padding: 10em 0 10em 0; 292 | } 293 | 294 | #banner p 295 | { 296 | font-size: 2em; 297 | line-height: 1.5em; 298 | letter-spacing: 4px; 299 | } 300 | 301 | #banner:before, 302 | #banner:after 303 | { 304 | content: ''; 305 | display: block; 306 | position: absolute; 307 | top: 50%; 308 | width: 35px; 309 | height: 141px; 310 | margin-top: -70px; 311 | background: url('images/bracket.svg'); 312 | opacity: 0.15; 313 | } 314 | 315 | #banner:before 316 | { 317 | left: 0; 318 | } 319 | 320 | #banner:after 321 | { 322 | right: 0; 323 | -moz-transform: scaleX(-1); 324 | -webkit-transform: scaleX(-1); 325 | -o-transform: scaleX(-1); 326 | -ms-transform: scaleX(-1); 327 | transform: scaleX(-1); 328 | } 329 | 330 | /*********************************************************************************/ 331 | /* Content */ 332 | /*********************************************************************************/ 333 | 334 | #content 335 | { 336 | } 337 | 338 | #content > section, 339 | #content > article 340 | { 341 | margin: 5em 0 0 0; 342 | padding: 5em 0 0 0; 343 | } 344 | 345 | #content > section:first-child, 346 | #content > article:first-child 347 | { 348 | margin: 0; 349 | padding: 0; 350 | } 351 | 352 | /*********************************************************************************/ 353 | /* Sidebar */ 354 | /*********************************************************************************/ 355 | 356 | #sidebar 357 | { 358 | } 359 | 360 | #sidebar > section, 361 | #sidebar > article 362 | { 363 | margin: 5em 0 0 0; 364 | padding: 5em 0 0 0; 365 | } 366 | 367 | #sidebar > section:first-child, 368 | #sidebar > article:first-child 369 | { 370 | margin: 0; 371 | padding: 0; 372 | } 373 | 374 | /*********************************************************************************/ 375 | /* Copyright */ 376 | /*********************************************************************************/ 377 | 378 | #copyright 379 | { 380 | margin-top: 6em; 381 | padding-top: 4em; 382 | } -------------------------------------------------------------------------------- /public/css/style-mobile.css: -------------------------------------------------------------------------------- 1 | /* 2 | Strongly Typed by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body,input,textarea,select 12 | { 13 | line-height: 1.75em; 14 | font-size: 11pt; 15 | letter-spacing: 0; 16 | } 17 | 18 | body 19 | { 20 | } 21 | 22 | h2, h3, h4, h5, h6 23 | { 24 | font-size: 1.2em; 25 | letter-spacing: 2px; 26 | text-align: center; 27 | margin: 0 0 1.5em 0; 28 | } 29 | 30 | h2 br, h3 br, h4 br, h5 br, h6 br 31 | { 32 | display: none; 33 | } 34 | 35 | /* Sections/Article */ 36 | 37 | section, 38 | article 39 | { 40 | clear: both; 41 | margin: 2em 0 2em 0 !important; 42 | } 43 | 44 | section > :first-child, 45 | article > :first-child 46 | { 47 | margin-top: 0 !important; 48 | } 49 | 50 | section:first-child, 51 | article:first-child 52 | { 53 | margin-top: 0 !important; 54 | } 55 | 56 | /* Image */ 57 | 58 | .image 59 | { 60 | } 61 | 62 | .image.left 63 | { 64 | width: 40%; 65 | } 66 | 67 | .image.featured 68 | { 69 | margin: 0 0 2em 0; 70 | } 71 | 72 | /* Button */ 73 | 74 | input[type="button"], 75 | input[type="submit"], 76 | input[type="reset"], 77 | .button 78 | { 79 | letter-spacing: 2px; 80 | display: block; 81 | padding: 1em 0 1em 0; 82 | } 83 | 84 | /* List */ 85 | 86 | ul.links 87 | { 88 | } 89 | 90 | ul.links li 91 | { 92 | display: block; 93 | border: 0; 94 | padding: 0.25em 0 0 0; 95 | margin: 0; 96 | } 97 | 98 | ul.divided 99 | { 100 | } 101 | 102 | ul.divided li 103 | { 104 | margin: 2.75em 0 0 0; 105 | padding: 2.75em 0 0 0; 106 | } 107 | 108 | ul.icons 109 | { 110 | padding: 0 !important; 111 | margin: 0 0 0.5em 0 !important; 112 | } 113 | 114 | /* Box */ 115 | 116 | .box 117 | { 118 | } 119 | 120 | .box.excerpt 121 | { 122 | } 123 | 124 | .box-excerpt .date 125 | { 126 | display: block; 127 | letter-spacing: 2px; 128 | padding: 0.25em 1em 0.25em 1em; 129 | margin: 0 auto 2.5em auto; 130 | text-align: center; 131 | } 132 | 133 | /*********************************************************************************/ 134 | /* UI */ 135 | /*********************************************************************************/ 136 | 137 | #titleBar 138 | { 139 | } 140 | 141 | #titleBar .toggle 142 | { 143 | position: absolute; 144 | left: 0; 145 | top: 0; 146 | width: 80px; 147 | height: 60px; 148 | } 149 | 150 | #titleBar .toggle:before 151 | { 152 | display: inline-block; 153 | font-family: FontAwesome; 154 | text-decoration: none; 155 | font-style: normal; 156 | font-weight: normal; 157 | -webkit-font-smoothing:antialiased; 158 | -moz-osx-font-smoothing:grayscale; 159 | 160 | content: '\f0c9'; 161 | display: block; 162 | width: 60px; 163 | height: 40px; 164 | background: rgba(232,232,232,0.9); 165 | border-radius: 4px; 166 | position: absolute; 167 | left: 5px; 168 | top: 5px; 169 | box-shadow: 0.125em 0.125em 0 0 rgba(0,0,0,0.15); 170 | text-align: center; 171 | line-height: 40px; 172 | font-size: 18px; 173 | color: #aaa; 174 | } 175 | 176 | #titleBar .toggle:active:before 177 | { 178 | opacity: 0.5; 179 | } 180 | 181 | #navPanel 182 | { 183 | background: #444; 184 | border-right: solid 2px #3c3c3c; 185 | font-weight: 400; 186 | text-transform: uppercase; 187 | color: #888; 188 | letter-spacing: 2px; 189 | font-size: 0.85em; 190 | } 191 | 192 | #navPanel .link 193 | { 194 | display: block; 195 | color: #ddd; 196 | text-decoration: none; 197 | height: 44px; 198 | line-height: 44px; 199 | border: 0; 200 | border-top: solid 1px #3c3c3c; 201 | padding: 0 1em 0 1em; 202 | } 203 | 204 | #navPanel .link:first-child 205 | { 206 | border-top: 0; 207 | } 208 | 209 | #navPanel .link.depth-0 210 | { 211 | font-weight: 600; 212 | color: #fff; 213 | } 214 | 215 | #navPanel .indent-1 { display: inline-block; width: 1em; } 216 | #navPanel .indent-2 { display: inline-block; width: 2em; } 217 | #navPanel .indent-3 { display: inline-block; width: 3em; } 218 | #navPanel .indent-4 { display: inline-block; width: 4em; } 219 | #navPanel .indent-5 { display: inline-block; width: 5em; } 220 | #navPanel .depth-0 { color: #fff; } 221 | 222 | /*********************************************************************************/ 223 | /* Wrappers */ 224 | /*********************************************************************************/ 225 | 226 | #header-wrapper 227 | { 228 | padding: 0 20px 0 20px; 229 | } 230 | 231 | #features-wrapper 232 | { 233 | padding: 3em 20px 3em 20px; 234 | } 235 | 236 | #banner-wrapper 237 | { 238 | padding: 2em 0 2em 0; 239 | } 240 | 241 | #main-wrapper 242 | { 243 | padding: 3em 20px 3em 20px; 244 | } 245 | 246 | #footer-wrapper 247 | { 248 | padding: 4em 20px 3em 20px; 249 | } 250 | 251 | /*********************************************************************************/ 252 | /* Header */ 253 | /*********************************************************************************/ 254 | 255 | #header 256 | { 257 | padding: 1em 0 1em 0; 258 | } 259 | 260 | #header h1 261 | { 262 | font-size: 2em; 263 | letter-spacing: 8px; 264 | line-height: 1.25em; 265 | } 266 | 267 | #header p 268 | { 269 | margin: 1.25em 0 0 0; 270 | letter-spacing: 2px; 271 | } 272 | 273 | /*********************************************************************************/ 274 | /* Nav */ 275 | /*********************************************************************************/ 276 | 277 | #nav 278 | { 279 | display: none; 280 | } 281 | 282 | /*********************************************************************************/ 283 | /* Banner */ 284 | /*********************************************************************************/ 285 | 286 | #banner 287 | { 288 | padding: 5em 20px 5em 20px; 289 | margin: 0 !important; 290 | } 291 | 292 | #banner p 293 | { 294 | font-size: 1.75em; 295 | line-height: 1.25em; 296 | letter-spacing: 3px; 297 | } 298 | 299 | #banner p br 300 | { 301 | display: none; 302 | } 303 | 304 | /*********************************************************************************/ 305 | /* Content */ 306 | /*********************************************************************************/ 307 | 308 | #content 309 | { 310 | } 311 | 312 | #content > section, 313 | #content > article 314 | { 315 | margin: 4em 0 0 0 !important; 316 | padding: 4em 0 0 0 !important; 317 | } 318 | 319 | #content > section:first-child, 320 | #content > article:first-child 321 | { 322 | margin: 0 !important; 323 | padding: 0 !important; 324 | } 325 | 326 | /*********************************************************************************/ 327 | /* Sidebar */ 328 | /*********************************************************************************/ 329 | 330 | #sidebar 331 | { 332 | border-top: solid 2px #e5e5e5; 333 | box-shadow: inset 0px 8px 0px 0px #fff, inset 0px 10px 0px 0px #e5e5e5; 334 | margin-top: 4em !important; 335 | padding-top: 4em !important; 336 | } 337 | 338 | #sidebar > section, 339 | #sidebar > article 340 | { 341 | margin: 4em 0 0 0 !important; 342 | padding: 4em 0 0 0 !important; 343 | } 344 | 345 | #sidebar > section:first-child, 346 | #sidebar > article:first-child 347 | { 348 | margin: 0 !important; 349 | padding: 0 !important; 350 | } 351 | 352 | /*********************************************************************************/ 353 | /* Footer */ 354 | /*********************************************************************************/ 355 | 356 | #footer 357 | { 358 | } 359 | 360 | #footer .icons 361 | { 362 | margin: 0 0 2em 0 !important; 363 | } 364 | 365 | #footer .icons:last-child 366 | { 367 | margin-bottom: 0; 368 | } 369 | 370 | /*********************************************************************************/ 371 | /* Copyright */ 372 | /*********************************************************************************/ 373 | 374 | #copyright 375 | { 376 | margin-top: 2em; 377 | padding-top: 2em; 378 | } -------------------------------------------------------------------------------- /public/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .@{fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /public/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /public/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "spinning.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | -------------------------------------------------------------------------------- /public/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | .fa-icon-rotate(@degrees, @rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 15 | -webkit-transform: rotate(@degrees); 16 | -ms-transform: rotate(@degrees); 17 | transform: rotate(@degrees); 18 | } 19 | 20 | .fa-icon-flip(@horiz, @vert, @rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 22 | -webkit-transform: scale(@horiz, @vert); 23 | -ms-transform: scale(@horiz, @vert); 24 | transform: scale(@horiz, @vert); 25 | } 26 | -------------------------------------------------------------------------------- /public/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /public/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/font-awesome/less/spinning.less: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/font-awesome/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @fa-font-path: "../fonts"; 5 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly 6 | @fa-css-prefix: fa; 7 | @fa-version: "4.2.0"; 8 | @fa-border-color: #eee; 9 | @fa-inverse: #fff; 10 | @fa-li-width: (30em / 14); 11 | 12 | @fa-var-adjust: "\f042"; 13 | @fa-var-adn: "\f170"; 14 | @fa-var-align-center: "\f037"; 15 | @fa-var-align-justify: "\f039"; 16 | @fa-var-align-left: "\f036"; 17 | @fa-var-align-right: "\f038"; 18 | @fa-var-ambulance: "\f0f9"; 19 | @fa-var-anchor: "\f13d"; 20 | @fa-var-android: "\f17b"; 21 | @fa-var-angellist: "\f209"; 22 | @fa-var-angle-double-down: "\f103"; 23 | @fa-var-angle-double-left: "\f100"; 24 | @fa-var-angle-double-right: "\f101"; 25 | @fa-var-angle-double-up: "\f102"; 26 | @fa-var-angle-down: "\f107"; 27 | @fa-var-angle-left: "\f104"; 28 | @fa-var-angle-right: "\f105"; 29 | @fa-var-angle-up: "\f106"; 30 | @fa-var-apple: "\f179"; 31 | @fa-var-archive: "\f187"; 32 | @fa-var-area-chart: "\f1fe"; 33 | @fa-var-arrow-circle-down: "\f0ab"; 34 | @fa-var-arrow-circle-left: "\f0a8"; 35 | @fa-var-arrow-circle-o-down: "\f01a"; 36 | @fa-var-arrow-circle-o-left: "\f190"; 37 | @fa-var-arrow-circle-o-right: "\f18e"; 38 | @fa-var-arrow-circle-o-up: "\f01b"; 39 | @fa-var-arrow-circle-right: "\f0a9"; 40 | @fa-var-arrow-circle-up: "\f0aa"; 41 | @fa-var-arrow-down: "\f063"; 42 | @fa-var-arrow-left: "\f060"; 43 | @fa-var-arrow-right: "\f061"; 44 | @fa-var-arrow-up: "\f062"; 45 | @fa-var-arrows: "\f047"; 46 | @fa-var-arrows-alt: "\f0b2"; 47 | @fa-var-arrows-h: "\f07e"; 48 | @fa-var-arrows-v: "\f07d"; 49 | @fa-var-asterisk: "\f069"; 50 | @fa-var-at: "\f1fa"; 51 | @fa-var-automobile: "\f1b9"; 52 | @fa-var-backward: "\f04a"; 53 | @fa-var-ban: "\f05e"; 54 | @fa-var-bank: "\f19c"; 55 | @fa-var-bar-chart: "\f080"; 56 | @fa-var-bar-chart-o: "\f080"; 57 | @fa-var-barcode: "\f02a"; 58 | @fa-var-bars: "\f0c9"; 59 | @fa-var-beer: "\f0fc"; 60 | @fa-var-behance: "\f1b4"; 61 | @fa-var-behance-square: "\f1b5"; 62 | @fa-var-bell: "\f0f3"; 63 | @fa-var-bell-o: "\f0a2"; 64 | @fa-var-bell-slash: "\f1f6"; 65 | @fa-var-bell-slash-o: "\f1f7"; 66 | @fa-var-bicycle: "\f206"; 67 | @fa-var-binoculars: "\f1e5"; 68 | @fa-var-birthday-cake: "\f1fd"; 69 | @fa-var-bitbucket: "\f171"; 70 | @fa-var-bitbucket-square: "\f172"; 71 | @fa-var-bitcoin: "\f15a"; 72 | @fa-var-bold: "\f032"; 73 | @fa-var-bolt: "\f0e7"; 74 | @fa-var-bomb: "\f1e2"; 75 | @fa-var-book: "\f02d"; 76 | @fa-var-bookmark: "\f02e"; 77 | @fa-var-bookmark-o: "\f097"; 78 | @fa-var-briefcase: "\f0b1"; 79 | @fa-var-btc: "\f15a"; 80 | @fa-var-bug: "\f188"; 81 | @fa-var-building: "\f1ad"; 82 | @fa-var-building-o: "\f0f7"; 83 | @fa-var-bullhorn: "\f0a1"; 84 | @fa-var-bullseye: "\f140"; 85 | @fa-var-bus: "\f207"; 86 | @fa-var-cab: "\f1ba"; 87 | @fa-var-calculator: "\f1ec"; 88 | @fa-var-calendar: "\f073"; 89 | @fa-var-calendar-o: "\f133"; 90 | @fa-var-camera: "\f030"; 91 | @fa-var-camera-retro: "\f083"; 92 | @fa-var-car: "\f1b9"; 93 | @fa-var-caret-down: "\f0d7"; 94 | @fa-var-caret-left: "\f0d9"; 95 | @fa-var-caret-right: "\f0da"; 96 | @fa-var-caret-square-o-down: "\f150"; 97 | @fa-var-caret-square-o-left: "\f191"; 98 | @fa-var-caret-square-o-right: "\f152"; 99 | @fa-var-caret-square-o-up: "\f151"; 100 | @fa-var-caret-up: "\f0d8"; 101 | @fa-var-cc: "\f20a"; 102 | @fa-var-cc-amex: "\f1f3"; 103 | @fa-var-cc-discover: "\f1f2"; 104 | @fa-var-cc-mastercard: "\f1f1"; 105 | @fa-var-cc-paypal: "\f1f4"; 106 | @fa-var-cc-stripe: "\f1f5"; 107 | @fa-var-cc-visa: "\f1f0"; 108 | @fa-var-certificate: "\f0a3"; 109 | @fa-var-chain: "\f0c1"; 110 | @fa-var-chain-broken: "\f127"; 111 | @fa-var-check: "\f00c"; 112 | @fa-var-check-circle: "\f058"; 113 | @fa-var-check-circle-o: "\f05d"; 114 | @fa-var-check-square: "\f14a"; 115 | @fa-var-check-square-o: "\f046"; 116 | @fa-var-chevron-circle-down: "\f13a"; 117 | @fa-var-chevron-circle-left: "\f137"; 118 | @fa-var-chevron-circle-right: "\f138"; 119 | @fa-var-chevron-circle-up: "\f139"; 120 | @fa-var-chevron-down: "\f078"; 121 | @fa-var-chevron-left: "\f053"; 122 | @fa-var-chevron-right: "\f054"; 123 | @fa-var-chevron-up: "\f077"; 124 | @fa-var-child: "\f1ae"; 125 | @fa-var-circle: "\f111"; 126 | @fa-var-circle-o: "\f10c"; 127 | @fa-var-circle-o-notch: "\f1ce"; 128 | @fa-var-circle-thin: "\f1db"; 129 | @fa-var-clipboard: "\f0ea"; 130 | @fa-var-clock-o: "\f017"; 131 | @fa-var-close: "\f00d"; 132 | @fa-var-cloud: "\f0c2"; 133 | @fa-var-cloud-download: "\f0ed"; 134 | @fa-var-cloud-upload: "\f0ee"; 135 | @fa-var-cny: "\f157"; 136 | @fa-var-code: "\f121"; 137 | @fa-var-code-fork: "\f126"; 138 | @fa-var-codepen: "\f1cb"; 139 | @fa-var-coffee: "\f0f4"; 140 | @fa-var-cog: "\f013"; 141 | @fa-var-cogs: "\f085"; 142 | @fa-var-columns: "\f0db"; 143 | @fa-var-comment: "\f075"; 144 | @fa-var-comment-o: "\f0e5"; 145 | @fa-var-comments: "\f086"; 146 | @fa-var-comments-o: "\f0e6"; 147 | @fa-var-compass: "\f14e"; 148 | @fa-var-compress: "\f066"; 149 | @fa-var-copy: "\f0c5"; 150 | @fa-var-copyright: "\f1f9"; 151 | @fa-var-credit-card: "\f09d"; 152 | @fa-var-crop: "\f125"; 153 | @fa-var-crosshairs: "\f05b"; 154 | @fa-var-css3: "\f13c"; 155 | @fa-var-cube: "\f1b2"; 156 | @fa-var-cubes: "\f1b3"; 157 | @fa-var-cut: "\f0c4"; 158 | @fa-var-cutlery: "\f0f5"; 159 | @fa-var-dashboard: "\f0e4"; 160 | @fa-var-database: "\f1c0"; 161 | @fa-var-dedent: "\f03b"; 162 | @fa-var-delicious: "\f1a5"; 163 | @fa-var-desktop: "\f108"; 164 | @fa-var-deviantart: "\f1bd"; 165 | @fa-var-digg: "\f1a6"; 166 | @fa-var-dollar: "\f155"; 167 | @fa-var-dot-circle-o: "\f192"; 168 | @fa-var-download: "\f019"; 169 | @fa-var-dribbble: "\f17d"; 170 | @fa-var-dropbox: "\f16b"; 171 | @fa-var-drupal: "\f1a9"; 172 | @fa-var-edit: "\f044"; 173 | @fa-var-eject: "\f052"; 174 | @fa-var-ellipsis-h: "\f141"; 175 | @fa-var-ellipsis-v: "\f142"; 176 | @fa-var-empire: "\f1d1"; 177 | @fa-var-envelope: "\f0e0"; 178 | @fa-var-envelope-o: "\f003"; 179 | @fa-var-envelope-square: "\f199"; 180 | @fa-var-eraser: "\f12d"; 181 | @fa-var-eur: "\f153"; 182 | @fa-var-euro: "\f153"; 183 | @fa-var-exchange: "\f0ec"; 184 | @fa-var-exclamation: "\f12a"; 185 | @fa-var-exclamation-circle: "\f06a"; 186 | @fa-var-exclamation-triangle: "\f071"; 187 | @fa-var-expand: "\f065"; 188 | @fa-var-external-link: "\f08e"; 189 | @fa-var-external-link-square: "\f14c"; 190 | @fa-var-eye: "\f06e"; 191 | @fa-var-eye-slash: "\f070"; 192 | @fa-var-eyedropper: "\f1fb"; 193 | @fa-var-facebook: "\f09a"; 194 | @fa-var-facebook-square: "\f082"; 195 | @fa-var-fast-backward: "\f049"; 196 | @fa-var-fast-forward: "\f050"; 197 | @fa-var-fax: "\f1ac"; 198 | @fa-var-female: "\f182"; 199 | @fa-var-fighter-jet: "\f0fb"; 200 | @fa-var-file: "\f15b"; 201 | @fa-var-file-archive-o: "\f1c6"; 202 | @fa-var-file-audio-o: "\f1c7"; 203 | @fa-var-file-code-o: "\f1c9"; 204 | @fa-var-file-excel-o: "\f1c3"; 205 | @fa-var-file-image-o: "\f1c5"; 206 | @fa-var-file-movie-o: "\f1c8"; 207 | @fa-var-file-o: "\f016"; 208 | @fa-var-file-pdf-o: "\f1c1"; 209 | @fa-var-file-photo-o: "\f1c5"; 210 | @fa-var-file-picture-o: "\f1c5"; 211 | @fa-var-file-powerpoint-o: "\f1c4"; 212 | @fa-var-file-sound-o: "\f1c7"; 213 | @fa-var-file-text: "\f15c"; 214 | @fa-var-file-text-o: "\f0f6"; 215 | @fa-var-file-video-o: "\f1c8"; 216 | @fa-var-file-word-o: "\f1c2"; 217 | @fa-var-file-zip-o: "\f1c6"; 218 | @fa-var-files-o: "\f0c5"; 219 | @fa-var-film: "\f008"; 220 | @fa-var-filter: "\f0b0"; 221 | @fa-var-fire: "\f06d"; 222 | @fa-var-fire-extinguisher: "\f134"; 223 | @fa-var-flag: "\f024"; 224 | @fa-var-flag-checkered: "\f11e"; 225 | @fa-var-flag-o: "\f11d"; 226 | @fa-var-flash: "\f0e7"; 227 | @fa-var-flask: "\f0c3"; 228 | @fa-var-flickr: "\f16e"; 229 | @fa-var-floppy-o: "\f0c7"; 230 | @fa-var-folder: "\f07b"; 231 | @fa-var-folder-o: "\f114"; 232 | @fa-var-folder-open: "\f07c"; 233 | @fa-var-folder-open-o: "\f115"; 234 | @fa-var-font: "\f031"; 235 | @fa-var-forward: "\f04e"; 236 | @fa-var-foursquare: "\f180"; 237 | @fa-var-frown-o: "\f119"; 238 | @fa-var-futbol-o: "\f1e3"; 239 | @fa-var-gamepad: "\f11b"; 240 | @fa-var-gavel: "\f0e3"; 241 | @fa-var-gbp: "\f154"; 242 | @fa-var-ge: "\f1d1"; 243 | @fa-var-gear: "\f013"; 244 | @fa-var-gears: "\f085"; 245 | @fa-var-gift: "\f06b"; 246 | @fa-var-git: "\f1d3"; 247 | @fa-var-git-square: "\f1d2"; 248 | @fa-var-github: "\f09b"; 249 | @fa-var-github-alt: "\f113"; 250 | @fa-var-github-square: "\f092"; 251 | @fa-var-gittip: "\f184"; 252 | @fa-var-glass: "\f000"; 253 | @fa-var-globe: "\f0ac"; 254 | @fa-var-google: "\f1a0"; 255 | @fa-var-google-plus: "\f0d5"; 256 | @fa-var-google-plus-square: "\f0d4"; 257 | @fa-var-google-wallet: "\f1ee"; 258 | @fa-var-graduation-cap: "\f19d"; 259 | @fa-var-group: "\f0c0"; 260 | @fa-var-h-square: "\f0fd"; 261 | @fa-var-hacker-news: "\f1d4"; 262 | @fa-var-hand-o-down: "\f0a7"; 263 | @fa-var-hand-o-left: "\f0a5"; 264 | @fa-var-hand-o-right: "\f0a4"; 265 | @fa-var-hand-o-up: "\f0a6"; 266 | @fa-var-hdd-o: "\f0a0"; 267 | @fa-var-header: "\f1dc"; 268 | @fa-var-headphones: "\f025"; 269 | @fa-var-heart: "\f004"; 270 | @fa-var-heart-o: "\f08a"; 271 | @fa-var-history: "\f1da"; 272 | @fa-var-home: "\f015"; 273 | @fa-var-hospital-o: "\f0f8"; 274 | @fa-var-html5: "\f13b"; 275 | @fa-var-ils: "\f20b"; 276 | @fa-var-image: "\f03e"; 277 | @fa-var-inbox: "\f01c"; 278 | @fa-var-indent: "\f03c"; 279 | @fa-var-info: "\f129"; 280 | @fa-var-info-circle: "\f05a"; 281 | @fa-var-inr: "\f156"; 282 | @fa-var-instagram: "\f16d"; 283 | @fa-var-institution: "\f19c"; 284 | @fa-var-ioxhost: "\f208"; 285 | @fa-var-italic: "\f033"; 286 | @fa-var-joomla: "\f1aa"; 287 | @fa-var-jpy: "\f157"; 288 | @fa-var-jsfiddle: "\f1cc"; 289 | @fa-var-key: "\f084"; 290 | @fa-var-keyboard-o: "\f11c"; 291 | @fa-var-krw: "\f159"; 292 | @fa-var-language: "\f1ab"; 293 | @fa-var-laptop: "\f109"; 294 | @fa-var-lastfm: "\f202"; 295 | @fa-var-lastfm-square: "\f203"; 296 | @fa-var-leaf: "\f06c"; 297 | @fa-var-legal: "\f0e3"; 298 | @fa-var-lemon-o: "\f094"; 299 | @fa-var-level-down: "\f149"; 300 | @fa-var-level-up: "\f148"; 301 | @fa-var-life-bouy: "\f1cd"; 302 | @fa-var-life-buoy: "\f1cd"; 303 | @fa-var-life-ring: "\f1cd"; 304 | @fa-var-life-saver: "\f1cd"; 305 | @fa-var-lightbulb-o: "\f0eb"; 306 | @fa-var-line-chart: "\f201"; 307 | @fa-var-link: "\f0c1"; 308 | @fa-var-linkedin: "\f0e1"; 309 | @fa-var-linkedin-square: "\f08c"; 310 | @fa-var-linux: "\f17c"; 311 | @fa-var-list: "\f03a"; 312 | @fa-var-list-alt: "\f022"; 313 | @fa-var-list-ol: "\f0cb"; 314 | @fa-var-list-ul: "\f0ca"; 315 | @fa-var-location-arrow: "\f124"; 316 | @fa-var-lock: "\f023"; 317 | @fa-var-long-arrow-down: "\f175"; 318 | @fa-var-long-arrow-left: "\f177"; 319 | @fa-var-long-arrow-right: "\f178"; 320 | @fa-var-long-arrow-up: "\f176"; 321 | @fa-var-magic: "\f0d0"; 322 | @fa-var-magnet: "\f076"; 323 | @fa-var-mail-forward: "\f064"; 324 | @fa-var-mail-reply: "\f112"; 325 | @fa-var-mail-reply-all: "\f122"; 326 | @fa-var-male: "\f183"; 327 | @fa-var-map-marker: "\f041"; 328 | @fa-var-maxcdn: "\f136"; 329 | @fa-var-meanpath: "\f20c"; 330 | @fa-var-medkit: "\f0fa"; 331 | @fa-var-meh-o: "\f11a"; 332 | @fa-var-microphone: "\f130"; 333 | @fa-var-microphone-slash: "\f131"; 334 | @fa-var-minus: "\f068"; 335 | @fa-var-minus-circle: "\f056"; 336 | @fa-var-minus-square: "\f146"; 337 | @fa-var-minus-square-o: "\f147"; 338 | @fa-var-mobile: "\f10b"; 339 | @fa-var-mobile-phone: "\f10b"; 340 | @fa-var-money: "\f0d6"; 341 | @fa-var-moon-o: "\f186"; 342 | @fa-var-mortar-board: "\f19d"; 343 | @fa-var-music: "\f001"; 344 | @fa-var-navicon: "\f0c9"; 345 | @fa-var-newspaper-o: "\f1ea"; 346 | @fa-var-openid: "\f19b"; 347 | @fa-var-outdent: "\f03b"; 348 | @fa-var-pagelines: "\f18c"; 349 | @fa-var-paint-brush: "\f1fc"; 350 | @fa-var-paper-plane: "\f1d8"; 351 | @fa-var-paper-plane-o: "\f1d9"; 352 | @fa-var-paperclip: "\f0c6"; 353 | @fa-var-paragraph: "\f1dd"; 354 | @fa-var-paste: "\f0ea"; 355 | @fa-var-pause: "\f04c"; 356 | @fa-var-paw: "\f1b0"; 357 | @fa-var-paypal: "\f1ed"; 358 | @fa-var-pencil: "\f040"; 359 | @fa-var-pencil-square: "\f14b"; 360 | @fa-var-pencil-square-o: "\f044"; 361 | @fa-var-phone: "\f095"; 362 | @fa-var-phone-square: "\f098"; 363 | @fa-var-photo: "\f03e"; 364 | @fa-var-picture-o: "\f03e"; 365 | @fa-var-pie-chart: "\f200"; 366 | @fa-var-pied-piper: "\f1a7"; 367 | @fa-var-pied-piper-alt: "\f1a8"; 368 | @fa-var-pinterest: "\f0d2"; 369 | @fa-var-pinterest-square: "\f0d3"; 370 | @fa-var-plane: "\f072"; 371 | @fa-var-play: "\f04b"; 372 | @fa-var-play-circle: "\f144"; 373 | @fa-var-play-circle-o: "\f01d"; 374 | @fa-var-plug: "\f1e6"; 375 | @fa-var-plus: "\f067"; 376 | @fa-var-plus-circle: "\f055"; 377 | @fa-var-plus-square: "\f0fe"; 378 | @fa-var-plus-square-o: "\f196"; 379 | @fa-var-power-off: "\f011"; 380 | @fa-var-print: "\f02f"; 381 | @fa-var-puzzle-piece: "\f12e"; 382 | @fa-var-qq: "\f1d6"; 383 | @fa-var-qrcode: "\f029"; 384 | @fa-var-question: "\f128"; 385 | @fa-var-question-circle: "\f059"; 386 | @fa-var-quote-left: "\f10d"; 387 | @fa-var-quote-right: "\f10e"; 388 | @fa-var-ra: "\f1d0"; 389 | @fa-var-random: "\f074"; 390 | @fa-var-rebel: "\f1d0"; 391 | @fa-var-recycle: "\f1b8"; 392 | @fa-var-reddit: "\f1a1"; 393 | @fa-var-reddit-square: "\f1a2"; 394 | @fa-var-refresh: "\f021"; 395 | @fa-var-remove: "\f00d"; 396 | @fa-var-renren: "\f18b"; 397 | @fa-var-reorder: "\f0c9"; 398 | @fa-var-repeat: "\f01e"; 399 | @fa-var-reply: "\f112"; 400 | @fa-var-reply-all: "\f122"; 401 | @fa-var-retweet: "\f079"; 402 | @fa-var-rmb: "\f157"; 403 | @fa-var-road: "\f018"; 404 | @fa-var-rocket: "\f135"; 405 | @fa-var-rotate-left: "\f0e2"; 406 | @fa-var-rotate-right: "\f01e"; 407 | @fa-var-rouble: "\f158"; 408 | @fa-var-rss: "\f09e"; 409 | @fa-var-rss-square: "\f143"; 410 | @fa-var-rub: "\f158"; 411 | @fa-var-ruble: "\f158"; 412 | @fa-var-rupee: "\f156"; 413 | @fa-var-save: "\f0c7"; 414 | @fa-var-scissors: "\f0c4"; 415 | @fa-var-search: "\f002"; 416 | @fa-var-search-minus: "\f010"; 417 | @fa-var-search-plus: "\f00e"; 418 | @fa-var-send: "\f1d8"; 419 | @fa-var-send-o: "\f1d9"; 420 | @fa-var-share: "\f064"; 421 | @fa-var-share-alt: "\f1e0"; 422 | @fa-var-share-alt-square: "\f1e1"; 423 | @fa-var-share-square: "\f14d"; 424 | @fa-var-share-square-o: "\f045"; 425 | @fa-var-shekel: "\f20b"; 426 | @fa-var-sheqel: "\f20b"; 427 | @fa-var-shield: "\f132"; 428 | @fa-var-shopping-cart: "\f07a"; 429 | @fa-var-sign-in: "\f090"; 430 | @fa-var-sign-out: "\f08b"; 431 | @fa-var-signal: "\f012"; 432 | @fa-var-sitemap: "\f0e8"; 433 | @fa-var-skype: "\f17e"; 434 | @fa-var-slack: "\f198"; 435 | @fa-var-sliders: "\f1de"; 436 | @fa-var-slideshare: "\f1e7"; 437 | @fa-var-smile-o: "\f118"; 438 | @fa-var-soccer-ball-o: "\f1e3"; 439 | @fa-var-sort: "\f0dc"; 440 | @fa-var-sort-alpha-asc: "\f15d"; 441 | @fa-var-sort-alpha-desc: "\f15e"; 442 | @fa-var-sort-amount-asc: "\f160"; 443 | @fa-var-sort-amount-desc: "\f161"; 444 | @fa-var-sort-asc: "\f0de"; 445 | @fa-var-sort-desc: "\f0dd"; 446 | @fa-var-sort-down: "\f0dd"; 447 | @fa-var-sort-numeric-asc: "\f162"; 448 | @fa-var-sort-numeric-desc: "\f163"; 449 | @fa-var-sort-up: "\f0de"; 450 | @fa-var-soundcloud: "\f1be"; 451 | @fa-var-space-shuttle: "\f197"; 452 | @fa-var-spinner: "\f110"; 453 | @fa-var-spoon: "\f1b1"; 454 | @fa-var-spotify: "\f1bc"; 455 | @fa-var-square: "\f0c8"; 456 | @fa-var-square-o: "\f096"; 457 | @fa-var-stack-exchange: "\f18d"; 458 | @fa-var-stack-overflow: "\f16c"; 459 | @fa-var-star: "\f005"; 460 | @fa-var-star-half: "\f089"; 461 | @fa-var-star-half-empty: "\f123"; 462 | @fa-var-star-half-full: "\f123"; 463 | @fa-var-star-half-o: "\f123"; 464 | @fa-var-star-o: "\f006"; 465 | @fa-var-steam: "\f1b6"; 466 | @fa-var-steam-square: "\f1b7"; 467 | @fa-var-step-backward: "\f048"; 468 | @fa-var-step-forward: "\f051"; 469 | @fa-var-stethoscope: "\f0f1"; 470 | @fa-var-stop: "\f04d"; 471 | @fa-var-strikethrough: "\f0cc"; 472 | @fa-var-stumbleupon: "\f1a4"; 473 | @fa-var-stumbleupon-circle: "\f1a3"; 474 | @fa-var-subscript: "\f12c"; 475 | @fa-var-suitcase: "\f0f2"; 476 | @fa-var-sun-o: "\f185"; 477 | @fa-var-superscript: "\f12b"; 478 | @fa-var-support: "\f1cd"; 479 | @fa-var-table: "\f0ce"; 480 | @fa-var-tablet: "\f10a"; 481 | @fa-var-tachometer: "\f0e4"; 482 | @fa-var-tag: "\f02b"; 483 | @fa-var-tags: "\f02c"; 484 | @fa-var-tasks: "\f0ae"; 485 | @fa-var-taxi: "\f1ba"; 486 | @fa-var-tencent-weibo: "\f1d5"; 487 | @fa-var-terminal: "\f120"; 488 | @fa-var-text-height: "\f034"; 489 | @fa-var-text-width: "\f035"; 490 | @fa-var-th: "\f00a"; 491 | @fa-var-th-large: "\f009"; 492 | @fa-var-th-list: "\f00b"; 493 | @fa-var-thumb-tack: "\f08d"; 494 | @fa-var-thumbs-down: "\f165"; 495 | @fa-var-thumbs-o-down: "\f088"; 496 | @fa-var-thumbs-o-up: "\f087"; 497 | @fa-var-thumbs-up: "\f164"; 498 | @fa-var-ticket: "\f145"; 499 | @fa-var-times: "\f00d"; 500 | @fa-var-times-circle: "\f057"; 501 | @fa-var-times-circle-o: "\f05c"; 502 | @fa-var-tint: "\f043"; 503 | @fa-var-toggle-down: "\f150"; 504 | @fa-var-toggle-left: "\f191"; 505 | @fa-var-toggle-off: "\f204"; 506 | @fa-var-toggle-on: "\f205"; 507 | @fa-var-toggle-right: "\f152"; 508 | @fa-var-toggle-up: "\f151"; 509 | @fa-var-trash: "\f1f8"; 510 | @fa-var-trash-o: "\f014"; 511 | @fa-var-tree: "\f1bb"; 512 | @fa-var-trello: "\f181"; 513 | @fa-var-trophy: "\f091"; 514 | @fa-var-truck: "\f0d1"; 515 | @fa-var-try: "\f195"; 516 | @fa-var-tty: "\f1e4"; 517 | @fa-var-tumblr: "\f173"; 518 | @fa-var-tumblr-square: "\f174"; 519 | @fa-var-turkish-lira: "\f195"; 520 | @fa-var-twitch: "\f1e8"; 521 | @fa-var-twitter: "\f099"; 522 | @fa-var-twitter-square: "\f081"; 523 | @fa-var-umbrella: "\f0e9"; 524 | @fa-var-underline: "\f0cd"; 525 | @fa-var-undo: "\f0e2"; 526 | @fa-var-university: "\f19c"; 527 | @fa-var-unlink: "\f127"; 528 | @fa-var-unlock: "\f09c"; 529 | @fa-var-unlock-alt: "\f13e"; 530 | @fa-var-unsorted: "\f0dc"; 531 | @fa-var-upload: "\f093"; 532 | @fa-var-usd: "\f155"; 533 | @fa-var-user: "\f007"; 534 | @fa-var-user-md: "\f0f0"; 535 | @fa-var-users: "\f0c0"; 536 | @fa-var-video-camera: "\f03d"; 537 | @fa-var-vimeo-square: "\f194"; 538 | @fa-var-vine: "\f1ca"; 539 | @fa-var-vk: "\f189"; 540 | @fa-var-volume-down: "\f027"; 541 | @fa-var-volume-off: "\f026"; 542 | @fa-var-volume-up: "\f028"; 543 | @fa-var-warning: "\f071"; 544 | @fa-var-wechat: "\f1d7"; 545 | @fa-var-weibo: "\f18a"; 546 | @fa-var-weixin: "\f1d7"; 547 | @fa-var-wheelchair: "\f193"; 548 | @fa-var-wifi: "\f1eb"; 549 | @fa-var-windows: "\f17a"; 550 | @fa-var-won: "\f159"; 551 | @fa-var-wordpress: "\f19a"; 552 | @fa-var-wrench: "\f0ad"; 553 | @fa-var-xing: "\f168"; 554 | @fa-var-xing-square: "\f169"; 555 | @fa-var-yahoo: "\f19e"; 556 | @fa-var-yelp: "\f1e9"; 557 | @fa-var-yen: "\f157"; 558 | @fa-var-youtube: "\f167"; 559 | @fa-var-youtube-play: "\f16a"; 560 | @fa-var-youtube-square: "\f166"; 561 | 562 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | @mixin fa-icon-rotate($degrees, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 15 | -webkit-transform: rotate($degrees); 16 | -ms-transform: rotate($degrees); 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 22 | -webkit-transform: scale($horiz, $vert); 23 | -ms-transform: scale($horiz, $vert); 24 | transform: scale($horiz, $vert); 25 | } 26 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /public/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/images/ajax-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/ajax-loading.gif -------------------------------------------------------------------------------- /public/images/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/banner.jpg -------------------------------------------------------------------------------- /public/images/default_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/default_picture.png -------------------------------------------------------------------------------- /public/images/dislike_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/dislike_button.png -------------------------------------------------------------------------------- /public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/favicon.ico -------------------------------------------------------------------------------- /public/images/imeals-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/imeals-logo.png -------------------------------------------------------------------------------- /public/images/like_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/like_button.png -------------------------------------------------------------------------------- /public/images/liked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/liked.png -------------------------------------------------------------------------------- /public/images/monthly/102015/potm1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/102015/potm1.jpg -------------------------------------------------------------------------------- /public/images/monthly/102015/potm2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/102015/potm2.jpg -------------------------------------------------------------------------------- /public/images/monthly/102015/winner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/102015/winner.jpg -------------------------------------------------------------------------------- /public/images/monthly/112015/potm1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/112015/potm1.jpg -------------------------------------------------------------------------------- /public/images/monthly/112015/potm2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/112015/potm2.jpg -------------------------------------------------------------------------------- /public/images/monthly/112015/potm3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/monthly/112015/potm3.jpg -------------------------------------------------------------------------------- /public/images/nope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/nope.png -------------------------------------------------------------------------------- /public/images/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic01.jpg -------------------------------------------------------------------------------- /public/images/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic02.jpg -------------------------------------------------------------------------------- /public/images/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic03.jpg -------------------------------------------------------------------------------- /public/images/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic04.jpg -------------------------------------------------------------------------------- /public/images/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic05.jpg -------------------------------------------------------------------------------- /public/images/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic06.jpg -------------------------------------------------------------------------------- /public/images/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/pic07.jpg -------------------------------------------------------------------------------- /public/images/picpoll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/picpoll.png -------------------------------------------------------------------------------- /public/images/picpoll_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evias/imeals/fec809b46ec4d20f9ef39d12cdbca19f6814a0a6/public/images/picpoll_text.png -------------------------------------------------------------------------------- /public/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d
', 31 | orientation: 'vertical' 32 | }, 33 | titleBar: { 34 | breakpoints: 'mobile', 35 | position: 'top-left', 36 | side: 'top', 37 | height: 44, 38 | width: '100%', 39 | html: '' 40 | } 41 | } 42 | } 43 | }); 44 | 45 | $(function() { 46 | 47 | var $window = $(window), 48 | $body = $('body'); 49 | 50 | // Disable animations/transitions until the page has loaded. 51 | $body.addClass('is-loading'); 52 | 53 | $window.on('load', function() { 54 | $body.removeClass('is-loading'); 55 | }); 56 | 57 | // Forms (IE<10). 58 | var $form = $('form'); 59 | if ($form.length > 0) { 60 | 61 | $form.find('.form-button-submit') 62 | .on('click', function() { 63 | $(this).parents('form').submit(); 64 | return false; 65 | }); 66 | 67 | if (skel.vars.IEVersion < 10) { 68 | $.fn.n33_formerize=function(){var _fakes=new Array(),_form = $(this);_form.find('input[type=text],textarea').each(function() { var e = $(this); if (e.val() == '' || e.val() == e.attr('placeholder')) { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).blur(function() { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).focus(function() { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); _form.find('input[type=password]').each(function() { var e = $(this); var x = $($('
').append(e.clone()).remove().html().replace(/type="password"/i, 'type="text"').replace(/type=password/i, 'type=text')); if (e.attr('id') != '') x.attr('id', e.attr('id') + '_fakeformerizefield'); if (e.attr('name') != '') x.attr('name', e.attr('name') + '_fakeformerizefield'); x.addClass('formerize-placeholder').val(x.attr('placeholder')).insertAfter(e); if (e.val() == '') e.hide(); else x.hide(); e.blur(function(event) { event.preventDefault(); var e = $(this); var x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } }); x.focus(function(event) { event.preventDefault(); var x = $(this); var e = x.parent().find('input[name=' + x.attr('name').replace('_fakeformerizefield', '') + ']'); x.hide(); e.show().focus(); }); x.keypress(function(event) { event.preventDefault(); x.val(''); }); }); _form.submit(function() { $(this).find('input[type=text],input[type=password],textarea').each(function(event) { var e = $(this); if (e.attr('name').match(/_fakeformerizefield$/)) e.attr('name', ''); if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); }).bind("reset", function(event) { event.preventDefault(); $(this).find('select').val($('option:first').val()); $(this).find('input,textarea').each(function() { var e = $(this); var x; e.removeClass('formerize-placeholder'); switch (this.type) { case 'submit': case 'reset': break; case 'password': e.val(e.attr('defaultValue')); x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } else { e.show(); x.hide(); } break; case 'checkbox': case 'radio': e.attr('checked', e.attr('defaultValue')); break; case 'text': case 'textarea': e.val(e.attr('defaultValue')); if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } break; default: e.val(e.attr('defaultValue')); break; } }); window.setTimeout(function() { for (x in _fakes) _fakes[x].trigger('formerize_sync'); }, 10); }); return _form; }; 69 | $form.n33_formerize(); 70 | } 71 | 72 | } 73 | 74 | // CSS polyfills (IE<9). 75 | if (skel.vars.IEVersion < 9) 76 | $(':last-child').addClass('last-child'); 77 | 78 | // Dropdowns. 79 | $('#nav > ul').dropotron({ 80 | mode: 'fade', 81 | noOpenerFade: true, 82 | hoverDelay: 150, 83 | hideDelay: 350 84 | }); 85 | 86 | }); 87 | 88 | })(jQuery); 89 | -------------------------------------------------------------------------------- /public/js/jquery.dropotron.min.js: -------------------------------------------------------------------------------- 1 | /* jquery.dropotron.js v1.4.3 | (c) n33 | n33.co | MIT licensed */ 2 | (function(e){var t="openerActiveClass",n="click touchend",r="left",i="doCollapseAll",s="position",o="trigger",u="disableSelection_dropotron",a="addClass",f="doCollapse",l=!1,c="outerWidth",h="removeClass",p="preventDefault",d="length",v="dropotron",m="clearTimeout",g="right",y="parent",b=!0,w="speed",E="none",S="stopPropagation",x="doExpand",T=":visible",N="absolute",C="css",k="center",L="toggle",A="baseZIndex",O="offsetX",M="alignment",_="submenuClassPrefix",D="children",P="hover",H="relative",B="doToggle",j="ul",F="z-index",I="opacity",q="find",R="opener",U="px",z=null,W="hide",X="offset",V="detach",$="fast";e.fn[u]=function(){return e(this)[C]("user-select",E)[C]("-khtml-user-select",E)[C]("-moz-user-select",E)[C]("-o-user-select",E)[C]("-webkit-user-select",E)},e.fn[v]=function(t){var n;if(this[d]==0)return e(this);if(this[d]>1)for(n=0;n0&&i.add(d).on("mouseleave",function(){window[m](at),at=window.setTimeout(function(){i[o](f)},et.hideDelay)}),i[u]()[W]()[a](et.menuClass)[C](s,N).on("mouseenter",function(){window[m](at)}).on(x,function(){var n,u,p,v,E,S,x,_,D,P,B;if(i.is(T))return l;window[m](at),nt.each(function(){var t=e(this);e.contains(t.get(0),d.get(0))||t[o](f)}),n=d[X](),u=d[s](),p=d[y]()[s](),v=d[c](),E=i[c](),S=i[C](F)==et[A];if(S){et[V]?x=n:x=u,P=x.top+d.outerHeight()+et.globalOffsetY,_=et[M],i[h](r)[h](g)[h](k);switch(et[M]){case g:D=x[r]-E+v,D<0&&(D=x[r],_=r);break;case k:D=x[r]-Math.floor((E-v)/2),D<0?(D=x[r],_=r):D+E>st.width()&&(D=x[r]-E+v,_=g);break;case r:default:D=x[r],D+E>st.width()&&(D=x[r]-E+v,_=g)}i[a](_)}else{d[C](s)==H||d[C](s)==N?(P=et.offsetY,D=-1*u[r]):(P=u.top+et.offsetY,D=0);switch(et[M]){case g:D+=-1*d[y]()[c]()+et[O];break;case k:case r:default:D+=d[y]()[c]()+et[O]}}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(D+=et.IEOffsetX,P+=et.IEOffsetY),i[C](r,D+U)[C]("top",P+U)[C](I,"0.01").show(),B=l,d[C](s)==H||d[C](s)==N?D=-1*u[r]:D=0,i[X]()[r]<0?(D+=d[y]()[c]()-et[O],B=b):i[X]()[r]+E>st.width()&&(D+=-1*d[y]()[c]()-et[O],B=b),B&&i[C](r,D+U),i[W]()[C](I,"1");switch(et.mode){case"zoom":ot=b,d[a](et[t]),i.animate({width:L,height:L},et[w],et.easing,function(){ot=l});break;case"slide":ot=b,d[a](et[t]),i.animate({height:L},et[w],et.easing,function(){ot=l});break;case"fade":ot=b,S&&!et.noOpenerFade?(et[w]=="slow"?B=80:et[w]==$?B=40:B=Math.floor(et[w]/2),d.fadeTo(B,.01,function(){d[a](et[t]),d.fadeTo(et[w],1),i.fadeIn(et[w],function(){ot=l})})):(d[a](et[t]),d.fadeTo(et[w],1),i.fadeIn(et[w],function(){ot=l}));break;case"instant":default:d[a](et[t]),i.show()}return l}).on(f,function(){return i.is(T)?(i[W](),d[h](et[t]),i[q]("."+et[t])[h](et[t]),i[q](j)[W](),l):l}).on(B,function(){return i.is(T)?i[o](f):i[o](x),l}),d[u]()[a](R)[C]("cursor","pointer").on(n,function(e){if(ot)return;e[p](),e[S](),i[o](B)}),et.expandMode==P&&d[P](function(){if(ot)return;ut=window.setTimeout(function(){i[o](x)},et.hoverDelay)},function(){window[m](ut)})}),nt[q]("a")[C]("display","block").on(n,function(t){if(ot)return;e(this).attr("href")[d]<1&&t[p]()}),tt[q]("li")[C]("white-space","nowrap").each(function(){var t=e(this),r=t[D]("a"),s=t[D](j),u=r.attr("href");r.on(n,function(e){u[d]==0||u=="#"?e[p]():e[S]()}),r[d]>0&&s[d]==0&&t.on(n,function(e){if(ot)return;tt[o](i),e[S]()})}),tt[D]("li").each(function(){var t,n,r,i,s=e(this),o=s[D](j);if(o[d]>0){et[V]&&(et.cloneOnDetach&&(t=o.clone(),t.attr("class","")[W]().appendTo(o[y]())),o[V]().appendTo(rt));for(n=et[A],r=1,i=o;i[d]>0;r++)i[C](F,n++),et[_]&&i[a](et[_]+(n-1-et[A])),i=i[q]("> li > ul")}}),st.on("scroll",function(){tt[o](i)}).on("keypress",function(e){!ot&&e.keyCode==27&&(e[p](),tt[o](i))}),it.on(n,function(){ot||tt[o](i)})}})(jQuery); -------------------------------------------------------------------------------- /public/js/jquery.jTinder.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jTinder v.1.0.0 3 | * https://github.com/do-web/jTinder 4 | * Requires jQuery 1.7+, jQuery transform2d 5 | * 6 | * Copyright (c) 2014, Dominik Weber 7 | * Licensed under GPL Version 2. 8 | * https://github.com/do-web/jTinder/blob/master/LICENSE 9 | */ 10 | ;(function ($, window, document, undefined) { 11 | var pluginName = "jTinder", 12 | defaults = { 13 | onDislike: null, 14 | onLike: null, 15 | animationRevertSpeed: 200, 16 | animationSpeed: 400, 17 | threshold: 1, 18 | likeSelector: '.like', 19 | dislikeSelector: '.dislike' 20 | }; 21 | 22 | var container = null; 23 | var panes = null; 24 | var $that = null; 25 | var xStart = 0; 26 | var yStart = 0; 27 | var touchStart = false; 28 | var posX = 0, posY = 0, lastPosX = 0, lastPosY = 0, pane_width = 0, pane_count = 0, current_pane = 0; 29 | 30 | function Plugin(element, options) { 31 | this.element = element; 32 | this.settings = $.extend({}, defaults, options); 33 | this._defaults = defaults; 34 | this._name = pluginName; 35 | this.init(element); 36 | } 37 | 38 | Plugin.prototype = { 39 | 40 | 41 | init: function (element) { 42 | 43 | container = $(">ul", element); 44 | panes = $(">ul>li", element); 45 | pane_width = container.width(); 46 | pane_count = panes.length; 47 | current_pane = panes.length - 1; 48 | $that = this; 49 | 50 | $(element).bind('touchstart mousedown', this.handler); 51 | $(element).bind('touchmove mousemove', this.handler); 52 | $(element).bind('touchend mouseup', this.handler); 53 | }, 54 | 55 | showPane: function (index) { 56 | panes.eq(current_pane).hide(); 57 | current_pane = index; 58 | }, 59 | 60 | rewind: function() { 61 | $.each(panes, function(index, panel) 62 | { 63 | var jqElm = $(panel); 64 | jqElm.css("transform", ""); 65 | jqElm.show(); 66 | current_pane = index+1; 67 | }); 68 | }, 69 | 70 | next: function (action) { 71 | /** 72 | * Pull request on jTinder (@see https://github.com/do-web/jTinder) 73 | * Integrate of pull request by Greg Saive 74 | * Commit integrated: 75 | * https://github.com/Stemlet/jTinder/commit/f3565b6f2376ebaf013306829b2b3fcfa5f4c938 76 | **/ 77 | //@see #f3565b 78 | //return this.showPane(current_pane - 1); 79 | 80 | $that.settings.onBeforeNext 81 | && $that.settings.onBeforeNext(current_pane, action); 82 | 83 | !current_pane && $that.settings.onFinish && $that.settings.onFinish(this); 84 | var showResult = this.showPane(current_pane - 1); 85 | 86 | $that.settings.onAfterNext 87 | && $that.settings.onAfterNext(current_pane, action); 88 | return showResult; 89 | }, 90 | 91 | dislike: function() { 92 | panes.eq(current_pane).animate({"transform": "translate(-" + (pane_width) + "px," + (pane_width*-1.5) + "px) rotate(-60deg)"}, $that.settings.animationSpeed, function () { 93 | if($that.settings.onDislike) { 94 | $that.settings.onDislike(panes.eq(current_pane)); 95 | } 96 | $that.next("dislike"); 97 | }); 98 | }, 99 | 100 | like: function() { 101 | panes.eq(current_pane).animate({"transform": "translate(" + (pane_width) + "px," + (pane_width*-1.5) + "px) rotate(60deg)"}, $that.settings.animationSpeed, function () { 102 | if($that.settings.onLike) { 103 | $that.settings.onLike(panes.eq(current_pane)); 104 | } 105 | $that.next("like"); 106 | }); 107 | }, 108 | 109 | handler: function (ev) { 110 | ev.preventDefault(); 111 | 112 | switch (ev.type) { 113 | case 'touchstart': 114 | if(touchStart === false) { 115 | touchStart = true; 116 | xStart = ev.originalEvent.touches[0].pageX; 117 | yStart = ev.originalEvent.touches[0].pageY; 118 | } 119 | case 'mousedown': 120 | if(touchStart === false) { 121 | touchStart = true; 122 | xStart = ev.pageX; 123 | yStart = ev.pageY; 124 | } 125 | case 'mousemove': 126 | case 'touchmove': 127 | if(touchStart === true) { 128 | var pageX = typeof ev.pageX == 'undefined' ? ev.originalEvent.touches[0].pageX : ev.pageX; 129 | var pageY = typeof ev.pageY == 'undefined' ? ev.originalEvent.touches[0].pageY : ev.pageY; 130 | var deltaX = parseInt(pageX) - parseInt(xStart); 131 | var deltaY = parseInt(pageY) - parseInt(yStart); 132 | var percent = ((100 / pane_width) * deltaX) / pane_count; 133 | posX = deltaX + lastPosX; 134 | posY = deltaY + lastPosY; 135 | 136 | /** 137 | * Pull request on jTinder (@see https://github.com/do-web/jTinder) 138 | * Integrate of pull request by Greg Saive 139 | * Commit integrated: 140 | * https://github.com/iamnotnader/jTinder/commit/1bc58d1a691aa32d02510ffff02b911bddc6fdbe 141 | **/ 142 | //@see #1bc58d 143 | //panes.eq(current_pane).css("transform", "translate(" + posX + "px," + posY + "px) rotate(" + (percent / 2) + "deg)"); 144 | current_pane_elem = panes.eq(current_pane); 145 | current_pane_elem.css("transform", "translate(" + posX + "px," + posY + "px) rotate(" + (percent / 2) + "deg)"); 146 | 147 | var opa = (Math.abs(deltaX) / $that.settings.threshold) / 100 + 0.2; 148 | if(opa > 1.0) { 149 | opa = 1.0; 150 | } 151 | if (posX >= 0) { 152 | //@see #1bc58d 153 | //panes.eq(current_pane).find($that.settings.likeSelector).css('opacity', opa); 154 | //panes.eq(current_pane).find($that.settings.dislikeSelector).css('opacity', 0); 155 | current_pane_elem.find($that.settings.likeSelector).css('opacity', opa); 156 | current_pane_elem.find($that.settings.dislikeSelector).css('opacity', 0); 157 | } else if (posX < 0) { 158 | //@see #1bc58d 159 | //panes.eq(current_pane).find($that.settings.dislikeSelector).css('opacity', opa); 160 | //panes.eq(current_pane).find($that.settings.likeSelector).css('opacity', 0); 161 | current_pane_elem.find($that.settings.dislikeSelector).css('opacity', opa); 162 | current_pane_elem.find($that.settings.likeSelector).css('opacity', 0); 163 | } 164 | } 165 | break; 166 | case 'mouseup': 167 | case 'touchend': 168 | touchStart = false; 169 | var pageX = (typeof ev.pageX == 'undefined') ? ev.originalEvent.changedTouches[0].pageX : ev.pageX; 170 | var pageY = (typeof ev.pageY == 'undefined') ? ev.originalEvent.changedTouches[0].pageY : ev.pageY; 171 | var deltaX = parseInt(pageX) - parseInt(xStart); 172 | var deltaY = parseInt(pageY) - parseInt(yStart); 173 | 174 | posX = deltaX + lastPosX; 175 | posY = deltaY + lastPosY; 176 | var opa = Math.abs((Math.abs(deltaX) / $that.settings.threshold) / 100 + 0.2); 177 | 178 | current_pane_elem = panes.eq(current_pane); 179 | if (opa >= 1) { 180 | if (posX > 0) { 181 | //@see #1bc58d 182 | //panes.eq(current_pane).animate({"transform": "translate(" + (pane_width) + "px," + (posY + pane_width) + "px) rotate(60deg)"}, $that.settings.animationSpeed, function () { 183 | current_pane_elem.animate({"transform": "translate(" + (pane_width) + "px," + (posY + pane_width) + "px) rotate(60deg)"}, $that.settings.animationSpeed, function () { 184 | if($that.settings.onLike) { 185 | //@see #1bc58d 186 | //$that.settings.onLike(panes.eq(current_pane)); 187 | $that.settings.onLike(current_pane_elem); 188 | } 189 | $that.next("like"); 190 | }); 191 | } else { 192 | //@see #1bc58d 193 | //panes.eq(current_pane).animate({"transform": "translate(-" + (pane_width) + "px," + (posY + pane_width) + "px) rotate(-60deg)"}, $that.settings.animationSpeed, function () { 194 | current_pane_elem.animate({"transform": "translate(-" + (pane_width) + "px," + (posY + pane_width) + "px) rotate(-60deg)"}, $that.settings.animationSpeed, function () { 195 | if($that.settings.onDislike) { 196 | //@see #1bc58d 197 | //$that.settings.onDislike(panes.eq(current_pane)); 198 | $that.settings.onDislike(current_pane_elem); 199 | } 200 | $that.next("dislike"); 201 | }); 202 | } 203 | } else { 204 | lastPosX = 0; 205 | lastPosY = 0; 206 | //@see #1bc58d 207 | //panes.eq(current_pane).animate({"transform": "translate(0px,0px) rotate(0deg)"}, $that.settings.animationRevertSpeed); 208 | //panes.eq(current_pane).find($that.settings.likeSelector).animate({"opacity": 0}, $that.settings.animationRevertSpeed); 209 | //panes.eq(current_pane).find($that.settings.dislikeSelector).animate({"opacity": 0}, $that.settings.animationRevertSpeed); 210 | current_pane_elem = panes.eq(current_pane); 211 | current_pane_elem.animate({"transform": "translate(0px,0px) rotate(0deg)"}, $that.settings.animationRevertSpeed); 212 | current_pane_elem.find($that.settings.likeSelector).animate({"opacity": 0}, $that.settings.animationRevertSpeed); 213 | current_pane_elem.find($that.settings.dislikeSelector).animate({"opacity": 0}, $that.settings.animationRevertSpeed); 214 | } 215 | break; 216 | } 217 | } 218 | }; 219 | 220 | $.fn[ pluginName ] = function (options) { 221 | this.each(function () { 222 | if (!$.data(this, "plugin_" + pluginName)) { 223 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 224 | } 225 | else if ($.isFunction(Plugin.prototype[options])) { 226 | $.data(this, 'plugin_' + pluginName)[options](); 227 | } 228 | }); 229 | 230 | return this; 231 | }; 232 | 233 | })(jQuery, window, document); 234 | -------------------------------------------------------------------------------- /public/js/jquery.transform2d.js: -------------------------------------------------------------------------------- 1 | /* 2 | * transform: A jQuery cssHooks adding cross-browser 2d transform capabilities to $.fn.css() and $.fn.animate() 3 | * 4 | * limitations: 5 | * - requires jQuery 1.4.3+ 6 | * - Should you use the *translate* property, then your elements need to be absolutely positionned in a relatively positionned wrapper **or it will fail in IE678**. 7 | * - transformOrigin is not accessible 8 | * 9 | * latest version and complete README available on Github: 10 | * https://github.com/louisremi/jquery.transform.js 11 | * 12 | * Copyright 2011 @louis_remi 13 | * Licensed under the MIT license. 14 | * 15 | * This saved you an hour of work? 16 | * Send me music http://www.amazon.co.uk/wishlist/HNTU0468LQON 17 | * 18 | */ 19 | (function( $, window, document, Math, undefined ) { 20 | 21 | /* 22 | * Feature tests and global variables 23 | */ 24 | var div = document.createElement("div"), 25 | divStyle = div.style, 26 | suffix = "Transform", 27 | testProperties = [ 28 | "O" + suffix, 29 | "ms" + suffix, 30 | "Webkit" + suffix, 31 | "Moz" + suffix 32 | ], 33 | i = testProperties.length, 34 | supportProperty, 35 | supportMatrixFilter, 36 | supportFloat32Array = "Float32Array" in window, 37 | propertyHook, 38 | propertyGet, 39 | rMatrix = /Matrix([^)]*)/, 40 | rAffine = /^\s*matrix\(\s*1\s*,\s*0\s*,\s*0\s*,\s*1\s*(?:,\s*0(?:px)?\s*){2}\)\s*$/, 41 | _transform = "transform", 42 | _transformOrigin = "transformOrigin", 43 | _translate = "translate", 44 | _rotate = "rotate", 45 | _scale = "scale", 46 | _skew = "skew", 47 | _matrix = "matrix"; 48 | 49 | // test different vendor prefixes of these properties 50 | while ( i-- ) { 51 | if ( testProperties[i] in divStyle ) { 52 | $.support[_transform] = supportProperty = testProperties[i]; 53 | $.support[_transformOrigin] = supportProperty + "Origin"; 54 | continue; 55 | } 56 | } 57 | // IE678 alternative 58 | if ( !supportProperty ) { 59 | $.support.matrixFilter = supportMatrixFilter = divStyle.filter === ""; 60 | } 61 | 62 | // px isn't the default unit of these properties 63 | $.cssNumber[_transform] = $.cssNumber[_transformOrigin] = true; 64 | 65 | /* 66 | * fn.css() hooks 67 | */ 68 | if ( supportProperty && supportProperty != _transform ) { 69 | // Modern browsers can use jQuery.cssProps as a basic hook 70 | $.cssProps[_transform] = supportProperty; 71 | $.cssProps[_transformOrigin] = supportProperty + "Origin"; 72 | 73 | // Firefox needs a complete hook because it stuffs matrix with "px" 74 | if ( supportProperty == "Moz" + suffix ) { 75 | propertyHook = { 76 | get: function( elem, computed ) { 77 | return (computed ? 78 | // remove "px" from the computed matrix 79 | $.css( elem, supportProperty ).split("px").join(""): 80 | elem.style[supportProperty] 81 | ); 82 | }, 83 | set: function( elem, value ) { 84 | // add "px" to matrices 85 | elem.style[supportProperty] = /matrix\([^)p]*\)/.test(value) ? 86 | value.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/, _matrix+"$1$2px,$3px"): 87 | value; 88 | } 89 | }; 90 | /* Fix two jQuery bugs still present in 1.5.1 91 | * - rupper is incompatible with IE9, see http://jqbug.com/8346 92 | * - jQuery.css is not really jQuery.cssProps aware, see http://jqbug.com/8402 93 | */ 94 | } else if ( /^1\.[0-5](?:\.|$)/.test($.fn.jquery) ) { 95 | propertyHook = { 96 | get: function( elem, computed ) { 97 | return (computed ? 98 | $.css( elem, supportProperty.replace(/^ms/, "Ms") ): 99 | elem.style[supportProperty] 100 | ); 101 | } 102 | }; 103 | } 104 | /* TODO: leverage hardware acceleration of 3d transform in Webkit only 105 | else if ( supportProperty == "Webkit" + suffix && support3dTransform ) { 106 | propertyHook = { 107 | set: function( elem, value ) { 108 | elem.style[supportProperty] = 109 | value.replace(); 110 | } 111 | } 112 | }*/ 113 | 114 | } else if ( supportMatrixFilter ) { 115 | propertyHook = { 116 | get: function( elem, computed, asArray ) { 117 | var elemStyle = ( computed && elem.currentStyle ? elem.currentStyle : elem.style ), 118 | matrix, data; 119 | 120 | if ( elemStyle && rMatrix.test( elemStyle.filter ) ) { 121 | matrix = RegExp.$1.split(","); 122 | matrix = [ 123 | matrix[0].split("=")[1], 124 | matrix[2].split("=")[1], 125 | matrix[1].split("=")[1], 126 | matrix[3].split("=")[1] 127 | ]; 128 | } else { 129 | matrix = [1,0,0,1]; 130 | } 131 | 132 | if ( ! $.cssHooks[_transformOrigin] ) { 133 | matrix[4] = elemStyle ? parseInt(elemStyle.left, 10) || 0 : 0; 134 | matrix[5] = elemStyle ? parseInt(elemStyle.top, 10) || 0 : 0; 135 | 136 | } else { 137 | data = $._data( elem, "transformTranslate", undefined ); 138 | matrix[4] = data ? data[0] : 0; 139 | matrix[5] = data ? data[1] : 0; 140 | } 141 | 142 | return asArray ? matrix : _matrix+"(" + matrix + ")"; 143 | }, 144 | set: function( elem, value, animate ) { 145 | var elemStyle = elem.style, 146 | currentStyle, 147 | Matrix, 148 | filter, 149 | centerOrigin; 150 | 151 | if ( !animate ) { 152 | elemStyle.zoom = 1; 153 | } 154 | 155 | value = matrix(value); 156 | 157 | // rotate, scale and skew 158 | Matrix = [ 159 | "Matrix("+ 160 | "M11="+value[0], 161 | "M12="+value[2], 162 | "M21="+value[1], 163 | "M22="+value[3], 164 | "SizingMethod='auto expand'" 165 | ].join(); 166 | filter = ( currentStyle = elem.currentStyle ) && currentStyle.filter || elemStyle.filter || ""; 167 | 168 | elemStyle.filter = rMatrix.test(filter) ? 169 | filter.replace(rMatrix, Matrix) : 170 | filter + " progid:DXImageTransform.Microsoft." + Matrix + ")"; 171 | 172 | if ( ! $.cssHooks[_transformOrigin] ) { 173 | 174 | // center the transform origin, from pbakaus's Transformie http://github.com/pbakaus/transformie 175 | if ( (centerOrigin = $.transform.centerOrigin) ) { 176 | elemStyle[centerOrigin == "margin" ? "marginLeft" : "left"] = -(elem.offsetWidth/2) + (elem.clientWidth/2) + "px"; 177 | elemStyle[centerOrigin == "margin" ? "marginTop" : "top"] = -(elem.offsetHeight/2) + (elem.clientHeight/2) + "px"; 178 | } 179 | 180 | // translate 181 | // We assume that the elements are absolute positionned inside a relative positionned wrapper 182 | elemStyle.left = value[4] + "px"; 183 | elemStyle.top = value[5] + "px"; 184 | 185 | } else { 186 | $.cssHooks[_transformOrigin].set( elem, value ); 187 | } 188 | } 189 | }; 190 | } 191 | // populate jQuery.cssHooks with the appropriate hook if necessary 192 | if ( propertyHook ) { 193 | $.cssHooks[_transform] = propertyHook; 194 | } 195 | // we need a unique setter for the animation logic 196 | propertyGet = propertyHook && propertyHook.get || $.css; 197 | 198 | /* 199 | * fn.animate() hooks 200 | */ 201 | $.fx.step.transform = function( fx ) { 202 | var elem = fx.elem, 203 | start = fx.start, 204 | end = fx.end, 205 | pos = fx.pos, 206 | transform = "", 207 | precision = 1E5, 208 | i, startVal, endVal, unit; 209 | 210 | // fx.end and fx.start need to be converted to interpolation lists 211 | if ( !start || typeof start === "string" ) { 212 | 213 | // the following block can be commented out with jQuery 1.5.1+, see #7912 214 | if ( !start ) { 215 | start = propertyGet( elem, supportProperty ); 216 | } 217 | 218 | // force layout only once per animation 219 | if ( supportMatrixFilter ) { 220 | elem.style.zoom = 1; 221 | } 222 | 223 | // replace "+=" in relative animations (-= is meaningless with transforms) 224 | end = end.split("+=").join(start); 225 | 226 | // parse both transform to generate interpolation list of same length 227 | $.extend( fx, interpolationList( start, end ) ); 228 | start = fx.start; 229 | end = fx.end; 230 | } 231 | 232 | i = start.length; 233 | 234 | // interpolate functions of the list one by one 235 | while ( i-- ) { 236 | startVal = start[i]; 237 | endVal = end[i]; 238 | unit = +false; 239 | 240 | switch ( startVal[0] ) { 241 | 242 | case _translate: 243 | unit = "px"; 244 | case _scale: 245 | unit || ( unit = ""); 246 | 247 | transform = startVal[0] + "(" + 248 | Math.round( (startVal[1][0] + (endVal[1][0] - startVal[1][0]) * pos) * precision ) / precision + unit +","+ 249 | Math.round( (startVal[1][1] + (endVal[1][1] - startVal[1][1]) * pos) * precision ) / precision + unit + ")"+ 250 | transform; 251 | break; 252 | 253 | case _skew + "X": 254 | case _skew + "Y": 255 | case _rotate: 256 | transform = startVal[0] + "(" + 257 | Math.round( (startVal[1] + (endVal[1] - startVal[1]) * pos) * precision ) / precision +"rad)"+ 258 | transform; 259 | break; 260 | } 261 | } 262 | 263 | fx.origin && ( transform = fx.origin + transform ); 264 | 265 | propertyHook && propertyHook.set ? 266 | propertyHook.set( elem, transform, +true ): 267 | elem.style[supportProperty] = transform; 268 | }; 269 | 270 | /* 271 | * Utility functions 272 | */ 273 | 274 | // turns a transform string into its "matrix(A,B,C,D,X,Y)" form (as an array, though) 275 | function matrix( transform ) { 276 | transform = transform.split(")"); 277 | var 278 | trim = $.trim 279 | , i = -1 280 | // last element of the array is an empty string, get rid of it 281 | , l = transform.length -1 282 | , split, prop, val 283 | , prev = supportFloat32Array ? new Float32Array(6) : [] 284 | , curr = supportFloat32Array ? new Float32Array(6) : [] 285 | , rslt = supportFloat32Array ? new Float32Array(6) : [1,0,0,1,0,0] 286 | ; 287 | 288 | prev[0] = prev[3] = rslt[0] = rslt[3] = 1; 289 | prev[1] = prev[2] = prev[4] = prev[5] = 0; 290 | 291 | // Loop through the transform properties, parse and multiply them 292 | while ( ++i < l ) { 293 | split = transform[i].split("("); 294 | prop = trim(split[0]); 295 | val = split[1]; 296 | curr[0] = curr[3] = 1; 297 | curr[1] = curr[2] = curr[4] = curr[5] = 0; 298 | 299 | switch (prop) { 300 | case _translate+"X": 301 | curr[4] = parseInt(val, 10); 302 | break; 303 | 304 | case _translate+"Y": 305 | curr[5] = parseInt(val, 10); 306 | break; 307 | 308 | case _translate: 309 | val = val.split(","); 310 | curr[4] = parseInt(val[0], 10); 311 | curr[5] = parseInt(val[1] || 0, 10); 312 | break; 313 | 314 | case _rotate: 315 | val = toRadian(val); 316 | curr[0] = Math.cos(val); 317 | curr[1] = Math.sin(val); 318 | curr[2] = -Math.sin(val); 319 | curr[3] = Math.cos(val); 320 | break; 321 | 322 | case _scale+"X": 323 | curr[0] = +val; 324 | break; 325 | 326 | case _scale+"Y": 327 | curr[3] = val; 328 | break; 329 | 330 | case _scale: 331 | val = val.split(","); 332 | curr[0] = val[0]; 333 | curr[3] = val.length>1 ? val[1] : val[0]; 334 | break; 335 | 336 | case _skew+"X": 337 | curr[2] = Math.tan(toRadian(val)); 338 | break; 339 | 340 | case _skew+"Y": 341 | curr[1] = Math.tan(toRadian(val)); 342 | break; 343 | 344 | case _matrix: 345 | val = val.split(","); 346 | curr[0] = val[0]; 347 | curr[1] = val[1]; 348 | curr[2] = val[2]; 349 | curr[3] = val[3]; 350 | curr[4] = parseInt(val[4], 10); 351 | curr[5] = parseInt(val[5], 10); 352 | break; 353 | } 354 | 355 | // Matrix product (array in column-major order) 356 | rslt[0] = prev[0] * curr[0] + prev[2] * curr[1]; 357 | rslt[1] = prev[1] * curr[0] + prev[3] * curr[1]; 358 | rslt[2] = prev[0] * curr[2] + prev[2] * curr[3]; 359 | rslt[3] = prev[1] * curr[2] + prev[3] * curr[3]; 360 | rslt[4] = prev[0] * curr[4] + prev[2] * curr[5] + prev[4]; 361 | rslt[5] = prev[1] * curr[4] + prev[3] * curr[5] + prev[5]; 362 | 363 | prev = [rslt[0],rslt[1],rslt[2],rslt[3],rslt[4],rslt[5]]; 364 | } 365 | return rslt; 366 | } 367 | 368 | // turns a matrix into its rotate, scale and skew components 369 | // algorithm from http://hg.mozilla.org/mozilla-central/file/7cb3e9795d04/layout/style/nsStyleAnimation.cpp 370 | function unmatrix(matrix) { 371 | var 372 | scaleX 373 | , scaleY 374 | , skew 375 | , A = matrix[0] 376 | , B = matrix[1] 377 | , C = matrix[2] 378 | , D = matrix[3] 379 | ; 380 | 381 | // Make sure matrix is not singular 382 | if ( A * D - B * C ) { 383 | // step (3) 384 | scaleX = Math.sqrt( A * A + B * B ); 385 | A /= scaleX; 386 | B /= scaleX; 387 | // step (4) 388 | skew = A * C + B * D; 389 | C -= A * skew; 390 | D -= B * skew; 391 | // step (5) 392 | scaleY = Math.sqrt( C * C + D * D ); 393 | C /= scaleY; 394 | D /= scaleY; 395 | skew /= scaleY; 396 | // step (6) 397 | if ( A * D < B * C ) { 398 | A = -A; 399 | B = -B; 400 | skew = -skew; 401 | scaleX = -scaleX; 402 | } 403 | 404 | // matrix is singular and cannot be interpolated 405 | } else { 406 | // In this case the elem shouldn't be rendered, hence scale == 0 407 | scaleX = scaleY = skew = 0; 408 | } 409 | 410 | // The recomposition order is very important 411 | // see http://hg.mozilla.org/mozilla-central/file/7cb3e9795d04/layout/style/nsStyleAnimation.cpp#l971 412 | return [ 413 | [_translate, [+matrix[4], +matrix[5]]], 414 | [_rotate, Math.atan2(B, A)], 415 | [_skew + "X", Math.atan(skew)], 416 | [_scale, [scaleX, scaleY]] 417 | ]; 418 | } 419 | 420 | // build the list of transform functions to interpolate 421 | // use the algorithm described at http://dev.w3.org/csswg/css3-2d-transforms/#animation 422 | function interpolationList( start, end ) { 423 | var list = { 424 | start: [], 425 | end: [] 426 | }, 427 | i = -1, l, 428 | currStart, currEnd, currType; 429 | 430 | // get rid of affine transform matrix 431 | ( start == "none" || isAffine( start ) ) && ( start = "" ); 432 | ( end == "none" || isAffine( end ) ) && ( end = "" ); 433 | 434 | // if end starts with the current computed style, this is a relative animation 435 | // store computed style as the origin, remove it from start and end 436 | if ( start && end && !end.indexOf("matrix") && toArray( start ).join() == toArray( end.split(")")[0] ).join() ) { 437 | list.origin = start; 438 | start = ""; 439 | end = end.slice( end.indexOf(")") +1 ); 440 | } 441 | 442 | if ( !start && !end ) { return; } 443 | 444 | // start or end are affine, or list of transform functions are identical 445 | // => functions will be interpolated individually 446 | if ( !start || !end || functionList(start) == functionList(end) ) { 447 | 448 | start && ( start = start.split(")") ) && ( l = start.length ); 449 | end && ( end = end.split(")") ) && ( l = end.length ); 450 | 451 | while ( ++i < l-1 ) { 452 | start[i] && ( currStart = start[i].split("(") ); 453 | end[i] && ( currEnd = end[i].split("(") ); 454 | currType = $.trim( ( currStart || currEnd )[0] ); 455 | 456 | append( list.start, parseFunction( currType, currStart ? currStart[1] : 0 ) ); 457 | append( list.end, parseFunction( currType, currEnd ? currEnd[1] : 0 ) ); 458 | } 459 | 460 | // otherwise, functions will be composed to a single matrix 461 | } else { 462 | list.start = unmatrix(matrix(start)); 463 | list.end = unmatrix(matrix(end)) 464 | } 465 | 466 | return list; 467 | } 468 | 469 | function parseFunction( type, value ) { 470 | var 471 | // default value is 1 for scale, 0 otherwise 472 | defaultValue = +(!type.indexOf(_scale)), 473 | scaleX, 474 | // remove X/Y from scaleX/Y & translateX/Y, not from skew 475 | cat = type.replace( /e[XY]/, "e" ); 476 | 477 | switch ( type ) { 478 | case _translate+"Y": 479 | case _scale+"Y": 480 | 481 | value = [ 482 | defaultValue, 483 | value ? 484 | parseFloat( value ): 485 | defaultValue 486 | ]; 487 | break; 488 | 489 | case _translate+"X": 490 | case _translate: 491 | case _scale+"X": 492 | scaleX = 1; 493 | case _scale: 494 | 495 | value = value ? 496 | ( value = value.split(",") ) && [ 497 | parseFloat( value[0] ), 498 | parseFloat( value.length>1 ? value[1] : type == _scale ? scaleX || value[0] : defaultValue+"" ) 499 | ]: 500 | [defaultValue, defaultValue]; 501 | break; 502 | 503 | case _skew+"X": 504 | case _skew+"Y": 505 | case _rotate: 506 | value = value ? toRadian( value ) : 0; 507 | break; 508 | 509 | case _matrix: 510 | return unmatrix( value ? toArray(value) : [1,0,0,1,0,0] ); 511 | break; 512 | } 513 | 514 | return [[ cat, value ]]; 515 | } 516 | 517 | function isAffine( matrix ) { 518 | return rAffine.test(matrix); 519 | } 520 | 521 | function functionList( transform ) { 522 | return transform.replace(/(?:\([^)]*\))|\s/g, ""); 523 | } 524 | 525 | function append( arr1, arr2, value ) { 526 | while ( value = arr2.shift() ) { 527 | arr1.push( value ); 528 | } 529 | } 530 | 531 | // converts an angle string in any unit to a radian Float 532 | function toRadian(value) { 533 | return ~value.indexOf("deg") ? 534 | parseInt(value,10) * (Math.PI * 2 / 360): 535 | ~value.indexOf("grad") ? 536 | parseInt(value,10) * (Math.PI/200): 537 | parseFloat(value); 538 | } 539 | 540 | // Converts "matrix(A,B,C,D,X,Y)" to [A,B,C,D,X,Y] 541 | function toArray(matrix) { 542 | // remove the unit of X and Y for Firefox 543 | matrix = /([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(matrix); 544 | return [matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6]]; 545 | } 546 | 547 | $.transform = { 548 | centerOrigin: "margin" 549 | }; 550 | 551 | })( jQuery, window, document, Math ); -------------------------------------------------------------------------------- /public/js/plugins/flot/jquery.flot.resize.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | 14 | /* Inline dependency: 15 | * jQuery resize event - v1.1 - 3/14/2010 16 | * http://benalman.com/projects/jquery-resize-plugin/ 17 | * 18 | * Copyright (c) 2010 "Cowboy" Ben Alman 19 | * Dual licensed under the MIT and GPL licenses. 20 | * http://benalman.com/about/license/ 21 | */ 22 | 23 | (function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); 24 | 25 | (function ($) { 26 | var options = { }; // no options 27 | 28 | function init(plot) { 29 | function onResize() { 30 | var placeholder = plot.getPlaceholder(); 31 | 32 | // somebody might have hidden us and we can't plot 33 | // when we don't have the dimensions 34 | if (placeholder.width() == 0 || placeholder.height() == 0) 35 | return; 36 | 37 | plot.resize(); 38 | plot.setupGrid(); 39 | plot.draw(); 40 | } 41 | 42 | function bindEvents(plot, eventHolder) { 43 | plot.getPlaceholder().resize(onResize); 44 | } 45 | 46 | function shutdown(plot, eventHolder) { 47 | plot.getPlaceholder().unbind("resize", onResize); 48 | } 49 | 50 | plot.hooks.bindEvents.push(bindEvents); 51 | plot.hooks.shutdown.push(shutdown); 52 | } 53 | 54 | $.plot.plugins.push({ 55 | init: init, 56 | options: options, 57 | name: 'resize', 58 | version: '1.0' 59 | }); 60 | })(jQuery); -------------------------------------------------------------------------------- /public/js/plugins/flot/jquery.flot.tooltip.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.flot.tooltip 3 | * 4 | * description: easy-to-use tooltips for Flot charts 5 | * version: 0.6.2 6 | * author: Krzysztof Urbas @krzysu [myviews.pl] 7 | * website: https://github.com/krzysu/flot.tooltip 8 | * 9 | * build on 2013-09-30 10 | * released under MIT License, 2012 11 | */ 12 | (function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("
").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); -------------------------------------------------------------------------------- /public/js/plugins/morris/morris-data.js: -------------------------------------------------------------------------------- 1 | // Morris.js Charts sample data for SB Admin template 2 | 3 | $(function() { 4 | 5 | // Area Chart 6 | Morris.Area({ 7 | element: 'morris-area-chart', 8 | data: [{ 9 | period: '2010 Q1', 10 | iphone: 2666, 11 | ipad: null, 12 | itouch: 2647 13 | }, { 14 | period: '2010 Q2', 15 | iphone: 2778, 16 | ipad: 2294, 17 | itouch: 2441 18 | }, { 19 | period: '2010 Q3', 20 | iphone: 4912, 21 | ipad: 1969, 22 | itouch: 2501 23 | }, { 24 | period: '2010 Q4', 25 | iphone: 3767, 26 | ipad: 3597, 27 | itouch: 5689 28 | }, { 29 | period: '2011 Q1', 30 | iphone: 6810, 31 | ipad: 1914, 32 | itouch: 2293 33 | }, { 34 | period: '2011 Q2', 35 | iphone: 5670, 36 | ipad: 4293, 37 | itouch: 1881 38 | }, { 39 | period: '2011 Q3', 40 | iphone: 4820, 41 | ipad: 3795, 42 | itouch: 1588 43 | }, { 44 | period: '2011 Q4', 45 | iphone: 15073, 46 | ipad: 5967, 47 | itouch: 5175 48 | }, { 49 | period: '2012 Q1', 50 | iphone: 10687, 51 | ipad: 4460, 52 | itouch: 2028 53 | }, { 54 | period: '2012 Q2', 55 | iphone: 8432, 56 | ipad: 5713, 57 | itouch: 1791 58 | }], 59 | xkey: 'period', 60 | ykeys: ['iphone', 'ipad', 'itouch'], 61 | labels: ['iPhone', 'iPad', 'iPod Touch'], 62 | pointSize: 2, 63 | hideHover: 'auto', 64 | resize: true 65 | }); 66 | 67 | // Donut Chart 68 | Morris.Donut({ 69 | element: 'morris-donut-chart', 70 | data: [{ 71 | label: "Download Sales", 72 | value: 12 73 | }, { 74 | label: "In-Store Sales", 75 | value: 30 76 | }, { 77 | label: "Mail-Order Sales", 78 | value: 20 79 | }], 80 | resize: true 81 | }); 82 | 83 | // Line Chart 84 | Morris.Line({ 85 | // ID of the element in which to draw the chart. 86 | element: 'morris-line-chart', 87 | // Chart data records -- each entry in this array corresponds to a point on 88 | // the chart. 89 | data: [{ 90 | d: '2012-10-01', 91 | visits: 802 92 | }, { 93 | d: '2012-10-02', 94 | visits: 783 95 | }, { 96 | d: '2012-10-03', 97 | visits: 820 98 | }, { 99 | d: '2012-10-04', 100 | visits: 839 101 | }, { 102 | d: '2012-10-05', 103 | visits: 792 104 | }, { 105 | d: '2012-10-06', 106 | visits: 859 107 | }, { 108 | d: '2012-10-07', 109 | visits: 790 110 | }, { 111 | d: '2012-10-08', 112 | visits: 1680 113 | }, { 114 | d: '2012-10-09', 115 | visits: 1592 116 | }, { 117 | d: '2012-10-10', 118 | visits: 1420 119 | }, { 120 | d: '2012-10-11', 121 | visits: 882 122 | }, { 123 | d: '2012-10-12', 124 | visits: 889 125 | }, { 126 | d: '2012-10-13', 127 | visits: 819 128 | }, { 129 | d: '2012-10-14', 130 | visits: 849 131 | }, { 132 | d: '2012-10-15', 133 | visits: 870 134 | }, { 135 | d: '2012-10-16', 136 | visits: 1063 137 | }, { 138 | d: '2012-10-17', 139 | visits: 1192 140 | }, { 141 | d: '2012-10-18', 142 | visits: 1224 143 | }, { 144 | d: '2012-10-19', 145 | visits: 1329 146 | }, { 147 | d: '2012-10-20', 148 | visits: 1329 149 | }, { 150 | d: '2012-10-21', 151 | visits: 1239 152 | }, { 153 | d: '2012-10-22', 154 | visits: 1190 155 | }, { 156 | d: '2012-10-23', 157 | visits: 1312 158 | }, { 159 | d: '2012-10-24', 160 | visits: 1293 161 | }, { 162 | d: '2012-10-25', 163 | visits: 1283 164 | }, { 165 | d: '2012-10-26', 166 | visits: 1248 167 | }, { 168 | d: '2012-10-27', 169 | visits: 1323 170 | }, { 171 | d: '2012-10-28', 172 | visits: 1390 173 | }, { 174 | d: '2012-10-29', 175 | visits: 1420 176 | }, { 177 | d: '2012-10-30', 178 | visits: 1529 179 | }, { 180 | d: '2012-10-31', 181 | visits: 1892 182 | }, ], 183 | // The name of the data record attribute that contains x-visitss. 184 | xkey: 'd', 185 | // A list of names of data record attributes that contain y-visitss. 186 | ykeys: ['visits'], 187 | // Labels for the ykeys -- will be displayed when you hover over the 188 | // chart. 189 | labels: ['Visits'], 190 | // Disables line smoothing 191 | smooth: false, 192 | resize: true 193 | }); 194 | 195 | // Bar Chart 196 | Morris.Bar({ 197 | element: 'morris-bar-chart', 198 | data: [{ 199 | device: 'iPhone', 200 | geekbench: 136 201 | }, { 202 | device: 'iPhone 3G', 203 | geekbench: 137 204 | }, { 205 | device: 'iPhone 3GS', 206 | geekbench: 275 207 | }, { 208 | device: 'iPhone 4', 209 | geekbench: 380 210 | }, { 211 | device: 'iPhone 4S', 212 | geekbench: 655 213 | }, { 214 | device: 'iPhone 5', 215 | geekbench: 1571 216 | }], 217 | xkey: 'device', 218 | ykeys: ['geekbench'], 219 | labels: ['Geekbench'], 220 | barRatio: 0.4, 221 | xLabelAngle: 35, 222 | hideHover: 'auto', 223 | resize: true 224 | }); 225 | 226 | 227 | }); 228 | --------------------------------------------------------------------------------