commit feb864dc47ed6475308a46fc81ce8250ee746dea
Author: Lorenzo Iovino
Date: Fri Jan 29 13:14:27 2016 +0100
First Commit
diff --git a/hackatonApp/.bowerrc b/hackatonApp/.bowerrc
new file mode 100644
index 0000000..e28246d
--- /dev/null
+++ b/hackatonApp/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "www/lib"
+}
diff --git a/hackatonApp/.gitignore b/hackatonApp/.gitignore
new file mode 100644
index 0000000..7f8fb45
--- /dev/null
+++ b/hackatonApp/.gitignore
@@ -0,0 +1,32 @@
+# Specifies intentionally untracked files to ignore when using Git
+# http://git-scm.com/docs/gitignore
+
+google_play_assets/
+apple_assets/
+showcase/
+
+node_modules/
+platforms/
+plugins/
+hooks/after_prepare/030_clean_dev_files_from_platforms.js
+hooks/after_prepare/040_move_dist_files_to_platforms.js
+hooks/after_prepare/050_clean_obfuscation.js
+hooks/after_prepare/060_add_platform_class.js
+tmp/
+dist/
+www/dist/
+www/fonts/
+.DS_Store
+www/js/templates.js
+www/js/views.js
+www/css/ionic.app.min.css
+www/css/ionic.app.css
+www/lib/
+www/js/tracking-config.js
+
+envato/
+RELEASE/
+UPLOAD/
+scss_copy/
+gulp-tasks/distribution.copy.js
+APK/
diff --git a/hackatonApp/CHANGELOG.md b/hackatonApp/CHANGELOG.md
new file mode 100644
index 0000000..5bce66e
--- /dev/null
+++ b/hackatonApp/CHANGELOG.md
@@ -0,0 +1,63 @@
+Version 1.3 - released 8 August 2015
+
+## Misc
+- Improved and eased build process
+- Update Ionic Version to v.1.0.1
+- Update cordova plugins
+- Update ngcordova
+- Added whitelist plugins
+- Added Content-Security-Policy
+- Add Sass sourcemaps to ease debugging of the app
+- Refactor project structure
+- Added youtube javascript API to manage youtube videos
+
+## Bug fixes
+- Image picker plugin error on android build
+- Geolocation undefined coords
+
+## New Features
+- Preload images (improves UX as important images are preloaded using a loader before showing them to the user)
+- Multimedia background (change auth background with a Multimedia one which enables you to use gifs or images as full backgrounds)
+- New directive in order to open all external links using inAppBrowser plugin
+
+## Styles
+- Refactor Sass files structure
+- Improved and eased customization of the app (Added theme.variables.scss with different color schemes)
+
+## Documentation
+- Brand new documentation!
+
+
+Version 1.2.0
+
+## Misc
+- Improved and ease build process
+- Update Ionic Version to v.1.0.0
+
+Version 1.1.0
+
+## New Features
+- Bookmark functionality to feeds and wordpress posts
+- Tinder cards
+- Profile page
+- Image picker
+- iAd - Apple mobile ad service
+
+## Others
+- Update Ionic version to 1.0.0-rc.1
+- Added DOCUMENTATION.md with the documentation link
+- Refactoring of some controlleres and services
+- Added config.js with the app configurations
+- Changed href for ui-sref
+- Created Layouts section
+- Remove ionicons dependency as they are now part of ionic 1.0.0-rc.1
+
+## Bugs
+- Fixed push notifications bug for iOS
+- iframe content scrolling unstable in ionic, waiting for a fix until enabling it again
+
+## Wordpress:
+- Support for embeding audio posts
+- Changed WP blog source
+- Improves to avoid CORS issues
+- Removed fixed image on posts
diff --git a/hackatonApp/DOCUMENTATION.md b/hackatonApp/DOCUMENTATION.md
new file mode 100644
index 0000000..3aa83a7
--- /dev/null
+++ b/hackatonApp/DOCUMENTATION.md
@@ -0,0 +1 @@
+You can find ionFullApp documentation here: https://docs.google.com/document/d/1Oh0EfqUCzzPoUdHiSFcxykTy65afY7g4mHz3wXtBabo/edit?usp=sharing
diff --git a/hackatonApp/README.md b/hackatonApp/README.md
new file mode 100644
index 0000000..3b6c603
--- /dev/null
+++ b/hackatonApp/README.md
@@ -0,0 +1,50 @@
+Your Ionic project is ready to go! Some quick tips:
+
+* cd into your project:
+```
+cd ionFullApp
+```
+
+* Setup this project to use Sass:
+```
+ionic setup sass
+```
+
+* Develop in the browser with live reload:
+```
+ionic serve
+```
+
+* Add a platform (ios or Android):
+```
+ionic platform add ios [android]
+```
+
+Note: iOS development requires OS X currently
+See the Android Platform Guide for full Android installation instructions:
+https://cordova.apache.org/docs/en/edge/guide_platforms_android_index.md.html
+
+* Build your app:
+```
+ionic build
+```
+
+* Simulate your app:
+```
+ionic emulate
+```
+
+* Run your app on a device:
+```
+ionic run
+```
+
+* Package an app using Ionic package service:
+```
+ionic package
+```
+
+For more help use ```ionic --help``` or visit the Ionic docs: http://ionicframework.com/docs
+
+
+You can find the documentation here: http://bit.ly/ionicthemes-ionfullapp
diff --git a/hackatonApp/bower.json b/hackatonApp/bower.json
new file mode 100644
index 0000000..cb920c1
--- /dev/null
+++ b/hackatonApp/bower.json
@@ -0,0 +1,21 @@
+{
+ "name": "ionFullApp",
+ "private": "true",
+ "devDependencies": {
+ "ionic": "driftyco/ionic-bower#1.0.1"
+ },
+ "dependencies": {
+ "underscore": "~1.8.3",
+ "ngmap": "~1.9.0",
+ "angular-moment": "~0.10.1",
+ "angular-resource": "~1.3.11",
+ "ngCordova": "~0.1.17-alpha",
+ "angular-slugify": "williamboman/angular-slugify",
+ "ionic-contrib-tinder-cards": "*",
+ "bourbon": "~4.2.3",
+ "angular-youtube-mb": "~1.1.0"
+ },
+ "resolutions": {
+ "angular": "~1.4.0"
+ }
+}
diff --git a/hackatonApp/config.xml b/hackatonApp/config.xml
new file mode 100644
index 0000000..10e8a9d
--- /dev/null
+++ b/hackatonApp/config.xml
@@ -0,0 +1,81 @@
+
+
+ ionFullApp
+
+ An Ionic Framework and Cordova project.
+
+
+ StartApp Labs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/gulp-tasks/default.js b/hackatonApp/gulp-tasks/default.js
new file mode 100644
index 0000000..b0a6f56
--- /dev/null
+++ b/hackatonApp/gulp-tasks/default.js
@@ -0,0 +1,56 @@
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var bower = require('bower');
+var sass = require('gulp-sass');
+var sh = require('shelljs');
+
+var sourcemaps = require('gulp-sourcemaps');
+var templateCache = require('gulp-angular-templatecache');
+
+var paths = {
+ sass: ['./scss/**/*.scss'],
+ templatecache: ['./www/views/**/*.html']
+};
+
+gulp.task('sass', function(done) {
+ gulp.src('./scss/ionic.app.scss')
+ .pipe(sourcemaps.init())
+ .pipe(sass({
+ errLogToConsole: true
+ }))
+ .pipe(sourcemaps.write())
+ .pipe(gulp.dest('./www/css/'))
+ .on('end', done);
+});
+
+gulp.task('templatecache', function (done) {
+ gulp.src(paths.templatecache)
+ .pipe(templateCache({standalone:true, filename:'views.js', module:'your_app_name.views', root:'views/'}))
+ .pipe(gulp.dest('./www/js/'))
+ .on('end', done);
+});
+
+gulp.task('watch', function() {
+ gulp.watch(paths.sass, ['sass']);
+ gulp.watch(paths.templatecache, ['templatecache']);
+});
+
+gulp.task('install', ['git-check'], function() {
+ return bower.commands.install()
+ .on('log', function(data) {
+ gutil.log('bower', gutil.colors.cyan(data.id), data.message);
+ });
+});
+
+gulp.task('git-check', function(done) {
+ if (!sh.which('git')) {
+ console.log(
+ ' ' + gutil.colors.red('Git is not installed.'),
+ '\n Git, the version control system, is required to download Ionic.',
+ '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.',
+ '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.'
+ );
+ process.exit(1);
+ }
+ done();
+});
diff --git a/hackatonApp/gulpfile.js b/hackatonApp/gulpfile.js
new file mode 100644
index 0000000..fa63ce4
--- /dev/null
+++ b/hackatonApp/gulpfile.js
@@ -0,0 +1,6 @@
+var gulp = require('gulp');
+
+var requireDir = require('require-dir');
+requireDir('./gulp-tasks');
+
+gulp.task('default', ['sass', 'templatecache']);
diff --git a/hackatonApp/hooks/README.md b/hackatonApp/hooks/README.md
new file mode 100644
index 0000000..d2563ea
--- /dev/null
+++ b/hackatonApp/hooks/README.md
@@ -0,0 +1,83 @@
+
+# Cordova Hooks
+
+This directory may contain scripts used to customize cordova commands. This
+directory used to exist at `.cordova/hooks`, but has now been moved to the
+project root. Any scripts you add to these directories will be executed before
+and after the commands corresponding to the directory name. Useful for
+integrating your own build systems or integrating with version control systems.
+
+__Remember__: Make your scripts executable.
+
+## Hook Directories
+The following subdirectories will be used for hooks:
+
+ after_build/
+ after_compile/
+ after_docs/
+ after_emulate/
+ after_platform_add/
+ after_platform_rm/
+ after_platform_ls/
+ after_plugin_add/
+ after_plugin_ls/
+ after_plugin_rm/
+ after_plugin_search/
+ after_prepare/
+ after_run/
+ after_serve/
+ before_build/
+ before_compile/
+ before_docs/
+ before_emulate/
+ before_platform_add/
+ before_platform_rm/
+ before_platform_ls/
+ before_plugin_add/
+ before_plugin_ls/
+ before_plugin_rm/
+ before_plugin_search/
+ before_prepare/
+ before_run/
+ before_serve/
+ pre_package/ <-- Windows 8 and Windows Phone only.
+
+## Script Interface
+
+All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:
+
+* CORDOVA_VERSION - The version of the Cordova-CLI.
+* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
+* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
+* CORDOVA_HOOK - Path to the hook that is being executed.
+* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)
+
+If a script returns a non-zero exit code, then the parent cordova command will be aborted.
+
+
+## Writing hooks
+
+We highly recommend writting your hooks using Node.js so that they are
+cross-platform. Some good examples are shown here:
+
+[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)
+
diff --git a/hackatonApp/hooks/after_prepare/010_add_platform_class.js b/hackatonApp/hooks/after_prepare/010_add_platform_class.js
new file mode 100644
index 0000000..bda3e41
--- /dev/null
+++ b/hackatonApp/hooks/after_prepare/010_add_platform_class.js
@@ -0,0 +1,94 @@
+#!/usr/bin/env node
+
+// Add Platform Class
+// v1.0
+// Automatically adds the platform class to the body tag
+// after the `prepare` command. By placing the platform CSS classes
+// directly in the HTML built for the platform, it speeds up
+// rendering the correct layout/style for the specific platform
+// instead of waiting for the JS to figure out the correct classes.
+
+var fs = require('fs');
+var path = require('path');
+
+var rootdir = process.argv[2];
+
+function addPlatformBodyTag(indexPath, platform) {
+ // add the platform class to the body tag
+ try {
+ var platformClass = 'platform-' + platform;
+ var cordovaClass = 'platform-cordova platform-webview';
+
+ var html = fs.readFileSync(indexPath, 'utf8');
+
+ var bodyTag = findBodyTag(html);
+ if(!bodyTag) return; // no opening body tag, something's wrong
+
+ if(bodyTag.indexOf(platformClass) > -1) return; // already added
+
+ var newBodyTag = bodyTag;
+
+ var classAttr = findClassAttr(bodyTag);
+ if(classAttr) {
+ // body tag has existing class attribute, add the classname
+ var endingQuote = classAttr.substring(classAttr.length-1);
+ var newClassAttr = classAttr.substring(0, classAttr.length-1);
+ newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote;
+ newBodyTag = bodyTag.replace(classAttr, newClassAttr);
+
+ } else {
+ // add class attribute to the body tag
+ newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">');
+ }
+
+ html = html.replace(bodyTag, newBodyTag);
+
+ fs.writeFileSync(indexPath, html, 'utf8');
+
+ process.stdout.write('add to body class: ' + platformClass + '\n');
+ } catch(e) {
+ process.stdout.write(e);
+ }
+}
+
+function findBodyTag(html) {
+ // get the body tag
+ try{
+ return html.match(/])(.*?)>/gi)[0];
+ }catch(e){}
+}
+
+function findClassAttr(bodyTag) {
+ // get the body tag's class attribute
+ try{
+ return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0];
+ }catch(e){}
+}
+
+if (rootdir) {
+
+ // go through each of the platform directories that have been prepared
+ var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
+
+ for(var x=0; x 0) {
+ process.exit(1);
+ }
+ });
+ });
+}
+
+function lintFile(file, callback) {
+ console.log("Linting " + file);
+ fs.readFile(file, function(err, data) {
+ if(err) {
+ console.log('Error: ' + err);
+ return;
+ }
+ if(jshint(data.toString())) {
+ console.log('File ' + file + ' has no errors.');
+ console.log('-----------------------------------------');
+ callback(false);
+ } else {
+ console.log('Errors in file ' + file);
+ var out = jshint.data(),
+ errors = out.errors;
+ for(var j = 0; j < errors.length; j++) {
+ console.log(errors[j].line + ':' + errors[j].character + ' -> ' + errors[j].reason + ' -> ' +
+errors[j].evidence);
+ }
+ console.log('-----------------------------------------');
+ callback(true);
+ }
+ });
+}
diff --git a/hackatonApp/ionic.project b/hackatonApp/ionic.project
new file mode 100644
index 0000000..014394c
--- /dev/null
+++ b/hackatonApp/ionic.project
@@ -0,0 +1,14 @@
+{
+ "name": "ionFullApp",
+ "app_id": "",
+ "gulpStartupTasks": [
+ "sass",
+ "templatecache",
+ "watch"
+ ],
+ "watchPatterns": [
+ "www/**/*",
+ "!www/lib/**/*"
+ ],
+ "documentRoot": "www"
+}
\ No newline at end of file
diff --git a/hackatonApp/package.json b/hackatonApp/package.json
new file mode 100644
index 0000000..f0ea8e8
--- /dev/null
+++ b/hackatonApp/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "ionfullapp",
+ "version": "1.2.0",
+ "description": "ionFullApp: An Ionic starter project",
+ "dependencies": {
+ "async": "^1.4.0",
+ "bower": "^1.3.3",
+ "gulp": "^3.5.6",
+ "gulp-angular-templatecache": "^1.5.0",
+ "gulp-sass": "^1.3.3",
+ "gulp-sourcemaps": "^1.5.2",
+ "gulp-util": "^2.2.14",
+ "require-dir": "^0.3.0",
+ "shelljs": "^0.3.0"
+ },
+ "devDependencies": {
+ "del": "^1.2.0",
+ "gulp-flatten": "^0.1.1",
+ "gulp-if": "^1.2.5",
+ "gulp-json-editor": "^2.2.1",
+ "gulp-minify-css": "^1.2.0",
+ "gulp-ng-annotate": "^1.1.0",
+ "gulp-ng-constant": "^0.3.0",
+ "gulp-preprocess": "^1.2.0",
+ "gulp-rename": "^1.2.2",
+ "gulp-shell": "^0.4.2",
+ "gulp-uglify": "^1.2.0",
+ "gulp-useref": "^1.2.0",
+ "jshint": "^2.8.0",
+ "minimist": "^1.1.2",
+ "mv": "^2.1.1"
+ },
+ "cordovaPlugins": [
+ "https://github.com/phonegap-build/PushPlugin.git",
+ "com.ionic.keyboard",
+ "org.pushandplay.cordova.apprate",
+ "https://github.com/katzer/cordova-plugin-email-composer.git",
+ "cordova-plugin-extension",
+ "cordova-plugin-console@^1.0.1",
+ "cordova-plugin-device@^1.0.1",
+ "cordova-plugin-dialogs@^1.1.1",
+ "cordova-plugin-globalization@^1.0.1",
+ "cordova-plugin-whitelist@1.0.0",
+ "cordova-plugin-admobpro",
+ "com.rjfun.cordova.iad",
+ "cordova-plugin-inappbrowser",
+ "nl.x-services.plugins.socialsharing",
+ "com.synconset.imagepicker",
+ "cordova-plugin-geolocation",
+ "cordova-plugin-splashscreen"
+ ],
+ "cordovaPlatforms": [
+ "ios",
+ "android"
+ ]
+}
\ No newline at end of file
diff --git a/hackatonApp/resources/android/icon/drawable-hdpi-icon.png b/hackatonApp/resources/android/icon/drawable-hdpi-icon.png
new file mode 100644
index 0000000..81f50fc
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-hdpi-icon.png differ
diff --git a/hackatonApp/resources/android/icon/drawable-ldpi-icon.png b/hackatonApp/resources/android/icon/drawable-ldpi-icon.png
new file mode 100644
index 0000000..84bc9ed
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-ldpi-icon.png differ
diff --git a/hackatonApp/resources/android/icon/drawable-mdpi-icon.png b/hackatonApp/resources/android/icon/drawable-mdpi-icon.png
new file mode 100644
index 0000000..05ac11d
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-mdpi-icon.png differ
diff --git a/hackatonApp/resources/android/icon/drawable-xhdpi-icon.png b/hackatonApp/resources/android/icon/drawable-xhdpi-icon.png
new file mode 100644
index 0000000..a6ce12f
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-xhdpi-icon.png differ
diff --git a/hackatonApp/resources/android/icon/drawable-xxhdpi-icon.png b/hackatonApp/resources/android/icon/drawable-xxhdpi-icon.png
new file mode 100644
index 0000000..46a4651
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-xxhdpi-icon.png differ
diff --git a/hackatonApp/resources/android/icon/drawable-xxxhdpi-icon.png b/hackatonApp/resources/android/icon/drawable-xxxhdpi-icon.png
new file mode 100644
index 0000000..d8ffef2
Binary files /dev/null and b/hackatonApp/resources/android/icon/drawable-xxxhdpi-icon.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-hdpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-hdpi-screen.png
new file mode 100644
index 0000000..9827689
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-hdpi-screen.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-ldpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-ldpi-screen.png
new file mode 100644
index 0000000..620454c
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-ldpi-screen.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-mdpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-mdpi-screen.png
new file mode 100644
index 0000000..c5b61fa
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-mdpi-screen.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-xhdpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-xhdpi-screen.png
new file mode 100644
index 0000000..d6a5f65
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-xhdpi-screen.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-xxhdpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-xxhdpi-screen.png
new file mode 100644
index 0000000..33186e3
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-xxhdpi-screen.png differ
diff --git a/hackatonApp/resources/android/splash/drawable-port-xxxhdpi-screen.png b/hackatonApp/resources/android/splash/drawable-port-xxxhdpi-screen.png
new file mode 100644
index 0000000..1ca50d3
Binary files /dev/null and b/hackatonApp/resources/android/splash/drawable-port-xxxhdpi-screen.png differ
diff --git a/hackatonApp/resources/icon.png b/hackatonApp/resources/icon.png
new file mode 100644
index 0000000..5da0fe9
Binary files /dev/null and b/hackatonApp/resources/icon.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-40.png b/hackatonApp/resources/ios/icon/icon-40.png
new file mode 100644
index 0000000..690938d
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-40.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-40@2x.png b/hackatonApp/resources/ios/icon/icon-40@2x.png
new file mode 100644
index 0000000..5464020
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-40@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-50.png b/hackatonApp/resources/ios/icon/icon-50.png
new file mode 100644
index 0000000..a7ca814
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-50.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-50@2x.png b/hackatonApp/resources/ios/icon/icon-50@2x.png
new file mode 100644
index 0000000..51e5734
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-50@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-60.png b/hackatonApp/resources/ios/icon/icon-60.png
new file mode 100644
index 0000000..fa74fda
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-60.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-60@2x.png b/hackatonApp/resources/ios/icon/icon-60@2x.png
new file mode 100644
index 0000000..4b5a4d8
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-60@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-60@3x.png b/hackatonApp/resources/ios/icon/icon-60@3x.png
new file mode 100644
index 0000000..4e7b077
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-60@3x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-72.png b/hackatonApp/resources/ios/icon/icon-72.png
new file mode 100644
index 0000000..81f50fc
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-72.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-72@2x.png b/hackatonApp/resources/ios/icon/icon-72@2x.png
new file mode 100644
index 0000000..46a4651
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-72@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-76.png b/hackatonApp/resources/ios/icon/icon-76.png
new file mode 100644
index 0000000..588bd63
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-76.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-76@2x.png b/hackatonApp/resources/ios/icon/icon-76@2x.png
new file mode 100644
index 0000000..d0867b1
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-76@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-small.png b/hackatonApp/resources/ios/icon/icon-small.png
new file mode 100644
index 0000000..3467775
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-small.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-small@2x.png b/hackatonApp/resources/ios/icon/icon-small@2x.png
new file mode 100644
index 0000000..acfae69
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-small@2x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon-small@3x.png b/hackatonApp/resources/ios/icon/icon-small@3x.png
new file mode 100644
index 0000000..b463190
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon-small@3x.png differ
diff --git a/hackatonApp/resources/ios/icon/icon.png b/hackatonApp/resources/ios/icon/icon.png
new file mode 100644
index 0000000..5dd713b
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon.png differ
diff --git a/hackatonApp/resources/ios/icon/icon@2x.png b/hackatonApp/resources/ios/icon/icon@2x.png
new file mode 100644
index 0000000..98278ca
Binary files /dev/null and b/hackatonApp/resources/ios/icon/icon@2x.png differ
diff --git a/hackatonApp/resources/ios/splash/Default-568h@2x~iphone.png b/hackatonApp/resources/ios/splash/Default-568h@2x~iphone.png
new file mode 100644
index 0000000..5d2460c
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default-568h@2x~iphone.png differ
diff --git a/hackatonApp/resources/ios/splash/Default-667h.png b/hackatonApp/resources/ios/splash/Default-667h.png
new file mode 100644
index 0000000..4749bbc
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default-667h.png differ
diff --git a/hackatonApp/resources/ios/splash/Default-736h.png b/hackatonApp/resources/ios/splash/Default-736h.png
new file mode 100644
index 0000000..42748a9
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default-736h.png differ
diff --git a/hackatonApp/resources/ios/splash/Default-Portrait@2x~ipad.png b/hackatonApp/resources/ios/splash/Default-Portrait@2x~ipad.png
new file mode 100644
index 0000000..a5004a0
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default-Portrait@2x~ipad.png differ
diff --git a/hackatonApp/resources/ios/splash/Default-Portrait~ipad.png b/hackatonApp/resources/ios/splash/Default-Portrait~ipad.png
new file mode 100644
index 0000000..0ac49a2
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default-Portrait~ipad.png differ
diff --git a/hackatonApp/resources/ios/splash/Default@2x~iphone.png b/hackatonApp/resources/ios/splash/Default@2x~iphone.png
new file mode 100644
index 0000000..5eecb1c
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default@2x~iphone.png differ
diff --git a/hackatonApp/resources/ios/splash/Default~iphone.png b/hackatonApp/resources/ios/splash/Default~iphone.png
new file mode 100644
index 0000000..c5b61fa
Binary files /dev/null and b/hackatonApp/resources/ios/splash/Default~iphone.png differ
diff --git a/hackatonApp/resources/splash.png b/hackatonApp/resources/splash.png
new file mode 100644
index 0000000..3d7b358
Binary files /dev/null and b/hackatonApp/resources/splash.png differ
diff --git a/hackatonApp/scss/auth/auth.styles.scss b/hackatonApp/scss/auth/auth.styles.scss
new file mode 100644
index 0000000..fda6744
--- /dev/null
+++ b/hackatonApp/scss/auth/auth.styles.scss
@@ -0,0 +1,73 @@
+.auth-outer
+{
+ background-color: transparent !important;
+
+ ion-view
+ {
+ background-color: transparent;
+ box-shadow: none !important; // Need to set this with important to prevent awefull vertical line when transitioning
+ }
+
+ ion-header-bar
+ {
+ background-color: transparent;
+
+ *
+ {
+ color: $auth-color;
+ }
+ }
+}
+
+.auth-view
+{
+ .row
+ {
+ height: 100%;
+ }
+
+ .bottom-content
+ {
+ padding-top: 0px;
+ border: none;
+
+ .button
+ {
+ margin: 0px;
+ font-weight: bold;
+ }
+ }
+
+ .alternative-actions
+ {
+ margin: 0px 10px;
+
+ .button
+ {
+ padding: 0px;
+ font-size: 14px;
+ }
+
+ .sign-up
+ {
+ float: right;
+ }
+ }
+}
+
+.toggle-view-anchor
+{
+ height: $line-height-computed + $font-size-base;
+ line-height: $line-height-computed + $font-size-base;
+ position: absolute;
+ right: 0px;
+ text-transform: uppercase;
+ font-size: 24px;
+ font-weight: 500;
+ color: $show-hide-password-color;
+
+ *
+ {
+ color: $show-hide-password-color;
+ }
+}
diff --git a/hackatonApp/scss/auth/auth.variables.scss b/hackatonApp/scss/auth/auth.variables.scss
new file mode 100644
index 0000000..2756357
--- /dev/null
+++ b/hackatonApp/scss/auth/auth.variables.scss
@@ -0,0 +1,7 @@
+$auth-color: #FFFFFF;
+$show-hide-password-color: lighten(#444444, 25%);
+$auth-tabs-highlight: $theme-color-1;
+$auth-tabs-bg: $theme-color-3;
+$auth-tabs-color: darken($auth-color, 10%);
+$auth-login-btn-bg: rgba($theme-color-1, .8);
+$auth-signup-btn-bg: rgba($theme-color-2, .8);
diff --git a/hackatonApp/scss/auth/forgot-password.styles.scss b/hackatonApp/scss/auth/forgot-password.styles.scss
new file mode 100644
index 0000000..26ebf6a
--- /dev/null
+++ b/hackatonApp/scss/auth/forgot-password.styles.scss
@@ -0,0 +1,7 @@
+.forgot-password-view
+{
+ .forgot-password-container
+ {
+ margin-bottom: 0px;
+ }
+}
diff --git a/hackatonApp/scss/auth/login.styles.scss b/hackatonApp/scss/auth/login.styles.scss
new file mode 100644
index 0000000..f7ca29f
--- /dev/null
+++ b/hackatonApp/scss/auth/login.styles.scss
@@ -0,0 +1,66 @@
+.login-view
+{
+ // Fix tabs animation on iOS
+ // Fix initial blink before angular loaded: http://stackoverflow.com/a/14076004/1116959
+ [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak
+ {
+ display: none !important;
+ }
+ .tab-content.ng-hide
+ {
+ display: none !important;
+ }
+
+ .tab-content.ng-hide-add.ng-hide-add-active,
+ .tab-content.ng-hide-remove.ng-hide-remove-active
+ {
+ @include transition(all 0s ease);
+ }
+
+ .tabs
+ {
+ .tab-item
+ {
+ font-weight: bold;
+ text-transform: uppercase;
+ background: $auth-tabs-bg;
+ color: $auth-tabs-color;
+ @include transition(all 0.1s ease);
+ }
+
+ .tab-item.active,
+ .tab-item.activated
+ {
+ margin-top: 0;
+ margin-bottom: -2px;
+ border-width: 0px 0px 4px 0px !important;
+ border-color: $auth-tabs-highlight !important;
+ border-style: solid;
+ }
+ }
+
+ .login-container
+ {
+ margin-bottom: 0px;
+
+ .card-heding
+ {
+ padding: 0px;
+ height: $tabs-height;
+
+ .tabs
+ {
+ top: 0px;
+ padding-top: 0;
+ background-position: bottom;
+ border-top-width: 0;
+ border-bottom-width: 1px;
+ }
+
+ .tab-item
+ {
+ max-width: none;
+ }
+ }
+ }
+}
diff --git a/hackatonApp/scss/auth/signup.styles.scss b/hackatonApp/scss/auth/signup.styles.scss
new file mode 100644
index 0000000..72fec28
--- /dev/null
+++ b/hackatonApp/scss/auth/signup.styles.scss
@@ -0,0 +1,7 @@
+.signup-view
+{
+ .sign-up-container
+ {
+ margin-bottom: 0px;
+ }
+}
diff --git a/hackatonApp/scss/auth/walkthrough.styles.scss b/hackatonApp/scss/auth/walkthrough.styles.scss
new file mode 100644
index 0000000..3cf9842
--- /dev/null
+++ b/hackatonApp/scss/auth/walkthrough.styles.scss
@@ -0,0 +1,38 @@
+.walkthrough-view
+{
+ .top-content
+ {
+ height: 75%;
+ text-align: center;
+
+ h1
+ {
+ color: $auth-color;
+ }
+ }
+
+ .bottom-content
+ {
+ height: 25%;
+ padding-top: 5px;
+ margin-top: 0px;
+
+ .button
+ {
+ border: none;
+ color: $auth-color;
+ font-weight: bolder;
+ font-size: 20px;
+ }
+
+ .login.button
+ {
+ background-color: $auth-login-btn-bg;
+ }
+
+ .sign-up.button
+ {
+ background-color: $auth-signup-btn-bg;
+ }
+ }
+}
diff --git a/hackatonApp/scss/bookmarks/bookmarks.styles.scss b/hackatonApp/scss/bookmarks/bookmarks.styles.scss
new file mode 100644
index 0000000..a76a439
--- /dev/null
+++ b/hackatonApp/scss/bookmarks/bookmarks.styles.scss
@@ -0,0 +1,75 @@
+.bookmarks-view
+{
+ background-color: $content-bg;
+
+ .scroll-content .scroll,
+ .bookmarks-container
+ {
+ height: 100%;
+ }
+
+ .empty-results
+ {
+ text-align: center;
+
+ .icon
+ {
+ font-size: 170px;
+ color: lighten($content-bg, 10);
+ }
+
+ .no-bookmarks
+ {
+ color: darken($content-bg, 10);
+ font-size: 22px;
+ }
+ }
+
+
+ .bookmarks-list
+ {
+ overflow-y: scroll;
+ height: 100%;
+ }
+
+ // Fix scrollbar style introduced on ionic v1rc1
+ .bookmarks-list::-webkit-scrollbar
+ {
+ display: none !important;
+ width: 0 !important;
+ }
+
+ .bookmark-item
+ {
+ padding: 10px 0px;
+ border-bottom: 1px solid rgba(darken($content-color, 15), .2);
+ margin: 0px 16px;
+
+ *
+ {
+ text-decoration: none;
+ color: $content-color;
+ }
+
+ .post-title
+ {
+ margin: 0px;
+ font-size: 20px;
+ font-weight: 300;
+ letter-spacing: -1px;
+ }
+
+ .post-date
+ {
+ margin: 0px;
+ font-size: 12px;
+ font-weight: 200;
+ color: rgba(lighten($content-color, 10), .7);
+ }
+
+ .post-time
+ {
+ color: rgba(darken($content-color, 10), .9);
+ }
+ }
+}
diff --git a/hackatonApp/scss/bookmarks/bookmarks.variables.scss b/hackatonApp/scss/bookmarks/bookmarks.variables.scss
new file mode 100644
index 0000000..e69de29
diff --git a/hackatonApp/scss/common/common.styles.scss b/hackatonApp/scss/common/common.styles.scss
new file mode 100644
index 0000000..c3250d0
--- /dev/null
+++ b/hackatonApp/scss/common/common.styles.scss
@@ -0,0 +1,150 @@
+// General reset styles
+*
+{
+ color: $content-color;
+}
+
+.bar.app-top-bar
+{
+ background-color: $top-bar-bg;
+
+ .title
+ {
+ color: $top-bar-color !important;
+ *
+ {
+ color: $top-bar-color !important;
+ }
+ }
+
+ .button
+ {
+ color: $top-bar-color !important;
+ *
+ {
+ color: $top-bar-color !important;
+ }
+ }
+}
+
+// Preload images aux styles (ratios)
+// Auto generate ratios for the whole app (see: http://stackoverflow.com/a/18120181/1116959)
+@each $ratio in $pre-img-ratios {
+ .pre-img._#{nth($ratio, 1)}_#{nth($ratio, 2)}
+ {
+ // Conserve aspect ratio (see: http://stackoverflow.com/a/10441480/1116959)
+ width: 100%;
+ padding-bottom: #{(nth($ratio, 2) / nth($ratio, 1)) * 100}%;
+ }
+}
+
+.pre-img
+{
+ position: relative;
+ background-color: $pre-img-bg;
+
+ // If the image is rounded
+ &.rounded-image
+ {
+ border-radius: 50%;
+ }
+
+ &.finish-loading
+ {
+ background-color: transparent;
+ border: none;
+
+ img
+ {
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+
+ img
+ {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ visibility: hidden;
+ opacity: 0;
+ @include transition(visibility 0s linear, opacity 0.5s linear);
+ }
+}
+
+// spinner-on-load
+@include keyframes(spin) {
+ from {
+ @include transform(rotate(0deg));
+ }
+ to {
+ @include transform(rotate(359deg));
+ }
+}
+.spinner-on-load
+{
+ position: absolute;
+ font-size: $spinner-size;
+ width: $spinner-size;
+ height: $spinner-size;
+ line-height: $spinner-size;
+ color: $spinner-color;
+ @include animation(spin 2s infinite linear);
+ @include calc(top, "50% - #{($spinner-size/2)}");
+ @include calc(left, "50% - #{($spinner-size/2)}");
+}
+ion-spinner.spinner-on-load
+{
+ @include animation(none);
+ stroke: $spinner-color;
+ width: $spinner-svg-size;
+ height: $spinner-svg-size;
+ line-height: inherit;
+ @include calc(top, "50% - #{($spinner-svg-size/2)}");
+ @include calc(left, "50% - #{($spinner-svg-size/2)}");
+}
+
+// Multimedia background
+.multi-bg-outer
+{
+ position: relative;
+ background-color: rgba(darken($multi-bg, 10%), 0.7);
+ height: 100%;
+ @include transition(all ease-in-out .3s);
+
+ background-size: cover;
+ background-repeat: no-repeat;
+ z-index: -2;
+
+ &.finish-loading
+ {
+ background-color: transparent;
+ }
+
+ .bg-overlay
+ {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: $overlay-bg;
+ z-index: -1;
+ opacity: 0.6;
+ }
+
+ .multi-bg
+ {
+ display: none;
+ }
+}
+
+.loading-container .loading
+{
+ background-color: $loading-background-color;
+ *
+ {
+ color: darken($loading-color, 5);
+ font-weight: 500;
+ }
+}
diff --git a/hackatonApp/scss/common/common.variables.scss b/hackatonApp/scss/common/common.variables.scss
new file mode 100644
index 0000000..439d27f
--- /dev/null
+++ b/hackatonApp/scss/common/common.variables.scss
@@ -0,0 +1,21 @@
+// Images - Preload images
+$pre-img-bg: rgba(lighten(#666666, 15%), .25);
+// Images - Preload images - Spinner on load
+$spinner-size: 50px;
+$spinner-svg-size: 28px;
+$spinner-color: #FFFFFF;
+// Images - Multimedia background
+$multi-bg: darken(#666666, 30%);
+$overlay-bg: darken(#fcfcfc, 80%);
+
+$pre-img-ratios: ();
+
+// App colors
+$top-bar-bg: $theme-color-2;
+$top-bar-color: #FFFFFF;
+
+$loading-color: #FFFFFF;
+$loading-background-color: rgba(#444444, .9);
+
+$content-bg: #EAEAEA;
+$content-color: #444444;
diff --git a/hackatonApp/scss/common/theme.variables.scss b/hackatonApp/scss/common/theme.variables.scss
new file mode 100644
index 0000000..53c15fe
--- /dev/null
+++ b/hackatonApp/scss/common/theme.variables.scss
@@ -0,0 +1,14 @@
+// THEME 1
+$theme-color-1: #387ef5;
+$theme-color-2: #FF4C4C;
+$theme-color-3: #3E454C;
+
+// THEME 2
+// $theme-color-1: #633CA6;
+// $theme-color-2: #F4C447;
+// $theme-color-3: #414DA8;
+
+// THEME 3
+// $theme-color-1: #33AC6B;
+// $theme-color-2: #33779B;
+// $theme-color-3: #3E454C;
diff --git a/hackatonApp/scss/feed/category-feeds.styles.scss b/hackatonApp/scss/feed/category-feeds.styles.scss
new file mode 100644
index 0000000..d94dcf9
--- /dev/null
+++ b/hackatonApp/scss/feed/category-feeds.styles.scss
@@ -0,0 +1,34 @@
+.category-feeds-view
+{
+ background-color: $content-bg !important;
+
+ .category-feeds
+ {
+ .item
+ {
+ padding-left: 60px;
+ }
+
+ .item .thumbnail-outer
+ {
+ position: absolute;
+ left: 10px;
+ width: 40px;
+
+ .thumbnail
+ {
+ width: 100%;
+ }
+ }
+
+ .item .title
+ {
+ font-weight: 500;
+ }
+
+ .item .description
+ {
+ color: lighten($content-color, 35%);
+ }
+ }
+}
diff --git a/hackatonApp/scss/feed/feed-entries.styles.scss b/hackatonApp/scss/feed/feed-entries.styles.scss
new file mode 100644
index 0000000..83d85a9
--- /dev/null
+++ b/hackatonApp/scss/feed/feed-entries.styles.scss
@@ -0,0 +1,81 @@
+.feed-entries-view
+{
+ background-color: $content-bg !important;
+
+ .entry-heading
+ {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ background-color: darken($entry-heading-color, 10%);
+ border-color: #000;
+
+ .entry-title
+ {
+ color: $entry-title-color;
+ }
+
+ .entry-author
+ {
+ font-weight: 500;
+ }
+ }
+
+ .entry-content
+ {
+ padding-top: 8px;
+ padding-bottom: 0px;
+
+ .entry-excerpt
+ {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ @include display(flex);
+ @include flex-direction(column);
+ -webkit-line-clamp: $entry-excerpt-lines; /* number of lines to show */
+ line-height: $entry-font-size + 4; /* fallback */
+ font-size: $entry-font-size; /* fallback */
+ max-height: ($entry-font-size + 4) * $entry-excerpt-lines; /* fallback */
+
+ *
+ {
+ font-size: inherit !important;
+ }
+ }
+
+ .entry-actions
+ {
+ padding: 10px 0px;
+
+ .col
+ {
+ padding:0px;
+ }
+
+ .actions
+ {
+ .button-icon
+ {
+ min-height: initial;
+ line-height: 28px;
+ padding: 0px;
+ vertical-align: middle;
+ margin-right: 10px;
+ }
+
+ .button-icon:before
+ {
+ font-size: 28px;
+ line-height: 28px;
+ }
+ }
+
+ .read-more
+ {
+ .button
+ {
+ margin:0px;
+ }
+ }
+ }
+ }
+}
diff --git a/hackatonApp/scss/feed/feed.variables.scss b/hackatonApp/scss/feed/feed.variables.scss
new file mode 100644
index 0000000..8d4e049
--- /dev/null
+++ b/hackatonApp/scss/feed/feed.variables.scss
@@ -0,0 +1,14 @@
+$feed-category-bg: $theme-color-3;
+$feed-category-color: #FFFFFF;
+
+//Feed entries
+$entry-heading-color: $theme-color-3;
+$entry-title-color: #FFFFFF;
+
+$entry-excerpt-lines: 5;
+$entry-font-size: 14px;
+
+$feed-categories-img-ratio: 1 1;
+
+// Merge maps
+$pre-img-ratios: append($pre-img-ratios, $feed-categories-img-ratio);
diff --git a/hackatonApp/scss/feed/feeds-categories.styles.scss b/hackatonApp/scss/feed/feeds-categories.styles.scss
new file mode 100644
index 0000000..65ac0ee
--- /dev/null
+++ b/hackatonApp/scss/feed/feeds-categories.styles.scss
@@ -0,0 +1,46 @@
+.feeds-categories-view
+{
+ background-color: $content-bg !important;
+
+ .categories-list
+ {
+ @include flex-wrap(wrap);
+ }
+
+ .feed-category
+ {
+ // THIS IS FUCKING AWESOME: http://caniuse.com/#feat=viewport-units
+ @include calc(height, "50vw - 15px");
+ box-shadow: 0 1px 3px rgba(darken($feed-category-bg, 30%), 0.3);
+ border-radius: 2px;
+ position: relative;
+ display: block;
+
+ .category-image
+ {
+ width: 100%;
+ height: 100%;
+ border-radius: 2px;
+ }
+
+ .category-bg
+ {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(rgba(darken($feed-category-bg, 80%), .85), rgba(darken($feed-category-bg, 10%), .3) 40%, rgba($feed-category-bg, .3) 60%, rgba(lighten($feed-category-bg, 10%), .3));
+ }
+
+ .category-title
+ {
+ color: $feed-category-color;
+ position: absolute;
+ top: 2px;
+ left: 8px;
+ font-weight: 500;
+ text-transform: capitalize;
+ }
+ }
+}
diff --git a/hackatonApp/scss/forms/forms.styles.scss b/hackatonApp/scss/forms/forms.styles.scss
new file mode 100644
index 0000000..c45c06c
--- /dev/null
+++ b/hackatonApp/scss/forms/forms.styles.scss
@@ -0,0 +1,8 @@
+.forms-view
+{
+ ion-content
+ {
+ -webkit-overflow-scrolling: touch !important;
+ overflow: scroll !important;
+ }
+}
diff --git a/hackatonApp/scss/forms/forms.variables.scss b/hackatonApp/scss/forms/forms.variables.scss
new file mode 100644
index 0000000..e69de29
diff --git a/hackatonApp/scss/ionic.app.scss b/hackatonApp/scss/ionic.app.scss
new file mode 100644
index 0000000..4b2ed9b
--- /dev/null
+++ b/hackatonApp/scss/ionic.app.scss
@@ -0,0 +1,58 @@
+// Include Sass mixins
+@import "scss/utils/mixins";
+
+// Include Theme variables
+@import "scss/common/theme.variables";
+// Include Ionic override variables
+@import "scss/utils/override_variables";
+
+// Include Bourbon
+@import "www/lib/bourbon/app/assets/stylesheets/_bourbon";
+// Include all of Ionic
+@import "www/lib/ionic/scss/ionic";
+
+// Include Ionic override styles
+@import "scss/utils/override_styles";
+
+// Include project Sass variables
+@import "scss/common/common.variables";
+@import "scss/auth/auth.variables";
+@import "scss/sidemenu/side-menu.variables";
+@import "scss/profile/profile.variables";
+@import "scss/bookmarks/bookmarks.variables";
+@import "scss/feed/feed.variables";
+@import "scss/wordpress/wordpress.variables";
+@import "scss/layouts/layouts.variables";
+@import "scss/miscellaneous/miscellaneous.variables";
+@import "scss/forms/forms.variables";
+@import "scss/settings/settings.variables";
+
+// Include custom styles
+@import "scss/common/common.styles";
+@import "scss/auth/auth.styles";
+@import "scss/auth/walkthrough.styles";
+@import "scss/auth/login.styles";
+@import "scss/auth/signup.styles";
+@import "scss/auth/forgot-password.styles";
+
+@import "scss/sidemenu/side-menu.styles";
+@import "scss/profile/profile.styles";
+@import "scss/bookmarks/bookmarks.styles";
+
+@import "scss/feed/category-feeds.styles";
+@import "scss/feed/feed-entries.styles";
+@import "scss/feed/feeds-categories.styles";
+
+@import "scss/wordpress/wordpress.styles";
+@import "scss/wordpress/post.styles";
+
+@import "scss/layouts/layouts.styles";
+@import "scss/layouts/slider.styles";
+@import "scss/layouts/tinder-cards.styles";
+
+@import "scss/miscellaneous/miscellaneous.styles";
+@import "scss/miscellaneous/maps.styles";
+@import "scss/miscellaneous/image-picker.styles";
+
+@import "scss/forms/forms.styles";
+@import "scss/settings/settings.styles";
diff --git a/hackatonApp/scss/layouts/layouts.styles.scss b/hackatonApp/scss/layouts/layouts.styles.scss
new file mode 100644
index 0000000..fb07fc0
--- /dev/null
+++ b/hackatonApp/scss/layouts/layouts.styles.scss
@@ -0,0 +1,20 @@
+.layouts-view
+{
+ .layouts-functionalities
+ {
+ .item .icon:first-child
+ {
+ color: $layouts-icon-color;
+ }
+
+ .item .title
+ {
+ font-weight:500;
+ }
+
+ .item .description
+ {
+ color: lighten($content-color, 30%);
+ }
+ }
+}
diff --git a/hackatonApp/scss/layouts/layouts.variables.scss b/hackatonApp/scss/layouts/layouts.variables.scss
new file mode 100644
index 0000000..dfcf34b
--- /dev/null
+++ b/hackatonApp/scss/layouts/layouts.variables.scss
@@ -0,0 +1 @@
+$layouts-icon-color: $theme-color-2;
diff --git a/hackatonApp/scss/layouts/slider.styles.scss b/hackatonApp/scss/layouts/slider.styles.scss
new file mode 100644
index 0000000..faf4b80
--- /dev/null
+++ b/hackatonApp/scss/layouts/slider.styles.scss
@@ -0,0 +1,4 @@
+.slider-view
+{
+ background: $content-bg;
+}
diff --git a/hackatonApp/scss/layouts/tinder-cards.styles.scss b/hackatonApp/scss/layouts/tinder-cards.styles.scss
new file mode 100644
index 0000000..d6ef968
--- /dev/null
+++ b/hackatonApp/scss/layouts/tinder-cards.styles.scss
@@ -0,0 +1,98 @@
+.tinder-cards-view
+{
+
+ background: $content-bg;
+
+ td-cards
+ {
+ display: block;
+ }
+
+ td-card
+ {
+ position: absolute;
+ left: 50%;
+ margin-top: 80px;
+ margin-bottom: 40px;
+ margin-left: -150px;
+ width: 300px;
+ border: 1px solid #999;
+ box-shadow: 0px 1px 3px rgba(0,0,0,0.2);
+ border-radius: 6px;
+ background: white;
+ }
+
+ td-card .image
+ {
+ position: relative;
+ }
+
+ td-card img
+ {
+ max-width: 100%;
+ }
+
+ td-card .title
+ {
+ background: #FFF;
+ font-size: 16px;
+ padding: 15px;
+ text-transform: capitalize;
+ text-align:center;
+ }
+
+ /* Overlay styling*/
+
+ .overlayBox
+ {
+ position: absolute;
+ left: 50%;
+ height: 98%;
+ width: 100%;
+ top: -80px;
+ opacity: 0;
+ margin: 80px 0 0 -149px;
+ }
+
+ .boxed
+ {
+ height: 50px;
+ width: 100px;
+ padding: 10px;
+ border-radius: 6px;
+ font-size: 30px;
+ }
+
+ .yes-text
+ {
+ text-align: center;
+ }
+
+ .yesBox
+ {
+ margin: 10% 60% 0% 10%;
+ border: 2px solid $balanced;
+ color: $balanced;
+ -webkit-transform: rotate(-25deg);
+ }
+
+ .no-text
+ {
+ text-align: center;
+ }
+
+ .noBox
+ {
+ margin: 10% 10% 0% 60%;
+ border: 2px solid $assertive;
+ color: $assertive;
+ -webkit-transform: rotate(25deg);
+ }
+
+ .fade
+ {
+ -webkit-transition: 0.2s opacity linear;
+ transition: 0.2s opacity linear;
+ opacity: 0;
+ }
+}
diff --git a/hackatonApp/scss/miscellaneous/image-picker.styles.scss b/hackatonApp/scss/miscellaneous/image-picker.styles.scss
new file mode 100644
index 0000000..3ce259f
--- /dev/null
+++ b/hackatonApp/scss/miscellaneous/image-picker.styles.scss
@@ -0,0 +1,9 @@
+.image-picker-view{
+
+ background: $content-bg;
+
+ .image-option
+ {
+ font-size: 14px !important;
+ }
+}
diff --git a/hackatonApp/scss/miscellaneous/maps.styles.scss b/hackatonApp/scss/miscellaneous/maps.styles.scss
new file mode 100644
index 0000000..1adc1b4
--- /dev/null
+++ b/hackatonApp/scss/miscellaneous/maps.styles.scss
@@ -0,0 +1,32 @@
+.maps-view
+{
+ background-color: $content-bg !important;
+
+ .center-map-action
+ {
+ position: absolute;
+ top: 35px;
+ z-index: 9;
+
+ .item.item-input-inset
+ {
+ padding: 0px 5px;
+ }
+
+ .item-input-wrapper
+ {
+ background: none;
+ }
+ }
+
+ map
+ {
+ width: 100%;
+ height: 100% !important;
+ }
+
+ .scroll, .mapWrap
+ {
+ height: 100%;
+ }
+}
diff --git a/hackatonApp/scss/miscellaneous/miscellaneous.styles.scss b/hackatonApp/scss/miscellaneous/miscellaneous.styles.scss
new file mode 100644
index 0000000..6b85228
--- /dev/null
+++ b/hackatonApp/scss/miscellaneous/miscellaneous.styles.scss
@@ -0,0 +1,20 @@
+.miscellaneous-view
+{
+ .miscellaneous-functionalities
+ {
+ .item .icon:first-child
+ {
+ color: $miscellaneous-icon-color;
+ }
+
+ .item .title
+ {
+ font-weight:500;
+ }
+
+ .item .description
+ {
+ color: lighten($content-color, 30%);
+ }
+ }
+}
diff --git a/hackatonApp/scss/miscellaneous/miscellaneous.variables.scss b/hackatonApp/scss/miscellaneous/miscellaneous.variables.scss
new file mode 100644
index 0000000..a02641d
--- /dev/null
+++ b/hackatonApp/scss/miscellaneous/miscellaneous.variables.scss
@@ -0,0 +1 @@
+$miscellaneous-icon-color: $theme-color-2;
diff --git a/hackatonApp/scss/profile/profile.styles.scss b/hackatonApp/scss/profile/profile.styles.scss
new file mode 100644
index 0000000..43f9eca
--- /dev/null
+++ b/hackatonApp/scss/profile/profile.styles.scss
@@ -0,0 +1,67 @@
+.profile-view
+{
+ background-color: $profile-bg !important;
+
+ .profile-container
+ {
+ margin: 0px auto;
+ margin-top: 6vh;
+ text-align: center;
+ }
+
+ .user-image-container
+ {
+ width: $image-width;
+
+ .user-image
+ {
+ border-top: 1px solid $content-color;
+ padding: 8px;
+ background-color: $profile-bg;
+ width: 100%;
+ border-radius: 50%;
+ }
+ }
+
+ .user-name
+ {
+ font-size: 20px;
+ }
+
+ .user-twitter
+ {
+ margin-top: 5px;
+ }
+
+ .top-content
+ {
+ border-bottom: 1px solid $content-color;
+ position: relative;
+ height: 20vh;
+ margin-bottom: 25vh;
+ }
+
+ .user-background-image-outer
+ {
+ height: 20vh;
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 0;
+ }
+
+ .bottom-content
+ {
+ padding: 0px;
+ background-color: $profile-bg;
+ min-height: 55vh;
+ position: relative;
+
+ .user-bio
+ {
+ text-align: center;
+ margin: 6px 30px;
+ padding: 6px 0px;
+ }
+ }
+}
diff --git a/hackatonApp/scss/profile/profile.variables.scss b/hackatonApp/scss/profile/profile.variables.scss
new file mode 100644
index 0000000..a35e301
--- /dev/null
+++ b/hackatonApp/scss/profile/profile.variables.scss
@@ -0,0 +1,8 @@
+// App - Profile
+$image-width: 46vw;
+$image-max-width: 200px;
+
+$profile-bg: #FFFFFF;
+
+$profile-user-img-ratio: 1 1;
+$pre-img-ratios: append($pre-img-ratios, $profile-user-img-ratio);
diff --git a/hackatonApp/scss/settings/settings.styles.scss b/hackatonApp/scss/settings/settings.styles.scss
new file mode 100644
index 0000000..8060ab2
--- /dev/null
+++ b/hackatonApp/scss/settings/settings.styles.scss
@@ -0,0 +1,4 @@
+.settings-view
+{
+ background-color: $content-bg !important;
+}
diff --git a/hackatonApp/scss/settings/settings.variables.scss b/hackatonApp/scss/settings/settings.variables.scss
new file mode 100644
index 0000000..e69de29
diff --git a/hackatonApp/scss/sidemenu/side-menu.styles.scss b/hackatonApp/scss/sidemenu/side-menu.styles.scss
new file mode 100644
index 0000000..ee0c2b8
--- /dev/null
+++ b/hackatonApp/scss/sidemenu/side-menu.styles.scss
@@ -0,0 +1,91 @@
+ion-side-menu
+{
+ ion-content
+ {
+ background-color: darken($main-menu-bg, 12);
+ }
+
+ ion-item.item
+ {
+ border-right:none;
+ border-left:none;
+ border-color: darken($main-menu-bg, 5);
+
+ .item-content
+ {
+ background-color: darken($main-menu-bg, 12);
+
+ .icon:before
+ {
+ background-color: $main-menu-bg;
+ color: $main-menu-color;
+ border-radius: 50%;
+ font-size: 22px;
+ width: 32px;
+ height: 32px;
+ line-height: 32px;
+ }
+ }
+
+ .item-content.activated
+ {
+ background-color: lighten($main-menu-bg, 10);
+ }
+
+ .menu-text
+ {
+ color: darken($main-menu-color, 20);
+ font-weight:500;
+ }
+ }
+
+ ion-item.item:first-child
+ {
+ border-top:none;
+ }
+
+ ion-item.item:last-child
+ {
+ border-bottom:none;
+ }
+
+ .heading-item
+ {
+
+ .item-content
+ {
+ height: 120px;
+ padding-top: 45px;
+ padding-left: 115px;
+ background-color: darken($main-menu-bg, 10);
+ padding-bottom: 0px;
+ }
+
+ .user-image-container
+ {
+ width:90px;
+ position: absolute;
+ top: 16px;
+ left: 12px;
+
+ .user-image
+ {
+ border-radius: 50%;
+ padding: 8px;
+ border: 1px solid darken($main-menu-color, 40);
+ width: 100%;
+ }
+ }
+
+ .greeting
+ {
+ color: $main-menu-color;
+ font-weight:500;
+ }
+
+ .message
+ {
+ color: darken($main-menu-color, 40);
+ }
+ }
+}
diff --git a/hackatonApp/scss/sidemenu/side-menu.variables.scss b/hackatonApp/scss/sidemenu/side-menu.variables.scss
new file mode 100644
index 0000000..72cc64e
--- /dev/null
+++ b/hackatonApp/scss/sidemenu/side-menu.variables.scss
@@ -0,0 +1,9 @@
+$main-menu-bg: $theme-color-3;
+$main-menu-color: #FFFFFF;
+
+// Menu - User image
+$menu-user-img-width: 10vw;
+$menu-user-img-ratio: 1 1;
+
+// Merge maps
+$pre-img-ratios: append($pre-img-ratios, $menu-user-img-ratio);
diff --git a/hackatonApp/scss/utils/mixins.scss b/hackatonApp/scss/utils/mixins.scss
new file mode 100644
index 0000000..e10b482
--- /dev/null
+++ b/hackatonApp/scss/utils/mixins.scss
@@ -0,0 +1,45 @@
+@mixin filter-gradient($start-color, $end-color, $orientation: vertical) {
+ $gradient-type: if($orientation == vertical, 0, 1);
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=#{$gradient-type}, startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}');
+}
+
+@mixin headings($from: 1, $to: 6){
+ @for $i from $from through $to{
+ h#{$i}{
+ @content
+ }
+ }
+}
+
+@mixin transition($transitions...)
+{
+ -webkit-transition: $transitions;
+ -moz-transition: $transitions;
+ -ms-transition: $transitions;
+ -o-transition: $transitions;
+ transition: $transitions;
+}
+
+// // Placeholder shadow DOM
+@mixin _placeholder {
+ $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input";
+ @each $placeholder in $placeholders {
+ &:#{$placeholder}-placeholder {
+ @content;
+ }
+ }
+}
+
+@mixin box-shadow($val)
+{
+ -webkit-box-shadow: $val;
+ -moz-box-shadow: $val;
+ box-shadow: $val;
+}
+
+@mixin opacity($opacity)
+{
+ opacity: $opacity;
+ $opacity-ie: $opacity * 100;
+ filter: alpha(opacity=$opacity-ie); //IE8
+}
diff --git a/hackatonApp/scss/utils/override_styles.scss b/hackatonApp/scss/utils/override_styles.scss
new file mode 100644
index 0000000..93a459c
--- /dev/null
+++ b/hackatonApp/scss/utils/override_styles.scss
@@ -0,0 +1 @@
+// Override Ionic styles
diff --git a/hackatonApp/scss/utils/override_variables.scss b/hackatonApp/scss/utils/override_variables.scss
new file mode 100644
index 0000000..f8bd0c4
--- /dev/null
+++ b/hackatonApp/scss/utils/override_variables.scss
@@ -0,0 +1,19 @@
+/*
+To customize the look and feel of Ionic, you can override the variables
+in ionic's _variables.scss file.
+
+For example, you might change some of the default colors:
+*/
+// $light: #fff !default;
+// $stable: #f8f8f8 !default;
+$positive: $theme-color-1 !default;
+// $calm: #11c1f3 !default;
+// $balanced: #33cd5f !default;
+// $energized: #ffc900 !default;
+$assertive: $theme-color-2 !default;
+// $royal: #886aea !default;
+// $dark: #444 !default;
+
+
+// The path for our ionicons font files, relative to the built CSS in www/css
+$ionicons-font-path: "../lib/ionic/fonts" !default;
diff --git a/hackatonApp/scss/wordpress/post.styles.scss b/hackatonApp/scss/wordpress/post.styles.scss
new file mode 100644
index 0000000..a7c86fb
--- /dev/null
+++ b/hackatonApp/scss/wordpress/post.styles.scss
@@ -0,0 +1,154 @@
+@each $font-size in $font-size-list {
+ $i: index($font-size-list, $font-size);
+ .post-size-#{$font-size}
+ {
+ .post-view .post-text
+ {
+ font-size: $font-size;
+ }
+ }
+}
+
+.post-view
+{
+ .post-heading
+ {
+ padding-bottom:0px;
+ border-color: transparent;
+ }
+
+ .post-content
+ {
+ border-color: transparent;
+
+ // Audio fix
+ .wp-audio-shortcode
+ {
+ visibility: visible !important;
+ }
+
+ .post-text
+ {
+ *
+ {
+ font-size: inherit !important;
+ }
+ }
+
+ // Fix audio tag not displaying to 100% on ios
+ audio::-webkit-media-controls-panel
+ {
+ width: 100% !important;
+ }
+
+ img
+ {
+ margin: 10px 0px;
+ height: auto;
+ @include calc(width, "100% + #{($sides-padding*2)}");
+ margin-left: - $sides-padding;
+ }
+
+ ul, ol
+ {
+ list-style-type: square;
+ padding: 0 0 0 40px;
+ margin: 14px 0px;
+ }
+
+ iframe
+ {
+ margin: 10px 0px;
+ @include calc(width, "100% + #{($sides-padding*2)}");
+ margin-left: - $sides-padding;
+ }
+
+ blockquote
+ {
+ font-style: italic;
+ font-weight: 300;
+ margin: 20px 20px;
+ border: none;
+ padding: 0px;
+
+ p
+ {
+ font-size: 16px;
+ }
+ }
+ }
+
+ .post-tags
+ {
+ border-color: transparent;
+ padding-top: 0px;
+ padding-bottom: 5px;
+
+ .post-tag
+ {
+ padding: 0 3px;
+ min-height: 24px;
+ font-size: 12px;
+ line-height: 24px;
+ margin-right: 5px;
+ margin-bottom: 5px;
+ }
+
+ .post-tag:last-child
+ {
+ margin-right:0px;
+ }
+ }
+
+ .post-footer
+ {
+ padding:0px;
+ background-color: darken($post-footer-bg, 10%);
+
+ .row,
+ .col
+ {
+ padding: 0px;
+ }
+
+ .col.col-20
+ {
+ text-align: center;
+ }
+
+ .ion-plus
+ {
+ font-size: 24px;
+ }
+
+ .ion-plus:before
+ {
+ font-size: 20px !important;
+ line-height: 15px !important;
+ }
+
+ .ion-minus
+ {
+ font-size: 18px;
+ }
+
+ .ion-minus:before
+ {
+ font-size: 14px !important;
+ line-height: 20px !important;
+ margin-left: 3px;
+ }
+ }
+
+ .post-title
+ {
+ font-size: 24px;
+ margin-bottom: 4px;
+ color: $post-footer-bg;
+ }
+
+ .post-author
+ {
+ font-weight: 500;
+ }
+}
diff --git a/hackatonApp/scss/wordpress/wordpress.styles.scss b/hackatonApp/scss/wordpress/wordpress.styles.scss
new file mode 100644
index 0000000..668ccf0
--- /dev/null
+++ b/hackatonApp/scss/wordpress/wordpress.styles.scss
@@ -0,0 +1,127 @@
+.wordpress-view
+{
+ background-color: $content-bg !important;
+ vertical-align:middle;
+
+ .post-heading
+ {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ background-color: darken($wordpress-heading-color, 10%);
+ border-color: #000;
+
+ .post-title
+ {
+ color: $wordpress-title-color;
+ }
+
+ .post-author
+ {
+ font-weight: 500;
+ }
+ }
+
+ .post-content
+ {
+ padding-top: 8px;
+ padding-bottom: 0px;
+
+ .post-excerpt
+ {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ @include display(flex);
+ @include flex-direction(column);
+ line-height: $post-font-size + 4; /* fallback */
+ font-size: $post-font-size; /* fallback */
+
+ *
+ {
+ font-size: inherit !important;
+ }
+ }
+
+ // Audio fix
+ .wp-audio-shortcode
+ {
+ visibility: visible !important;
+ }
+
+ // Fix audio tag not displaying to 100% on ios
+ audio::-webkit-media-controls-panel
+ {
+ width: 100% !important;
+ }
+
+ img
+ {
+ margin: 10px 0px;
+ height: auto;
+ @include calc(width, "100% + #{($sides-padding*2)}");
+ margin-left: - $sides-padding;
+ }
+
+ ul, ol
+ {
+ list-style-type: square;
+ padding: 0 0 0 40px;
+ margin: 14px 0px;
+ }
+
+ iframe
+ {
+ margin: 10px 0px;
+ height: auto;
+ @include calc(width, "100% + #{($sides-padding*2)}");
+ margin-left: - $sides-padding;
+ }
+
+ blockquote
+ {
+ font-style: italic;
+ font-weight: 300;
+ margin: 20px 20px;
+ border: none;
+ padding: 0px;
+
+ p
+ {
+ font-size: 16px;
+ }
+ }
+
+ .post-actions
+ {
+ padding: 10px 0px;
+
+ .col
+ {
+ padding:0px;
+ }
+
+ .bookmark
+ {
+ .ion-bookmark
+ {
+ min-height: initial;
+ line-height: 28px;
+ padding: 0px;
+ }
+
+ .ion-bookmark:before
+ {
+ font-size: 28px;
+ line-height: 28px;
+ }
+ }
+
+ .read-more
+ {
+ .button
+ {
+ margin:0px;
+ }
+ }
+ }
+ }
+}
diff --git a/hackatonApp/scss/wordpress/wordpress.variables.scss b/hackatonApp/scss/wordpress/wordpress.variables.scss
new file mode 100644
index 0000000..86b6ea4
--- /dev/null
+++ b/hackatonApp/scss/wordpress/wordpress.variables.scss
@@ -0,0 +1,7 @@
+$post-font-size: 14px;
+$sides-padding: 16px;
+$font-size-list: 12px 14px 16px 18px 20px 22px 24px;
+$read-more-color: $theme-color-2;
+$wordpress-heading-color: $theme-color-3;
+$wordpress-title-color: #FFFFFF;
+$post-footer-bg: $theme-color-3;
diff --git a/hackatonApp/www/feeds-categories.json b/hackatonApp/www/feeds-categories.json
new file mode 100644
index 0000000..e97ad2b
--- /dev/null
+++ b/hackatonApp/www/feeds-categories.json
@@ -0,0 +1,191 @@
+[
+ {
+ "id":"news",
+ "title":"News",
+ "image":"img/feeds/news.jpg",
+ "feed_sources":[
+ {
+ "id":"bbc",
+ "title":"BBC",
+ "description":"The latest stories from the World section of the BBC News web site.",
+ "image":"img/feeds/logos/bbc.jpg",
+ "url":"http://feeds.bbci.co.uk/news/world/rss.xml"
+ },
+ {
+ "id":"reuters",
+ "title":"Reuters",
+ "description":"Reuters.com is your source for breaking news, business, financial and investing news, including personal finance and stocks. Reuters is the leading global provider of news, financial information and technology solutions to the world's media, financial institutions, businesses and individuals.",
+ "image":"img/feeds/logos/reuters.jpg",
+ "url":"http://feeds.reuters.com/Reuters/worldNews"
+ },
+ {
+ "id":"cnn",
+ "title":"CNN",
+ "description":"CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.",
+ "image":"img/feeds/logos/cnn.jpg",
+ "url":"http://rss.cnn.com/rss/cnn_world.rss"
+ },
+ {
+ "id":"the-guardian",
+ "title":"The Guardian",
+ "description":"Latest World news, comment and analysis from the Guardian, the world's leading liberal voice",
+ "image":"img/feeds/logos/the-guardian.jpg",
+ "url":"http://www.theguardian.com/world/rss"
+ }
+ ]
+ },
+ {
+ "id":"sports",
+ "title":"Sports",
+ "image":"img/feeds/sports.jpg",
+ "feed_sources":[
+ {
+ "id":"the-guardian",
+ "title":"The Guardian",
+ "description":"Latest news and features from theguardian.com, the world's leading liberal voice",
+ "image":"img/feeds/logos/the-guardian.jpg",
+ "url":"http://www.theguardian.com/sport/rss"
+ },
+ {
+ "id":"bbc",
+ "title":"BBC",
+ "description":"The latest stories from the Sport section of the BBC Sport web site.",
+ "image":"img/feeds/logos/bbc.jpg",
+ "url":"http://feeds.bbci.co.uk/sport/0/rss.xml"
+ },
+ {
+ "id":"fox-sports",
+ "title":"FOX Sports",
+ "description":"FOX Sports Generic Content Feed",
+ "image":"img/feeds/logos/fox-sports.jpg",
+ "url":"http://api.foxsports.com/v1/rss?partnerKey=zBaFxRyGKCfxBagJG9b8pqLyndmvo7UU"
+ },
+ {
+ "id":"espn",
+ "title":"ESPN",
+ "description":"Latest news from ESPN.com",
+ "image":"img/feeds/logos/espn.jpg",
+ "url":"http://sports.espn.go.com/espn/rss/news"
+ }
+ ]
+ },
+ {
+ "id":"business",
+ "title":"Business",
+ "image":"img/feeds/business.jpg",
+ "feed_sources":[
+ {
+ "id":"forbes",
+ "title":"Forbes",
+ "description":"Forbes - Business",
+ "image":"img/feeds/logos/forbes.jpg",
+ "url":"http://www.forbes.com/business/feed/"
+ },
+ {
+ "id":"reuters",
+ "title":"Reuters",
+ "description":"Reuters.com is your source for breaking news, business, financial and investing news, including personal finance and stocks. Reuters is the leading global provider of news, financial information and technology solutions to the world's media, financial institutions, businesses and individuals.",
+ "image":"img/feeds/logos/reuters.jpg",
+ "url":"http://feeds.reuters.com/reuters/businessNews"
+ },
+ {
+ "id":"the-economist",
+ "title":"The Economist",
+ "description":"The Economist business and finance",
+ "image":"img/feeds/logos/the-economist.jpg",
+ "url":"http://www.economist.com/sections/business-finance/rss.xml"
+ },
+ {
+ "id":"inc",
+ "title":"Inc.",
+ "description":"Advice for founders of start-ups and start-up entrepreneurs on writing a business plan, running a home-based business, naming a start-up business, how to incorporate, financing a start-up, buying a small business, and starting a franchise.",
+ "image":"img/feeds/logos/inc.jpg",
+ "url":"http://feeds.feedburner.com/inc/channel/start-up"
+ }
+ ]
+ },
+ {
+ "id":"entertainment",
+ "title":"Entertainment",
+ "image":"img/feeds/entertainment.jpg",
+ "feed_sources":[
+ {
+ "id":"the-hollywood-reporter",
+ "title":"The Hollywood Reporter",
+ "description":"The Hollywood Reporter news",
+ "image":"img/feeds/logos/the-hollywood-reporter.jpg",
+ "url":"http://feeds.feedburner.com/thr/news"
+ },
+ {
+ "id":"tmz",
+ "title":"TMZ",
+ "description":"Celebrity Gossip and Entertainment News, Covering Celebrity News and Hollywood Rumors. Get All The Latest Gossip at TMZ - Thirty Mile Zone.",
+ "image":"img/feeds/logos/tmz.jpg",
+ "url":"http://www.tmz.com/rss.xml"
+ },
+ {
+ "id":"the-guardian",
+ "title":"The Guardian",
+ "description":"Latest news and features from theguardian.com, the world's leading liberal voice",
+ "image":"img/feeds/logos/the-guardian.jpg",
+ "url":"http://www.theguardian.com/culture/rss"
+ }
+ ]
+ },
+ {
+ "id":"politics",
+ "title":"Politics",
+ "image":"img/feeds/politics.jpg",
+ "feed_sources":[
+ {
+ "id":"the-nation",
+ "title":"The Nation",
+ "description":"The Nation politics news",
+ "image":"img/feeds/logos/the-nation.jpg",
+ "url":"http://www.thenation.com/blogs/rss/politics"
+ },
+ {
+ "id":"washington-post",
+ "title":"Washington Post",
+ "description":"Post Politics from The Washington Post is the source for political news headlines, in-depth politics coverage and political opinion, plus breaking news on the Obama administration and White House, Congress, the Supreme Court, elections and more.",
+ "image":"img/feeds/logos/washington-post.jpg",
+ "url":"http://feeds.washingtonpost.com/rss/politics"
+ },
+ {
+ "id":"reuters",
+ "title":"Reuters",
+ "description":"Reuters.com is your source for breaking news, business, financial and investing news, including personal finance and stocks. Reuters is the leading global provider of news, financial information and technology solutions to the world's media, financial institutions, businesses and individuals.",
+ "image":"img/feeds/logos/reuters.jpg",
+ "url":"http://feeds.reuters.com/Reuters/PoliticsNews"
+ }
+ ]
+ },
+ {
+ "id":"technology",
+ "title":"Technology",
+ "image":"img/feeds/technology.jpg",
+ "feed_sources":[
+ {
+ "id":"techcrunch",
+ "title":"TechCrunch",
+ "description":"Startup and Technology News",
+ "image":"img/feeds/logos/techcrunch.jpg",
+ "url":"http://feeds.feedburner.com/TechCrunch/social"
+ },
+ {
+ "id":"techradar",
+ "title":"Techradar",
+ "description":"Get all the latest tech news from Techradar.com",
+ "image":"img/feeds/logos/techradar.jpg",
+ "url":"http://feeds2.feedburner.com/techradar/allnews"
+ },
+ {
+ "id":"cnet",
+ "title":"CNET",
+ "description":"CNET news editors and reporters provide top technology news, with investigative reporting and in-depth coverage of tech issues and events",
+ "image":"img/feeds/logos/cnet.jpg",
+ "url":"http://www.cnet.com/rss/news/"
+ }
+ ]
+ }
+]
diff --git a/hackatonApp/www/img/bg-gif.gif b/hackatonApp/www/img/bg-gif.gif
new file mode 100644
index 0000000..984d6f7
Binary files /dev/null and b/hackatonApp/www/img/bg-gif.gif differ
diff --git a/hackatonApp/www/img/bg-img.jpg b/hackatonApp/www/img/bg-img.jpg
new file mode 100644
index 0000000..3643790
Binary files /dev/null and b/hackatonApp/www/img/bg-img.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/business-1.jpg b/hackatonApp/www/img/feeds/assets/business-1.jpg
new file mode 100644
index 0000000..d1c664d
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/business-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/business-2.jpg b/hackatonApp/www/img/feeds/assets/business-2.jpg
new file mode 100644
index 0000000..b9dfa58
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/business-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/business-3.jpg b/hackatonApp/www/img/feeds/assets/business-3.jpg
new file mode 100644
index 0000000..c5fbce7
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/business-3.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/entertainment-1.jpg b/hackatonApp/www/img/feeds/assets/entertainment-1.jpg
new file mode 100644
index 0000000..174ce43
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/entertainment-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/entertainment-2.jpg b/hackatonApp/www/img/feeds/assets/entertainment-2.jpg
new file mode 100644
index 0000000..a9910b6
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/entertainment-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/entertainment-3.jpg b/hackatonApp/www/img/feeds/assets/entertainment-3.jpg
new file mode 100644
index 0000000..133e381
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/entertainment-3.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/entertainment-4.jpg b/hackatonApp/www/img/feeds/assets/entertainment-4.jpg
new file mode 100644
index 0000000..eeb760f
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/entertainment-4.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/news-1.jpg b/hackatonApp/www/img/feeds/assets/news-1.jpg
new file mode 100644
index 0000000..93d052c
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/news-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/news-2.jpg b/hackatonApp/www/img/feeds/assets/news-2.jpg
new file mode 100644
index 0000000..597b2dc
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/news-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/politics-1.jpg b/hackatonApp/www/img/feeds/assets/politics-1.jpg
new file mode 100644
index 0000000..adbb0f1
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/politics-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/politics-2.jpg b/hackatonApp/www/img/feeds/assets/politics-2.jpg
new file mode 100644
index 0000000..aec9d36
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/politics-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/sports-1.jpg b/hackatonApp/www/img/feeds/assets/sports-1.jpg
new file mode 100644
index 0000000..fc29e82
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/sports-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/sports-2.jpg b/hackatonApp/www/img/feeds/assets/sports-2.jpg
new file mode 100644
index 0000000..3b40828
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/sports-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/sports-3.jpg b/hackatonApp/www/img/feeds/assets/sports-3.jpg
new file mode 100644
index 0000000..7f9140c
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/sports-3.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/sports-4.jpg b/hackatonApp/www/img/feeds/assets/sports-4.jpg
new file mode 100644
index 0000000..dc3a921
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/sports-4.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/technology-1.jpg b/hackatonApp/www/img/feeds/assets/technology-1.jpg
new file mode 100644
index 0000000..fca99b1
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/technology-1.jpg differ
diff --git a/hackatonApp/www/img/feeds/assets/technology-2.jpg b/hackatonApp/www/img/feeds/assets/technology-2.jpg
new file mode 100644
index 0000000..adfd799
Binary files /dev/null and b/hackatonApp/www/img/feeds/assets/technology-2.jpg differ
diff --git a/hackatonApp/www/img/feeds/business.jpg b/hackatonApp/www/img/feeds/business.jpg
new file mode 100644
index 0000000..c5fbce7
Binary files /dev/null and b/hackatonApp/www/img/feeds/business.jpg differ
diff --git a/hackatonApp/www/img/feeds/entertainment.jpg b/hackatonApp/www/img/feeds/entertainment.jpg
new file mode 100644
index 0000000..eeb760f
Binary files /dev/null and b/hackatonApp/www/img/feeds/entertainment.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/bbc.jpg b/hackatonApp/www/img/feeds/logos/bbc.jpg
new file mode 100644
index 0000000..e2ae5ad
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/bbc.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/cnet.jpg b/hackatonApp/www/img/feeds/logos/cnet.jpg
new file mode 100644
index 0000000..5a48bb6
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/cnet.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/cnn.jpg b/hackatonApp/www/img/feeds/logos/cnn.jpg
new file mode 100644
index 0000000..fec2a32
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/cnn.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/espn.jpg b/hackatonApp/www/img/feeds/logos/espn.jpg
new file mode 100644
index 0000000..b3a9afb
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/espn.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/forbes.jpg b/hackatonApp/www/img/feeds/logos/forbes.jpg
new file mode 100644
index 0000000..085adf5
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/forbes.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/fox-sports.jpg b/hackatonApp/www/img/feeds/logos/fox-sports.jpg
new file mode 100644
index 0000000..b00dd08
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/fox-sports.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/inc.jpg b/hackatonApp/www/img/feeds/logos/inc.jpg
new file mode 100644
index 0000000..0009f92
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/inc.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/reuters.jpg b/hackatonApp/www/img/feeds/logos/reuters.jpg
new file mode 100644
index 0000000..8a6a23c
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/reuters.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/techcrunch.jpg b/hackatonApp/www/img/feeds/logos/techcrunch.jpg
new file mode 100644
index 0000000..4609ae7
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/techcrunch.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/techradar.jpg b/hackatonApp/www/img/feeds/logos/techradar.jpg
new file mode 100644
index 0000000..cb57860
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/techradar.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/the-economist.jpg b/hackatonApp/www/img/feeds/logos/the-economist.jpg
new file mode 100644
index 0000000..0a315ea
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/the-economist.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/the-guardian.jpg b/hackatonApp/www/img/feeds/logos/the-guardian.jpg
new file mode 100644
index 0000000..9060f3a
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/the-guardian.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/the-hollywood-reporter.jpg b/hackatonApp/www/img/feeds/logos/the-hollywood-reporter.jpg
new file mode 100644
index 0000000..bab598a
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/the-hollywood-reporter.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/the-nation.jpg b/hackatonApp/www/img/feeds/logos/the-nation.jpg
new file mode 100644
index 0000000..3e11186
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/the-nation.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/tmz.jpg b/hackatonApp/www/img/feeds/logos/tmz.jpg
new file mode 100644
index 0000000..1d8613d
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/tmz.jpg differ
diff --git a/hackatonApp/www/img/feeds/logos/washington-post.jpg b/hackatonApp/www/img/feeds/logos/washington-post.jpg
new file mode 100644
index 0000000..83b13a5
Binary files /dev/null and b/hackatonApp/www/img/feeds/logos/washington-post.jpg differ
diff --git a/hackatonApp/www/img/feeds/news.jpg b/hackatonApp/www/img/feeds/news.jpg
new file mode 100644
index 0000000..93d052c
Binary files /dev/null and b/hackatonApp/www/img/feeds/news.jpg differ
diff --git a/hackatonApp/www/img/feeds/politics.jpg b/hackatonApp/www/img/feeds/politics.jpg
new file mode 100644
index 0000000..aec9d36
Binary files /dev/null and b/hackatonApp/www/img/feeds/politics.jpg differ
diff --git a/hackatonApp/www/img/feeds/sports.jpg b/hackatonApp/www/img/feeds/sports.jpg
new file mode 100644
index 0000000..dc3a921
Binary files /dev/null and b/hackatonApp/www/img/feeds/sports.jpg differ
diff --git a/hackatonApp/www/img/feeds/technology.jpg b/hackatonApp/www/img/feeds/technology.jpg
new file mode 100644
index 0000000..fca99b1
Binary files /dev/null and b/hackatonApp/www/img/feeds/technology.jpg differ
diff --git a/hackatonApp/www/img/ionic.png b/hackatonApp/www/img/ionic.png
new file mode 100644
index 0000000..2223e67
Binary files /dev/null and b/hackatonApp/www/img/ionic.png differ
diff --git a/hackatonApp/www/img/logo.png b/hackatonApp/www/img/logo.png
new file mode 100644
index 0000000..e269713
Binary files /dev/null and b/hackatonApp/www/img/logo.png differ
diff --git a/hackatonApp/www/index.html b/hackatonApp/www/index.html
new file mode 100644
index 0000000..99444ba
--- /dev/null
+++ b/hackatonApp/www/index.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/js/app.js b/hackatonApp/www/js/app.js
new file mode 100644
index 0000000..73f5005
--- /dev/null
+++ b/hackatonApp/www/js/app.js
@@ -0,0 +1,283 @@
+// Ionic Starter App
+
+angular.module('underscore', [])
+.factory('_', function() {
+ return window._; // assumes underscore has already been loaded on the page
+});
+
+// angular.module is a global place for creating, registering and retrieving Angular modules
+// 'starter' is the name of this angular module example (also set in a attribute in index.html)
+// the 2nd parameter is an array of 'requires'
+angular.module('your_app_name', [
+ 'ionic',
+ 'angularMoment',
+ 'your_app_name.controllers',
+ 'your_app_name.directives',
+ 'your_app_name.filters',
+ 'your_app_name.services',
+ 'your_app_name.factories',
+ 'your_app_name.config',
+ 'your_app_name.views',
+ 'underscore',
+ 'ngMap',
+ 'ngResource',
+ 'ngCordova',
+ 'slugifier',
+ 'ionic.contrib.ui.tinderCards',
+ 'youtube-embed'
+])
+
+.run(function($ionicPlatform, PushNotificationsService, $rootScope, $ionicConfig, $timeout) {
+
+ $ionicPlatform.on("deviceready", function(){
+ // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
+ // for form inputs)
+ if(window.cordova && window.cordova.plugins.Keyboard) {
+ cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
+ }
+ if(window.StatusBar) {
+ StatusBar.styleDefault();
+ }
+
+ PushNotificationsService.register();
+ });
+
+ // This fixes transitions for transparent background views
+ $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){
+ if(toState.name.indexOf('auth.walkthrough') > -1)
+ {
+ // set transitions to android to avoid weird visual effect in the walkthrough transitions
+ $timeout(function(){
+ $ionicConfig.views.transition('android');
+ $ionicConfig.views.swipeBackEnabled(false);
+ console.log("setting transition to android and disabling swipe back");
+ }, 0);
+ }
+ });
+ $rootScope.$on("$stateChangeSuccess", function(event, toState, toParams, fromState, fromParams){
+ if(toState.name.indexOf('app.feeds-categories') > -1)
+ {
+ // Restore platform default transition. We are just hardcoding android transitions to auth views.
+ $ionicConfig.views.transition('platform');
+ // If it's ios, then enable swipe back again
+ if(ionic.Platform.isIOS())
+ {
+ $ionicConfig.views.swipeBackEnabled(true);
+ }
+ console.log("enabling swipe back and restoring transition to platform default", $ionicConfig.views.transition());
+ }
+ });
+
+ $ionicPlatform.on("resume", function(){
+ PushNotificationsService.register();
+ });
+
+})
+
+
+.config(function($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
+ $stateProvider
+
+ //INTRO
+ .state('auth', {
+ url: "/auth",
+ templateUrl: "views/auth/auth.html",
+ abstract: true,
+ controller: 'AuthCtrl'
+ })
+
+ .state('auth.walkthrough', {
+ url: '/walkthrough',
+ templateUrl: "views/auth/walkthrough.html"
+ })
+
+ .state('auth.login', {
+ url: '/login',
+ templateUrl: "views/auth/login.html",
+ controller: 'LoginCtrl'
+ })
+
+ .state('auth.signup', {
+ url: '/signup',
+ templateUrl: "views/auth/signup.html",
+ controller: 'SignupCtrl'
+ })
+
+ .state('auth.forgot-password', {
+ url: "/forgot-password",
+ templateUrl: "views/auth/forgot-password.html",
+ controller: 'ForgotPasswordCtrl'
+ })
+
+ .state('app', {
+ url: "/app",
+ abstract: true,
+ templateUrl: "views/app/side-menu.html",
+ controller: 'AppCtrl'
+ })
+
+ //MISCELLANEOUS
+ .state('app.miscellaneous', {
+ url: "/miscellaneous",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/miscellaneous/miscellaneous.html"
+ }
+ }
+ })
+
+ .state('app.maps', {
+ url: "/miscellaneous/maps",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/miscellaneous/maps.html",
+ controller: 'MapsCtrl'
+ }
+ }
+ })
+
+ .state('app.image-picker', {
+ url: "/miscellaneous/image-picker",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/miscellaneous/image-picker.html",
+ controller: 'ImagePickerCtrl'
+ }
+ }
+ })
+
+ //LAYOUTS
+ .state('app.layouts', {
+ url: "/layouts",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/layouts/layouts.html"
+ }
+ }
+ })
+
+ .state('app.tinder-cards', {
+ url: "/layouts/tinder-cards",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/layouts/tinder-cards.html",
+ controller: 'TinderCardsCtrl'
+ }
+ }
+ })
+
+ .state('app.slider', {
+ url: "/layouts/slider",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/layouts/slider.html"
+ }
+ }
+ })
+
+ //FEEDS
+ .state('app.feeds-categories', {
+ url: "/feeds-categories",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/feeds/feeds-categories.html",
+ controller: 'FeedsCategoriesCtrl'
+ }
+ }
+ })
+
+ .state('app.category-feeds', {
+ url: "/category-feeds/:categoryId",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/feeds/category-feeds.html",
+ controller: 'CategoryFeedsCtrl'
+ }
+ }
+ })
+
+ .state('app.feed-entries', {
+ url: "/feed-entries/:categoryId/:sourceId",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/feeds/feed-entries.html",
+ controller: 'FeedEntriesCtrl'
+ }
+ }
+ })
+
+ //WORDPRESS
+ .state('app.wordpress', {
+ url: "/wordpress",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/wordpress/wordpress.html",
+ controller: 'WordpressCtrl'
+ }
+ }
+ })
+
+ .state('app.post', {
+ url: "/wordpress/:postId",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/wordpress/wordpress_post.html",
+ controller: 'WordpressPostCtrl'
+ }
+ },
+ resolve: {
+ post_data: function(PostService, $ionicLoading, $stateParams) {
+ $ionicLoading.show({
+ template: 'Loading post ...'
+ });
+
+ var postId = $stateParams.postId;
+ return PostService.getPost(postId);
+ }
+ }
+ })
+
+ //OTHERS
+ .state('app.settings', {
+ url: "/settings",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/settings.html",
+ controller: 'SettingsCtrl'
+ }
+ }
+ })
+
+ .state('app.forms', {
+ url: "/forms",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/forms.html"
+ }
+ }
+ })
+
+ .state('app.profile', {
+ url: "/profile",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/profile.html"
+ }
+ }
+ })
+
+ .state('app.bookmarks', {
+ url: "/bookmarks",
+ views: {
+ 'menuContent': {
+ templateUrl: "views/app/bookmarks.html",
+ controller: 'BookMarksCtrl'
+ }
+ }
+ })
+
+;
+
+ // if none of the above states are matched, use this as the fallback
+ $urlRouterProvider.otherwise('/auth/walkthrough');
+});
diff --git a/hackatonApp/www/js/config.js b/hackatonApp/www/js/config.js
new file mode 100644
index 0000000..306d580
--- /dev/null
+++ b/hackatonApp/www/js/config.js
@@ -0,0 +1,5 @@
+angular.module('your_app_name.config', [])
+.constant('WORDPRESS_API_URL', 'http://wordpress.startapplabs.com/blog/api/')
+.constant('GCM_SENDER_ID', '574597432927')
+
+;
diff --git a/hackatonApp/www/js/controllers.js b/hackatonApp/www/js/controllers.js
new file mode 100644
index 0000000..7ebbdd5
--- /dev/null
+++ b/hackatonApp/www/js/controllers.js
@@ -0,0 +1,465 @@
+angular.module('your_app_name.controllers', [])
+
+.controller('AuthCtrl', function($scope, $ionicConfig) {
+
+})
+
+// APP
+.controller('AppCtrl', function($scope, $ionicConfig) {
+
+})
+
+//LOGIN
+.controller('LoginCtrl', function($scope, $state, $templateCache, $q, $rootScope) {
+ $scope.doLogIn = function(){
+ $state.go('app.feeds-categories');
+ };
+
+ $scope.user = {};
+
+ $scope.user.email = "john@doe.com";
+ $scope.user.pin = "12345";
+
+ // We need this for the form validation
+ $scope.selected_tab = "";
+
+ $scope.$on('my-tabs-changed', function (event, data) {
+ $scope.selected_tab = data.title;
+ });
+
+})
+
+.controller('SignupCtrl', function($scope, $state) {
+ $scope.user = {};
+
+ $scope.user.email = "john@doe.com";
+
+ $scope.doSignUp = function(){
+ $state.go('app.feeds-categories');
+ };
+})
+
+.controller('ForgotPasswordCtrl', function($scope, $state) {
+ $scope.recoverPassword = function(){
+ $state.go('app.feeds-categories');
+ };
+
+ $scope.user = {};
+})
+
+.controller('RateApp', function($scope) {
+ $scope.rateApp = function(){
+ if(ionic.Platform.isIOS()){
+ //you need to set your own ios app id
+ AppRate.preferences.storeAppURL.ios = '1234555553>';
+ AppRate.promptForRating(true);
+ }else if(ionic.Platform.isAndroid()){
+ //you need to set your own android app id
+ AppRate.preferences.storeAppURL.android = 'market://details?id=ionFB';
+ AppRate.promptForRating(true);
+ }
+ };
+})
+
+.controller('SendMailCtrl', function($scope) {
+ $scope.sendMail = function(){
+ cordova.plugins.email.isAvailable(
+ function (isAvailable) {
+ // alert('Service is not available') unless isAvailable;
+ cordova.plugins.email.open({
+ to: 'envato@startapplabs.com',
+ cc: 'hello@startapplabs.com',
+ // bcc: ['john@doe.com', 'jane@doe.com'],
+ subject: 'Greetings',
+ body: 'How are you? Nice greetings from IonFullApp'
+ });
+ }
+ );
+ };
+})
+
+.controller('MapsCtrl', function($scope, $ionicLoading) {
+
+ $scope.info_position = {
+ lat: 43.07493,
+ lng: -89.381388
+ };
+
+ $scope.center_position = {
+ lat: 43.07493,
+ lng: -89.381388
+ };
+
+ $scope.my_location = "";
+
+ $scope.$on('mapInitialized', function(event, map) {
+ $scope.map = map;
+ });
+
+ $scope.centerOnMe= function(){
+
+ $scope.positions = [];
+
+ $ionicLoading.show({
+ template: 'Loading...'
+ });
+
+ // with this function you can get the user’s current position
+ // we use this plugin: https://github.com/apache/cordova-plugin-geolocation/
+ navigator.geolocation.getCurrentPosition(function(position) {
+ var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
+ $scope.current_position = {lat: pos.G,lng: pos.K};
+ $scope.my_location = pos.G+", "+pos.K;
+ $scope.map.setCenter(pos);
+ $ionicLoading.hide();
+ });
+ };
+})
+
+.controller('AdsCtrl', function($scope, $ionicActionSheet, AdMob, iAd) {
+
+ $scope.manageAdMob = function() {
+
+ // Show the action sheet
+ var hideSheet = $ionicActionSheet.show({
+ //Here you can add some more buttons
+ buttons: [
+ { text: 'Show Banner' },
+ { text: 'Show Interstitial' }
+ ],
+ destructiveText: 'Remove Ads',
+ titleText: 'Choose the ad to show',
+ cancelText: 'Cancel',
+ cancel: function() {
+ // add cancel code..
+ },
+ destructiveButtonClicked: function() {
+ console.log("removing ads");
+ AdMob.removeAds();
+ return true;
+ },
+ buttonClicked: function(index, button) {
+ if(button.text == 'Show Banner')
+ {
+ console.log("show banner");
+ AdMob.showBanner();
+ }
+
+ if(button.text == 'Show Interstitial')
+ {
+ console.log("show interstitial");
+ AdMob.showInterstitial();
+ }
+
+ return true;
+ }
+ });
+ };
+
+ $scope.manageiAd = function() {
+
+ // Show the action sheet
+ var hideSheet = $ionicActionSheet.show({
+ //Here you can add some more buttons
+ buttons: [
+ { text: 'Show iAd Banner' },
+ { text: 'Show iAd Interstitial' }
+ ],
+ destructiveText: 'Remove Ads',
+ titleText: 'Choose the ad to show - Interstitial only works in iPad',
+ cancelText: 'Cancel',
+ cancel: function() {
+ // add cancel code..
+ },
+ destructiveButtonClicked: function() {
+ console.log("removing ads");
+ iAd.removeAds();
+ return true;
+ },
+ buttonClicked: function(index, button) {
+ if(button.text == 'Show iAd Banner')
+ {
+ console.log("show iAd banner");
+ iAd.showBanner();
+ }
+ if(button.text == 'Show iAd Interstitial')
+ {
+ console.log("show iAd interstitial");
+ iAd.showInterstitial();
+ }
+ return true;
+ }
+ });
+ };
+})
+
+// FEED
+//brings all feed categories
+.controller('FeedsCategoriesCtrl', function($scope, $http) {
+ $scope.feeds_categories = [];
+
+ $http.get('feeds-categories.json').success(function(response) {
+ $scope.feeds_categories = response;
+ });
+})
+
+//bring specific category providers
+.controller('CategoryFeedsCtrl', function($scope, $http, $stateParams) {
+ $scope.category_sources = [];
+
+ $scope.categoryId = $stateParams.categoryId;
+
+ $http.get('feeds-categories.json').success(function(response) {
+ var category = _.find(response, {id: $scope.categoryId});
+ $scope.categoryTitle = category.title;
+ $scope.category_sources = category.feed_sources;
+ });
+})
+
+//this method brings posts for a source provider
+.controller('FeedEntriesCtrl', function($scope, $stateParams, $http, FeedList, $q, $ionicLoading, BookMarkService) {
+ $scope.feed = [];
+
+ var categoryId = $stateParams.categoryId,
+ sourceId = $stateParams.sourceId;
+
+ $scope.doRefresh = function() {
+
+ $http.get('feeds-categories.json').success(function(response) {
+
+ $ionicLoading.show({
+ template: 'Loading entries...'
+ });
+
+ var category = _.find(response, {id: categoryId }),
+ source = _.find(category.feed_sources, {id: sourceId });
+
+ $scope.sourceTitle = source.title;
+
+ FeedList.get(source.url)
+ .then(function (result) {
+ $scope.feed = result.feed;
+ $ionicLoading.hide();
+ $scope.$broadcast('scroll.refreshComplete');
+ }, function (reason) {
+ $ionicLoading.hide();
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+ });
+ };
+
+ $scope.doRefresh();
+
+ $scope.bookmarkPost = function(post){
+ $ionicLoading.show({ template: 'Post Saved!', noBackdrop: true, duration: 1000 });
+ BookMarkService.bookmarkFeedPost(post);
+ };
+})
+
+// SETTINGS
+.controller('SettingsCtrl', function($scope, $ionicActionSheet, $state) {
+ $scope.airplaneMode = true;
+ $scope.wifi = false;
+ $scope.bluetooth = true;
+ $scope.personalHotspot = true;
+
+ $scope.checkOpt1 = true;
+ $scope.checkOpt2 = true;
+ $scope.checkOpt3 = false;
+
+ $scope.radioChoice = 'B';
+
+ // Triggered on a the logOut button click
+ $scope.showLogOutMenu = function() {
+
+ // Show the action sheet
+ var hideSheet = $ionicActionSheet.show({
+ //Here you can add some more buttons
+ // buttons: [
+ // { text: 'Share This' },
+ // { text: 'Move' }
+ // ],
+ destructiveText: 'Logout',
+ titleText: 'Are you sure you want to logout? This app is awsome so I recommend you to stay.',
+ cancelText: 'Cancel',
+ cancel: function() {
+ // add cancel code..
+ },
+ buttonClicked: function(index) {
+ //Called when one of the non-destructive buttons is clicked,
+ //with the index of the button that was clicked and the button object.
+ //Return true to close the action sheet, or false to keep it opened.
+ return true;
+ },
+ destructiveButtonClicked: function(){
+ //Called when the destructive button is clicked.
+ //Return true to close the action sheet, or false to keep it opened.
+ $state.go('auth.walkthrough');
+ }
+ });
+
+ };
+})
+
+// TINDER CARDS
+.controller('TinderCardsCtrl', function($scope, $http) {
+
+ $scope.cards = [];
+
+
+ $scope.addCard = function(img, name) {
+ var newCard = {image: img, name: name};
+ newCard.id = Math.random();
+ $scope.cards.unshift(angular.extend({}, newCard));
+ };
+
+ $scope.addCards = function(count) {
+ $http.get('http://api.randomuser.me/?results=' + count).then(function(value) {
+ angular.forEach(value.data.results, function (v) {
+ $scope.addCard(v.user.picture.large, v.user.name.first + " " + v.user.name.last);
+ });
+ });
+ };
+
+ $scope.addFirstCards = function() {
+ $scope.addCard("https://dl.dropboxusercontent.com/u/30675090/envato/tinder-cards/left.png","Nope");
+ $scope.addCard("https://dl.dropboxusercontent.com/u/30675090/envato/tinder-cards/right.png", "Yes");
+ };
+
+ $scope.addFirstCards();
+ $scope.addCards(5);
+
+ $scope.cardDestroyed = function(index) {
+ $scope.cards.splice(index, 1);
+ $scope.addCards(1);
+ };
+
+ $scope.transitionOut = function(card) {
+ console.log('card transition out');
+ };
+
+ $scope.transitionRight = function(card) {
+ console.log('card removed to the right');
+ console.log(card);
+ };
+
+ $scope.transitionLeft = function(card) {
+ console.log('card removed to the left');
+ console.log(card);
+ };
+})
+
+
+// BOOKMARKS
+.controller('BookMarksCtrl', function($scope, $rootScope, BookMarkService, $state) {
+
+ $scope.bookmarks = BookMarkService.getBookmarks();
+
+ // When a new post is bookmarked, we should update bookmarks list
+ $rootScope.$on("new-bookmark", function(event){
+ $scope.bookmarks = BookMarkService.getBookmarks();
+ });
+
+ $scope.goToFeedPost = function(link){
+ window.open(link, '_blank', 'location=yes');
+ };
+ $scope.goToWordpressPost = function(postId){
+ $state.go('app.post', {postId: postId});
+ };
+})
+
+// WORDPRESS
+.controller('WordpressCtrl', function($scope, $http, $ionicLoading, PostService, BookMarkService) {
+ $scope.posts = [];
+ $scope.page = 1;
+ $scope.totalPages = 1;
+
+ $scope.doRefresh = function() {
+ $ionicLoading.show({
+ template: 'Loading posts...'
+ });
+
+ //Always bring me the latest posts => page=1
+ PostService.getRecentPosts(1)
+ .then(function(data){
+ $scope.totalPages = data.pages;
+ $scope.posts = PostService.shortenPosts(data.posts);
+
+ $ionicLoading.hide();
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+ };
+
+ $scope.loadMoreData = function(){
+ $scope.page += 1;
+
+ PostService.getRecentPosts($scope.page)
+ .then(function(data){
+ //We will update this value in every request because new posts can be created
+ $scope.totalPages = data.pages;
+ var new_posts = PostService.shortenPosts(data.posts);
+ $scope.posts = $scope.posts.concat(new_posts);
+
+ $scope.$broadcast('scroll.infiniteScrollComplete');
+ });
+ };
+
+ $scope.moreDataCanBeLoaded = function(){
+ return $scope.totalPages > $scope.page;
+ };
+
+ $scope.bookmarkPost = function(post){
+ $ionicLoading.show({ template: 'Post Saved!', noBackdrop: true, duration: 1000 });
+ BookMarkService.bookmarkWordpressPost(post);
+ };
+
+ $scope.doRefresh();
+})
+
+// WORDPRESS POST
+.controller('WordpressPostCtrl', function($scope, post_data, $ionicLoading) {
+
+ $scope.post = post_data.post;
+ $ionicLoading.hide();
+
+ $scope.sharePost = function(link){
+ window.plugins.socialsharing.share('Check this post here: ', null, null, link);
+ };
+})
+
+
+.controller('ImagePickerCtrl', function($scope, $rootScope, $cordovaCamera) {
+
+ $scope.images = [];
+
+ $scope.selImages = function() {
+
+ window.imagePicker.getPictures(
+ function(results) {
+ for (var i = 0; i < results.length; i++) {
+ console.log('Image URI: ' + results[i]);
+ $scope.images.push(results[i]);
+ }
+ if(!$scope.$$phase) {
+ $scope.$apply();
+ }
+ }, function (error) {
+ console.log('Error: ' + error);
+ }
+ );
+ };
+
+ $scope.removeImage = function(image) {
+ $scope.images = _.without($scope.images, image);
+ };
+
+ $scope.shareImage = function(image) {
+ window.plugins.socialsharing.share(null, null, image);
+ };
+
+ $scope.shareAll = function() {
+ window.plugins.socialsharing.share(null, null, $scope.images);
+ };
+})
+
+;
diff --git a/hackatonApp/www/js/directives.js b/hackatonApp/www/js/directives.js
new file mode 100644
index 0000000..9c31ab8
--- /dev/null
+++ b/hackatonApp/www/js/directives.js
@@ -0,0 +1,374 @@
+angular.module('your_app_name.directives', [])
+
+.directive('myTabs', function() {
+ return {
+ restrict: 'E',
+ transclude: true,
+ scope: {},
+ controller: function($scope) {
+ var tabs = $scope.tabs = [];
+
+ $scope.select = function(tab) {
+ angular.forEach(tabs, function(tab) {
+ tab.selected = false;
+ });
+ tab.selected = true;
+ $scope.$emit('my-tabs-changed', tab);
+ };
+
+ this.addTab = function(tab) {
+ if (tabs.length === 0) {
+ $scope.select(tab);
+ }
+ tabs.push(tab);
+ };
+ },
+ templateUrl: 'views/common/my-tabs.html'
+ };
+})
+
+.directive('myTab', function() {
+ return {
+ require: '^myTabs',
+ restrict: 'E',
+ transclude: true,
+ scope: {
+ title: '@'
+ },
+ link: function(scope, element, attrs, tabsCtrl) {
+ tabsCtrl.addTab(scope);
+ },
+ templateUrl: 'views/common/my-tab.html'
+ };
+})
+
+.directive('validPin', function($http) {
+ return {
+ require: 'ngModel',
+ link: function(scope, ele, attrs, c) {
+ scope.$watch(attrs.ngModel, function(pinValue) {
+ // $http({
+ // method: 'POST',
+ // url: '/api/check/' + attrs.validPin,
+ // data: {'pin': attrs.validPin}
+ // }).success(function(data, status, headers, cfg) {
+ // c.$setValidity('valid-pin', data.isValid);
+ // }).error(function(data, status, headers, cfg) {
+ // c.$setValidity('valid-pin', false);
+ // });
+ if(pinValue=="12345")
+ {
+ c.$setValidity('valid-pin', true);
+ }
+ else
+ {
+ c.$setValidity('valid-pin', false);
+ }
+ });
+ }
+ };
+})
+
+
+.directive('showHideContainer', function(){
+ return {
+ scope: {
+ },
+ controller: function($scope, $element, $attrs) {
+ $scope.show = false;
+
+ $scope.toggleType = function($event){
+ $event.stopPropagation();
+ $event.preventDefault();
+
+ $scope.show = !$scope.show;
+
+ // Emit event
+ $scope.$broadcast("toggle-type", $scope.show);
+ };
+ },
+ templateUrl: 'views/common/show-hide-password.html',
+ restrict: 'A',
+ replace: false,
+ transclude: true
+ };
+})
+
+
+.directive('showHideInput', function(){
+ return {
+ scope: {
+ },
+ link: function(scope, element, attrs) {
+ // listen to event
+ scope.$on("toggle-type", function(event, show){
+ var password_input = element[0],
+ input_type = password_input.getAttribute('type');
+
+ if(!show)
+ {
+ password_input.setAttribute('type', 'password');
+ }
+
+ if(show)
+ {
+ password_input.setAttribute('type', 'text');
+ }
+ });
+ },
+ require: '^showHideContainer',
+ restrict: 'A',
+ replace: false,
+ transclude: false
+ };
+})
+
+
+.directive('biggerText', function($ionicGesture) {
+ return {
+ restrict: 'A',
+ link: function(scope, element, attrs) {
+ $ionicGesture.on('touch', function(event){
+ event.stopPropagation();
+ event.preventDefault();
+
+ var text_element = document.querySelector(attrs.biggerText),
+ root_element = document.querySelector(".menu-content"),
+ current_size_str = window.getComputedStyle(text_element, null).getPropertyValue('font-size'),
+ current_size = parseFloat(current_size_str),
+ new_size = Math.min((current_size+2), 24),
+ new_size_str = new_size + 'px';
+
+ root_element.classList.remove("post-size-"+current_size_str);
+ root_element.classList.add("post-size-"+new_size_str);
+ }, element);
+ }
+ };
+})
+
+.directive('smallerText', function($ionicGesture) {
+ return {
+ restrict: 'A',
+ link: function(scope, element, attrs) {
+ $ionicGesture.on('touch', function(event){
+ event.stopPropagation();
+ event.preventDefault();
+
+ var text_element = document.querySelector(attrs.smallerText),
+ root_element = document.querySelector(".menu-content"),
+ current_size_str = window.getComputedStyle(text_element, null).getPropertyValue('font-size'),
+ current_size = parseFloat(current_size_str),
+ new_size = Math.max((current_size-2), 12),
+ new_size_str = new_size + 'px';
+
+ root_element.classList.remove("post-size-"+current_size_str);
+ root_element.classList.add("post-size-"+new_size_str);
+ }, element);
+ }
+ };
+})
+
+.directive('ionicYoutubeVideo', function($timeout, $ionicPlatform, youtubeEmbedUtils) {
+ return {
+ restrict: 'E',
+ scope: {
+ videoId: '@'
+ },
+ controller: function($scope, $element, $attrs) {
+ $scope.playerVars = {
+ rel: 0,
+ showinfo: 0
+ };
+ $ionicPlatform.on("pause", function(){
+ var yt_ready = youtubeEmbedUtils.ready;
+ if(yt_ready)
+ {
+ $scope.yt_video.stopVideo();
+ }
+ });
+ },
+ templateUrl: 'views/common/ionic-youtube-video.html',
+ replace: false
+ };
+})
+
+.directive('postContent', function($timeout, _, $compile) {
+ return {
+ restrict: 'A',
+ scope: {},
+ link: function(scope, element, attrs) {
+ /**
+ * JavaScript function to match (and return) the video Id
+ * of any valid Youtube Url, given as input string.
+ * @author: Stephan Schmitz
+ * @url: http://stackoverflow.com/a/10315969/624466
+ */
+ // Ver: https://regex101.com/r/tY9jN6/1
+ function ytVidId(url) {
+ var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11,})(?:\S+)?$/gmi;
+ return (url.match(p)) ? RegExp.$1 : false;
+ }
+
+ $timeout(function(){
+ var iframes = element.find('iframe');
+ if(iframes.length > 0)
+ {
+ angular.forEach(iframes, function(i) {
+
+ var iframe = angular.element(i),
+ youtube_video_id = ((iframe.length > 0) && (!_.isUndefined(iframe[0].src))) ? ytVidId(iframe[0].src) : false;
+ if(youtube_video_id !== false)
+ {
+ // Then it's a youtube video, compile our custom directive
+ var ionic_yt_video = $compile(" ")(scope);
+ iframe.parent().append(ionic_yt_video);
+ iframe.remove();
+ }
+ });
+ }
+ }, 10);
+ }
+ };
+})
+
+//Use this directive to open external links using inAppBrowser cordova plugin
+.directive('dynamicAnchorFix', function($ionicGesture, $timeout, $cordovaInAppBrowser) {
+ return {
+ scope: {},
+ link: function(scope, element, attrs) {
+ $timeout(function(){
+ var anchors = element.find('a');
+ if(anchors.length > 0)
+ {
+ angular.forEach(anchors, function(a) {
+
+ var anchor = angular.element(a);
+
+ anchor.bind('click', function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ var href = event.currentTarget.href;
+ var options = {};
+
+ //inAppBrowser see documentation here: http://ngcordova.com/docs/plugins/inAppBrowser/
+
+ $cordovaInAppBrowser.open(href, '_blank', options)
+ .then(function(e) {
+ // success
+ })
+ .catch(function(e) {
+ // error
+ });
+ });
+
+ });
+ }
+ }, 10);
+ },
+ restrict: 'A',
+ replace: false,
+ transclude: false
+ };
+})
+
+
+.directive('multiBg', function(_){
+ return {
+ scope: {
+ multiBg: '=',
+ interval: '=',
+ helperClass: '@'
+ },
+ controller: function($scope, $element, $attrs) {
+ $scope.loaded = false;
+ var utils = this;
+
+ this.animateBg = function(){
+ // Think i have to use apply because this function is not called from this controller ($scope)
+ $scope.$apply(function () {
+ $scope.loaded = true;
+ $element.css({'background-image': 'url(' + $scope.bg_img + ')'});
+ });
+ };
+
+ this.setBackground = function(bg) {
+ $scope.bg_img = bg;
+ };
+
+ if(!_.isUndefined($scope.multiBg))
+ {
+ if(_.isArray($scope.multiBg) && ($scope.multiBg.length > 1) && !_.isUndefined($scope.interval) && _.isNumber($scope.interval))
+ {
+ // Then we need to loop through the bg images
+ utils.setBackground($scope.multiBg[0]);
+ }
+ else
+ {
+ // Then just set the multiBg image as background image
+ utils.setBackground($scope.multiBg[0]);
+ }
+ }
+ },
+ templateUrl: 'views/common/multi-bg.html',
+ restrict: 'A',
+ replace: true,
+ transclude: true
+ };
+})
+
+
+.directive('bg', function() {
+ return {
+ restrict: 'A',
+ require: '^multiBg',
+ scope: {
+ ngSrc: '@'
+ },
+ link: function(scope, element, attr, multiBgController) {
+ element.on('load', function() {
+ multiBgController.animateBg();
+ });
+ }
+ };
+})
+
+.directive('preImg', function() {
+ return {
+ restrict: 'E',
+ transclude: true,
+ scope: {
+ ratio:'@',
+ helperClass: '@'
+ },
+ controller: function($scope) {
+ $scope.loaded = false;
+
+ this.hideSpinner = function(){
+ // Think i have to use apply because this function is not called from this controller ($scope)
+ $scope.$apply(function () {
+ $scope.loaded = true;
+ });
+ };
+ },
+ templateUrl: 'views/common/pre-img.html'
+ };
+})
+
+.directive('spinnerOnLoad', function() {
+ return {
+ restrict: 'A',
+ require: '^preImg',
+ scope: {
+ ngSrc: '@'
+ },
+ link: function(scope, element, attr, preImgController) {
+ element.on('load', function() {
+ preImgController.hideSpinner();
+ });
+ }
+ };
+})
+
+
+;
diff --git a/hackatonApp/www/js/factories.js b/hackatonApp/www/js/factories.js
new file mode 100644
index 0000000..798010e
--- /dev/null
+++ b/hackatonApp/www/js/factories.js
@@ -0,0 +1,212 @@
+angular.module('your_app_name.factories', [])
+
+.factory('FeedLoader', function ($resource){
+ return $resource('http://ajax.googleapis.com/ajax/services/feed/load', {}, {
+ fetch: { method: 'JSONP', params: {v: '1.0', callback: 'JSON_CALLBACK'} }
+ });
+})
+
+
+// Factory for node-pushserver (running locally in this case), if you are using other push notifications server you need to change this
+.factory('NodePushServer', function ($http){
+ // Configure push notifications server address
+ // - If you are running a local push notifications server you can test this by setting the local IP (on mac run: ipconfig getifaddr en1)
+ var push_server_address = "http://192.168.1.102:8000";
+
+ return {
+ // Stores the device token in a db using node-pushserver
+ // type: Platform type (ios, android etc)
+ storeDeviceToken: function(type, regId) {
+ // Create a random userid to store with it
+ var user = {
+ user: 'user' + Math.floor((Math.random() * 10000000) + 1),
+ type: type,
+ token: regId
+ };
+ console.log("Post token for registered device with data " + JSON.stringify(user));
+
+ $http.post(push_server_address+'/subscribe', JSON.stringify(user))
+ .success(function (data, status) {
+ console.log("Token stored, device is successfully subscribed to receive push notifications.");
+ })
+ .error(function (data, status) {
+ console.log("Error storing device token." + data + " " + status);
+ });
+ },
+ // CURRENTLY NOT USED!
+ // Removes the device token from the db via node-pushserver API unsubscribe (running locally in this case).
+ // If you registered the same device with different userids, *ALL* will be removed. (It's recommended to register each
+ // time the app opens which this currently does. However in many cases you will always receive the same device token as
+ // previously so multiple userids will be created with the same token unless you add code to check).
+ removeDeviceToken: function(token) {
+ var tkn = {"token": token};
+ $http.post(push_server_address+'/unsubscribe', JSON.stringify(tkn))
+ .success(function (data, status) {
+ console.log("Token removed, device is successfully unsubscribed and will not receive push notifications.");
+ })
+ .error(function (data, status) {
+ console.log("Error removing device token." + data + " " + status);
+ });
+ }
+ };
+})
+
+
+.factory('AdMob', function ($window){
+ var admob = $window.AdMob;
+
+ if(admob)
+ {
+ // Register AdMob events
+ // new events, with variable to differentiate: adNetwork, adType, adEvent
+ document.addEventListener('onAdFailLoad', function(data){
+ console.log('error: ' + data.error +
+ ', reason: ' + data.reason +
+ ', adNetwork:' + data.adNetwork +
+ ', adType:' + data.adType +
+ ', adEvent:' + data.adEvent); // adType: 'banner' or 'interstitial'
+ });
+ document.addEventListener('onAdLoaded', function(data){
+ console.log('onAdLoaded: ' + data);
+ });
+ document.addEventListener('onAdPresent', function(data){
+ console.log('onAdPresent: ' + data);
+ });
+ document.addEventListener('onAdLeaveApp', function(data){
+ console.log('onAdLeaveApp: ' + data);
+ });
+ document.addEventListener('onAdDismiss', function(data){
+ console.log('onAdDismiss: ' + data);
+ });
+
+ var defaultOptions = {
+ // bannerId: admobid.banner,
+ // interstitialId: admobid.interstitial,
+ // adSize: 'SMART_BANNER',
+ // width: integer, // valid when set adSize 'CUSTOM'
+ // height: integer, // valid when set adSize 'CUSTOM'
+ position: admob.AD_POSITION.BOTTOM_CENTER,
+ // offsetTopBar: false, // avoid overlapped by status bar, for iOS7+
+ bgColor: 'black', // color name, or '#RRGGBB'
+ // x: integer, // valid when set position to 0 / POS_XY
+ // y: integer, // valid when set position to 0 / POS_XY
+ isTesting: true, // set to true, to receiving test ad for testing purpose
+ // autoShow: true // auto show interstitial ad when loaded, set to false if prepare/show
+ };
+ var admobid = {};
+
+ if(ionic.Platform.isAndroid())
+ {
+ admobid = { // for Android
+ banner: 'ca-app-pub-6869992474017983/9375997553',
+ interstitial: 'ca-app-pub-6869992474017983/1657046752'
+ };
+ }
+
+ if(ionic.Platform.isIOS())
+ {
+ admobid = { // for iOS
+ banner: 'ca-app-pub-6869992474017983/4806197152',
+ interstitial: 'ca-app-pub-6869992474017983/7563979554'
+ };
+ }
+
+ admob.setOptions(defaultOptions);
+
+ // Prepare the ad before showing it
+ // - (for example at the beginning of a game level)
+ admob.prepareInterstitial({
+ adId: admobid.interstitial,
+ autoShow: false,
+ success: function(){
+ console.log('interstitial prepared');
+ },
+ error: function(){
+ console.log('failed to prepare interstitial');
+ }
+ });
+ }
+ else
+ {
+ console.log("No AdMob?");
+ }
+
+ return {
+ showBanner: function() {
+ if(admob)
+ {
+ admob.createBanner({
+ adId:admobid.banner,
+ position:admob.AD_POSITION.BOTTOM_CENTER,
+ autoShow:true,
+ success: function(){
+ console.log('banner created');
+ },
+ error: function(){
+ console.log('failed to create banner');
+ }
+ });
+ }
+ },
+ showInterstitial: function() {
+ if(admob)
+ {
+ // If you didn't prepare it before, you can show it like this
+ // admob.prepareInterstitial({adId:admobid.interstitial, autoShow:autoshow});
+
+ // If you did prepare it before, then show it like this
+ // - (for example: check and show it at end of a game level)
+ admob.showInterstitial();
+ }
+ },
+ removeAds: function() {
+ if(admob)
+ {
+ admob.removeBanner();
+ }
+ }
+ };
+})
+
+.factory('iAd', function ($window){
+ var iAd = $window.iAd;
+
+ // preppare and load ad resource in background, e.g. at begining of game level
+ if(iAd) {
+ iAd.prepareInterstitial( { autoShow:false } );
+ }
+ else
+ {
+ console.log("No iAd?");
+ }
+
+ return {
+ showBanner: function() {
+ if(iAd)
+ {
+ // show a default banner at bottom
+ iAd.createBanner({
+ position:iAd.AD_POSITION.BOTTOM_CENTER,
+ autoShow:true
+ });
+ }
+ },
+ showInterstitial: function() {
+ // ** Notice: iAd interstitial Ad only supports iPad.
+ if(iAd)
+ {
+ // If you did prepare it before, then show it like this
+ // - (for example: check and show it at end of a game level)
+ iAd.showInterstitial();
+ }
+ },
+ removeAds: function() {
+ if(iAd)
+ {
+ iAd.removeBanner();
+ }
+ }
+ };
+})
+
+;
diff --git a/hackatonApp/www/js/filters.js b/hackatonApp/www/js/filters.js
new file mode 100644
index 0000000..0b5f3af
--- /dev/null
+++ b/hackatonApp/www/js/filters.js
@@ -0,0 +1,15 @@
+angular.module('your_app_name.filters', [])
+
+.filter('rawHtml', function($sce){
+ return function(val) {
+ return $sce.trustAsHtml(val);
+ };
+})
+
+.filter('parseDate', function() {
+ return function(value) {
+ return Date.parse(value);
+ };
+})
+
+;
diff --git a/hackatonApp/www/js/services.js b/hackatonApp/www/js/services.js
new file mode 100644
index 0000000..3d6b9bf
--- /dev/null
+++ b/hackatonApp/www/js/services.js
@@ -0,0 +1,227 @@
+angular.module('your_app_name.services', [])
+
+.service('FeedList', function ($rootScope, FeedLoader, $q){
+ this.get = function(feedSourceUrl) {
+ var response = $q.defer();
+ //num is the number of results to pull form the source
+ FeedLoader.fetch({q: feedSourceUrl, num: 20}, {}, function (data){
+ response.resolve(data.responseData);
+ });
+ return response.promise;
+ };
+})
+
+
+// PUSH NOTIFICATIONS
+.service('PushNotificationsService', function ($rootScope, $cordovaPush, NodePushServer, GCM_SENDER_ID){
+ /* Apple recommends you register your application for push notifications on the device every time it’s run since tokens can change. The documentation says: ‘By requesting the device token and passing it to the provider every time your application launches, you help to ensure that the provider has the current token for the device. If a user restores a backup to a device other than the one that the backup was created for (for example, the user migrates data to a new device), he or she must launch the application at least once for it to receive notifications again. If the user restores backup data to a new device or reinstalls the operating system, the device token changes. Moreover, never cache a device token and give that to your provider; always get the token from the system whenever you need it.’ */
+ this.register = function() {
+ var config = {};
+
+ // ANDROID PUSH NOTIFICATIONS
+ if(ionic.Platform.isAndroid())
+ {
+ config = {
+ "senderID": GCM_SENDER_ID
+ };
+
+ $cordovaPush.register(config).then(function(result) {
+ // Success
+ console.log("$cordovaPush.register Success");
+ console.log(result);
+ }, function(err) {
+ // Error
+ console.log("$cordovaPush.register Error");
+ console.log(err);
+ });
+
+ $rootScope.$on('$cordovaPush:notificationReceived', function(event, notification) {
+ console.log(JSON.stringify([notification]));
+ switch(notification.event)
+ {
+ case 'registered':
+ if (notification.regid.length > 0 ) {
+ console.log('registration ID = ' + notification.regid);
+ NodePushServer.storeDeviceToken("android", notification.regid);
+ }
+ break;
+
+ case 'message':
+ if(notification.foreground == "1")
+ {
+ console.log("Notification received when app was opened (foreground = true)");
+ }
+ else
+ {
+ if(notification.coldstart == "1")
+ {
+ console.log("Notification received when app was closed (not even in background, foreground = false, coldstart = true)");
+ }
+ else
+ {
+ console.log("Notification received when app was in background (started but not focused, foreground = false, coldstart = false)");
+ }
+ }
+
+ // this is the actual push notification. its format depends on the data model from the push server
+ console.log('message = ' + notification.message);
+ break;
+
+ case 'error':
+ console.log('GCM error = ' + notification.msg);
+ break;
+
+ default:
+ console.log('An unknown GCM event has occurred');
+ break;
+ }
+ });
+
+ // WARNING: dangerous to unregister (results in loss of tokenID)
+ // $cordovaPush.unregister(options).then(function(result) {
+ // // Success!
+ // }, function(err) {
+ // // Error
+ // });
+ }
+
+ if(ionic.Platform.isIOS())
+ {
+ config = {
+ "badge": true,
+ "sound": true,
+ "alert": true
+ };
+
+ $cordovaPush.register(config).then(function(result) {
+ // Success -- send deviceToken to server, and store for future use
+ console.log("result: " + result);
+ NodePushServer.storeDeviceToken("ios", result);
+ }, function(err) {
+ console.log("Registration error: " + err);
+ });
+
+ $rootScope.$on('$cordovaPush:notificationReceived', function(event, notification) {
+ console.log(notification.alert, "Push Notification Received");
+ });
+ }
+ };
+})
+
+
+// BOOKMARKS FUNCTIONS
+.service('BookMarkService', function (_, $rootScope){
+
+ this.bookmarkFeedPost = function(bookmark_post){
+
+ var user_bookmarks = !_.isUndefined(window.localStorage.ionFullApp_feed_bookmarks) ?
+ JSON.parse(window.localStorage.ionFullApp_feed_bookmarks) : [];
+
+ //check if this post is already saved
+
+ var existing_post = _.find(user_bookmarks, function(post){ return post.link == bookmark_post.link; });
+
+ if(!existing_post){
+ user_bookmarks.push({
+ link: bookmark_post.link,
+ title : bookmark_post.title,
+ date: bookmark_post.publishedDate,
+ excerpt: bookmark_post.contentSnippet
+ });
+ }
+
+ window.localStorage.ionFullApp_feed_bookmarks = JSON.stringify(user_bookmarks);
+ $rootScope.$broadcast("new-bookmark");
+ };
+
+ this.bookmarkWordpressPost = function(bookmark_post){
+
+ var user_bookmarks = !_.isUndefined(window.localStorage.ionFullApp_wordpress_bookmarks) ?
+ JSON.parse(window.localStorage.ionFullApp_wordpress_bookmarks) : [];
+
+ //check if this post is already saved
+
+ var existing_post = _.find(user_bookmarks, function(post){ return post.id == bookmark_post.id; });
+
+ if(!existing_post){
+ user_bookmarks.push({
+ id: bookmark_post.id,
+ title : bookmark_post.title,
+ date: bookmark_post.date,
+ excerpt: bookmark_post.excerpt
+ });
+ }
+
+ window.localStorage.ionFullApp_wordpress_bookmarks = JSON.stringify(user_bookmarks);
+ $rootScope.$broadcast("new-bookmark");
+ };
+
+ this.getBookmarks = function(){
+ return {
+ feeds : JSON.parse(window.localStorage.ionFullApp_feed_bookmarks || '[]'),
+ wordpress: JSON.parse(window.localStorage.ionFullApp_wordpress_bookmarks || '[]')
+ };
+ };
+})
+
+
+// WP POSTS RELATED FUNCTIONS
+.service('PostService', function ($rootScope, $http, $q, WORDPRESS_API_URL){
+
+ this.getRecentPosts = function(page) {
+ var deferred = $q.defer();
+
+ $http.jsonp(WORDPRESS_API_URL + 'get_recent_posts/' +
+ '?page='+ page +
+ '&callback=JSON_CALLBACK')
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data) {
+ deferred.reject(data);
+ });
+
+ return deferred.promise;
+ };
+
+
+ this.getPost = function(postId) {
+ var deferred = $q.defer();
+
+ $http.jsonp(WORDPRESS_API_URL + 'get_post/' +
+ '?post_id='+ postId +
+ '&callback=JSON_CALLBACK')
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data) {
+ deferred.reject(data);
+ });
+
+ return deferred.promise;
+ };
+
+ this.shortenPosts = function(posts) {
+ //we will shorten the post
+ //define the max length (characters) of your post content
+ var maxLength = 500;
+ return _.map(posts, function(post){
+ if(post.content.length > maxLength){
+ //trim the string to the maximum length
+ var trimmedString = post.content.substr(0, maxLength);
+ //re-trim if we are in the middle of a word
+ trimmedString = trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf("
")));
+ post.content = trimmedString;
+ }
+ return post;
+ });
+ };
+
+ this.sharePost = function(link){
+ window.plugins.socialsharing.share('Check this post here: ', null, null, link);
+ };
+
+})
+
+
+;
diff --git a/hackatonApp/www/views/app/bookmarks.html b/hackatonApp/www/views/app/bookmarks.html
new file mode 100644
index 0000000..eefe39d
--- /dev/null
+++ b/hackatonApp/www/views/app/bookmarks.html
@@ -0,0 +1,35 @@
+
+
+ Bookmarks
+
+
+
+
+
+
+
There's nothing here yet. Start exploring!
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/feeds/category-feeds.html b/hackatonApp/www/views/app/feeds/category-feeds.html
new file mode 100644
index 0000000..54b8f00
--- /dev/null
+++ b/hackatonApp/www/views/app/feeds/category-feeds.html
@@ -0,0 +1,21 @@
+
+
+ {{categoryTitle}} feeds
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/feeds/feed-entries.html b/hackatonApp/www/views/app/feeds/feed-entries.html
new file mode 100644
index 0000000..684134c
--- /dev/null
+++ b/hackatonApp/www/views/app/feeds/feed-entries.html
@@ -0,0 +1,34 @@
+
+
+ {{sourceTitle}}
+
+
+
+
+
+
+
+
+
+
+
+ Published {{ entry.publishedDate | parseDate | amTimeAgo }}
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/feeds/feeds-categories.html b/hackatonApp/www/views/app/feeds/feeds-categories.html
new file mode 100644
index 0000000..13e3ef0
--- /dev/null
+++ b/hackatonApp/www/views/app/feeds/feeds-categories.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+ Feeds Categories
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/forms.html b/hackatonApp/www/views/app/forms.html
new file mode 100644
index 0000000..8bc2f1f
--- /dev/null
+++ b/hackatonApp/www/views/app/forms.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+ Forms
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/layouts/layouts.html b/hackatonApp/www/views/app/layouts/layouts.html
new file mode 100644
index 0000000..46eb21d
--- /dev/null
+++ b/hackatonApp/www/views/app/layouts/layouts.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Layouts
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/layouts/slider.html b/hackatonApp/www/views/app/layouts/slider.html
new file mode 100644
index 0000000..bb130db
--- /dev/null
+++ b/hackatonApp/www/views/app/layouts/slider.html
@@ -0,0 +1,19 @@
+
+
+ Slider
+
+
+
+
+
+
+
+
+
+
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/layouts/tinder-cards.html b/hackatonApp/www/views/app/layouts/tinder-cards.html
new file mode 100644
index 0000000..97c6d0f
--- /dev/null
+++ b/hackatonApp/www/views/app/layouts/tinder-cards.html
@@ -0,0 +1,34 @@
+
+
+ Tinder Cards
+
+
+
+
+
+
+
+
+
+
+ {{card.name}}
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/miscellaneous/image-picker.html b/hackatonApp/www/views/app/miscellaneous/image-picker.html
new file mode 100644
index 0000000..fda840c
--- /dev/null
+++ b/hackatonApp/www/views/app/miscellaneous/image-picker.html
@@ -0,0 +1,28 @@
+
+
+ Image picker
+
+
+
+ Select Images
+
+
+ Share All
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/miscellaneous/maps.html b/hackatonApp/www/views/app/miscellaneous/maps.html
new file mode 100644
index 0000000..a8a1dc9
--- /dev/null
+++ b/hackatonApp/www/views/app/miscellaneous/maps.html
@@ -0,0 +1,38 @@
+
+
+ Maps
+
+
+
+
+
+
+
+
+
+
The best restaurant
+ This is html so you can put whatever
+ you want such as images and
links
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/miscellaneous/miscellaneous.html b/hackatonApp/www/views/app/miscellaneous/miscellaneous.html
new file mode 100644
index 0000000..27f1206
--- /dev/null
+++ b/hackatonApp/www/views/app/miscellaneous/miscellaneous.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+ Miscellaneous
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/profile.html b/hackatonApp/www/views/app/profile.html
new file mode 100644
index 0000000..fe317c4
--- /dev/null
+++ b/hackatonApp/www/views/app/profile.html
@@ -0,0 +1,26 @@
+
+
+ Profile
+
+
+
+
+
+
+
+
+
+
Brynn Evans
+
+
+
+
+
+
+
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
+
+
+
+
diff --git a/hackatonApp/www/views/app/settings.html b/hackatonApp/www/views/app/settings.html
new file mode 100644
index 0000000..42d7a22
--- /dev/null
+++ b/hackatonApp/www/views/app/settings.html
@@ -0,0 +1,50 @@
+
+
+
+
+
+ Settings
+
+
+
+
+ TOGGLE
+
+ Airplane Mode
+ Wi-Fi
+ Bluetooth
+ Personal Hotspot
+
+ CHECKBOXES
+
+ Option 1
+ Option 2
+ Option 3
+
+ RADIO
+
+ Choose A
+ Choose B
+ Choose C
+
+ RANGES
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Logout
+
+
+
+
diff --git a/hackatonApp/www/views/app/side-menu.html b/hackatonApp/www/views/app/side-menu.html
new file mode 100644
index 0000000..bcc15bf
--- /dev/null
+++ b/hackatonApp/www/views/app/side-menu.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hi Brynn
+ Welcome back
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/wordpress/wordpress.html b/hackatonApp/www/views/app/wordpress/wordpress.html
new file mode 100644
index 0000000..1afb64d
--- /dev/null
+++ b/hackatonApp/www/views/app/wordpress/wordpress.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+ WordPress
+
+
+
+
+
+
+
+
+
+
+
+ By {{post.author.nickname}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/app/wordpress/wordpress_post.html b/hackatonApp/www/views/app/wordpress/wordpress_post.html
new file mode 100644
index 0000000..6c4d054
--- /dev/null
+++ b/hackatonApp/www/views/app/wordpress/wordpress_post.html
@@ -0,0 +1,32 @@
+
+
+
+
{{post.title}}
+
+ By {{post.author.nickname}}
+
+
+
+
+ {{category.title}}
+
+
+
+
diff --git a/hackatonApp/www/views/auth/auth.html b/hackatonApp/www/views/auth/auth.html
new file mode 100644
index 0000000..4c695d4
--- /dev/null
+++ b/hackatonApp/www/views/auth/auth.html
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/hackatonApp/www/views/auth/forgot-password.html b/hackatonApp/www/views/auth/forgot-password.html
new file mode 100644
index 0000000..7b9d49d
--- /dev/null
+++ b/hackatonApp/www/views/auth/forgot-password.html
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/hackatonApp/www/views/auth/login.html b/hackatonApp/www/views/auth/login.html
new file mode 100644
index 0000000..07fb8f5
--- /dev/null
+++ b/hackatonApp/www/views/auth/login.html
@@ -0,0 +1,47 @@
+
+
+
+
+
diff --git a/hackatonApp/www/views/auth/signup.html b/hackatonApp/www/views/auth/signup.html
new file mode 100644
index 0000000..3298115
--- /dev/null
+++ b/hackatonApp/www/views/auth/signup.html
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/hackatonApp/www/views/auth/walkthrough.html b/hackatonApp/www/views/auth/walkthrough.html
new file mode 100644
index 0000000..eeae51c
--- /dev/null
+++ b/hackatonApp/www/views/auth/walkthrough.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/common/ionic-youtube-video.html b/hackatonApp/www/views/common/ionic-youtube-video.html
new file mode 100644
index 0000000..845906f
--- /dev/null
+++ b/hackatonApp/www/views/common/ionic-youtube-video.html
@@ -0,0 +1 @@
+
diff --git a/hackatonApp/www/views/common/multi-bg.html b/hackatonApp/www/views/common/multi-bg.html
new file mode 100644
index 0000000..4bbeb5d
--- /dev/null
+++ b/hackatonApp/www/views/common/multi-bg.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/hackatonApp/www/views/common/my-tab.html b/hackatonApp/www/views/common/my-tab.html
new file mode 100644
index 0000000..c779e2b
--- /dev/null
+++ b/hackatonApp/www/views/common/my-tab.html
@@ -0,0 +1 @@
+
diff --git a/hackatonApp/www/views/common/my-tabs.html b/hackatonApp/www/views/common/my-tabs.html
new file mode 100644
index 0000000..8df8479
--- /dev/null
+++ b/hackatonApp/www/views/common/my-tabs.html
@@ -0,0 +1,10 @@
+
+
diff --git a/hackatonApp/www/views/common/pre-img.html b/hackatonApp/www/views/common/pre-img.html
new file mode 100644
index 0000000..f53388b
--- /dev/null
+++ b/hackatonApp/www/views/common/pre-img.html
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/hackatonApp/www/views/common/show-hide-password.html b/hackatonApp/www/views/common/show-hide-password.html
new file mode 100644
index 0000000..1703ac5
--- /dev/null
+++ b/hackatonApp/www/views/common/show-hide-password.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+