diff --git a/README.md b/README.md index 10aeab7503..b28dd1cf26 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,33 @@ -#[HabitRPG](http://habitrpg.com/) +HabitRPG Rewrite +=============== -HabitRPG is a habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. +HabitRPG Rewrite under development. Built using Angular, Express, Mongoose, Jade, Stylus, Coffeescript. -[Read more](https://habitrpg.com/static/about) +**Note: This branch is under development, and these instructions may fall out of date. They were accurate as of August 5, 2013.** Should you encounter this, join #habitrpg on IRC (Freenode) and talk to litenull. -![Screenshot](https://raw.github.com/lefnire/habitrpg/master/public/img/screenshot.jpeg "Screenshot") +The general steps are: -##License -Code is licensed under GNU GPL v3. Content is licensed under CC-BY-SA 3.0. -See the LICENSE file for details. +1. Clone the repo +1. Install all dependencies +1. Run the client -##Credits -Content comes from Mozilla's [BrowserQuest](http://browserquest.mozilla.org/) +Or, expressed in commands on the command line: - * [Mozilla](http://mozilla.org) - * [Little Workshop](http://www.littleworkshop.fr) \ No newline at end of file +1. `git clone --recursive -b angular_rewrite https://github.com/lefnire/habitrpg.git` +1. `cd habirpg && npm install` +1. `npm start` + +To access the site, open http://localhost:3000 in your browser. + +# Technologies + +1. Angular, Express, Mongoose. Awesome, tried technologies. Read up on them. +1. CoffeeScript, Stylus, Jade - big debate. + 1. Jade. We need a server-side templating language so we can inject variables (`res.locals` from Express). Jade is great + because the "significant whitespace" paradigm protects you from HTML errors such as missing or mal-matched close tags, + which has been a pretty common error from multiple contribs on Habit. However, it's not very HTML-y, and makes people mad. + We'll re-visit this conversation after the rewrite is done. + 1. Stylus. We're either staying here or moving to LESS, but vanilla CSS isn't cutting it for our app. + 1. CoffeeScript. This is the hottest debate. I'm using it to rewrite, and Habit was written originally on CS. It's a + fantastic language, but it's a barrier-to-entry for potential contribs who don't know it. Will also revisit right after + the rewrite. \ No newline at end of file diff --git a/archive/README.md b/archive/README.md new file mode 100644 index 0000000000..a1e5cc1ee4 --- /dev/null +++ b/archive/README.md @@ -0,0 +1,8 @@ +# What's This? + +I'm consolidating @litenull's rewrite branch with the old code, and removing files from both sources once they've been +successfully merged into the new platform. While @litenull's "from scratch" approach was really clean, it will take +us longer to implemente all the original features. This approach will (1) let us leverage code we already have, (2) merge +in litenull's hard work from the last few weeks. + +Once this archive/ directory is completely empty, we should be fully merged and ready to deploy the rewrite! \ No newline at end of file diff --git a/assets/js/app.coffee b/archive/derby_controllers/app.coffee similarity index 100% rename from assets/js/app.coffee rename to archive/derby_controllers/app.coffee diff --git a/assets/js/browser.coffee b/archive/derby_controllers/browser.coffee similarity index 100% rename from assets/js/browser.coffee rename to archive/derby_controllers/browser.coffee diff --git a/assets/js/challenges.coffee b/archive/derby_controllers/challenges.coffee similarity index 100% rename from assets/js/challenges.coffee rename to archive/derby_controllers/challenges.coffee diff --git a/assets/js/debug.coffee b/archive/derby_controllers/debug.coffee similarity index 100% rename from assets/js/debug.coffee rename to archive/derby_controllers/debug.coffee diff --git a/assets/js/filters.coffee b/archive/derby_controllers/filters.coffee similarity index 100% rename from assets/js/filters.coffee rename to archive/derby_controllers/filters.coffee diff --git a/assets/js/groups.coffee b/archive/derby_controllers/groups.coffee similarity index 100% rename from assets/js/groups.coffee rename to archive/derby_controllers/groups.coffee diff --git a/assets/js/i18n.coffee b/archive/derby_controllers/i18n.coffee similarity index 100% rename from assets/js/i18n.coffee rename to archive/derby_controllers/i18n.coffee diff --git a/assets/js/index.coffee b/archive/derby_controllers/index.coffee similarity index 98% rename from assets/js/index.coffee rename to archive/derby_controllers/index.coffee index b33304b0c5..efbf40c87c 100644 --- a/assets/js/index.coffee +++ b/archive/derby_controllers/index.coffee @@ -2,7 +2,7 @@ derby = require 'derby' # Include library components derby.use require('derby-ui-boot'), {styles: []} -derby.use require '../' +derby.use require '../.' derby.use require 'derby-auth/components' # Init app & reference its functions @@ -113,7 +113,7 @@ ready (model) -> require('./debug').app(exports, model) if model.flags.nodeEnv != 'production' browser.app(exports, model, app) require('./unlock').app(exports, model) - require('./filters').app(exports, model) + require('./../.').app(exports, model) require('./challenges').app(exports, model) # used for things like remove website, chat, etc diff --git a/assets/js/items.coffee b/archive/derby_controllers/items.coffee similarity index 100% rename from assets/js/items.coffee rename to archive/derby_controllers/items.coffee diff --git a/assets/js/misc.coffee b/archive/derby_controllers/misc.coffee similarity index 100% rename from assets/js/misc.coffee rename to archive/derby_controllers/misc.coffee diff --git a/assets/js/pets.coffee b/archive/derby_controllers/pets.coffee similarity index 100% rename from assets/js/pets.coffee rename to archive/derby_controllers/pets.coffee diff --git a/assets/js/profile.coffee b/archive/derby_controllers/profile.coffee similarity index 100% rename from assets/js/profile.coffee rename to archive/derby_controllers/profile.coffee diff --git a/assets/js/tasks.coffee b/archive/derby_controllers/tasks.coffee similarity index 100% rename from assets/js/tasks.coffee rename to archive/derby_controllers/tasks.coffee diff --git a/assets/js/unlock.coffee b/archive/derby_controllers/unlock.coffee similarity index 100% rename from assets/js/unlock.coffee rename to archive/derby_controllers/unlock.coffee diff --git a/archive/litenull_rewrite/.afignore b/archive/litenull_rewrite/.afignore new file mode 100644 index 0000000000..08499c2b0a --- /dev/null +++ b/archive/litenull_rewrite/.afignore @@ -0,0 +1,5 @@ +.DS_Store +public/gen/ +#lib/ +*.swp +.idea/ diff --git a/archive/litenull_rewrite/.bowerrc b/archive/litenull_rewrite/.bowerrc new file mode 100644 index 0000000000..ba0accc5a3 --- /dev/null +++ b/archive/litenull_rewrite/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/archive/litenull_rewrite/.gitignore b/archive/litenull_rewrite/.gitignore new file mode 100644 index 0000000000..565589afe0 --- /dev/null +++ b/archive/litenull_rewrite/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +public/gen +node_modules +#lib/ +*.swp +.idea* +config.json +npm-debug.log +app/bower_components diff --git a/archive/litenull_rewrite/README.md b/archive/litenull_rewrite/README.md new file mode 100644 index 0000000000..5d457d1ae0 --- /dev/null +++ b/archive/litenull_rewrite/README.md @@ -0,0 +1,22 @@ +HabitRPG Rewrite +=============== + +HabitRPG Rewrite under development. Built using Angular. + +**Note: This branch is under development, and these instructions may fall out of date. They were accurate as of August 5, 2013.** Should you encounter this, join #habitrpg on IRC (Freenode) and talk to litenull. + +The general steps are: + +1. Set up and run the [server](https://github.com/lefnire/habitrpg/wiki/Running-Locally-%28Server%29) +1. Clone the repo +1. Install all dependencies +1. Run the client + +Or, expressed in commands on the command line: + +1. `git clone --branch angular_rewrite git://github.com/lefnire/habitrpg habitrpg-angular` +1. `npm install` +1. `bower install` (if you don't have `bower`, do `npm install -g bower` — might need `sudo`) +1. `node server.js` + +To access the site, open http://localhost:3003 in your browser. \ No newline at end of file diff --git a/archive/litenull_rewrite/app/.buildignore b/archive/litenull_rewrite/app/.buildignore new file mode 100644 index 0000000000..fc98b8eb54 --- /dev/null +++ b/archive/litenull_rewrite/app/.buildignore @@ -0,0 +1 @@ +*.coffee \ No newline at end of file diff --git a/archive/litenull_rewrite/app/.htaccess b/archive/litenull_rewrite/app/.htaccess new file mode 100644 index 0000000000..220c86898e --- /dev/null +++ b/archive/litenull_rewrite/app/.htaccess @@ -0,0 +1,553 @@ +# Apache configuration file +# httpd.apache.org/docs/2.2/mod/quickreference.html + +# Note .htaccess files are an overhead, this logic should be in your Apache +# config if possible: httpd.apache.org/docs/2.2/howto/htaccess.html + +# Techniques in here adapted from all over, including: +# Kroc Camen: camendesign.com/.htaccess +# perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ +# Sample .htaccess file of CMS MODx: modxcms.com + + +# ---------------------------------------------------------------------- +# Better website experience for IE users +# ---------------------------------------------------------------------- + +# Force the latest IE version, in various cases when it may fall back to IE7 mode +# github.com/rails/rails/commit/123eb25#commitcomment-118920 +# Use ChromeFrame if it's installed for a better experience for the poor IE folk + + + Header set X-UA-Compatible "IE=Edge,chrome=1" + # mod_headers can't match by content-type, but we don't want to send this header on *everything*... + + Header unset X-UA-Compatible + + + + +# ---------------------------------------------------------------------- +# Cross-domain AJAX requests +# ---------------------------------------------------------------------- + +# Serve cross-domain Ajax requests, disabled by default. +# enable-cors.org +# code.google.com/p/html5security/wiki/CrossOriginRequestSecurity + +# +# Header set Access-Control-Allow-Origin "*" +# + + +# ---------------------------------------------------------------------- +# CORS-enabled images (@crossorigin) +# ---------------------------------------------------------------------- + +# Send CORS headers if browsers request them; enabled by default for images. +# developer.mozilla.org/en/CORS_Enabled_Image +# blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html +# hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/ +# wiki.mozilla.org/Security/Reviews/crossoriginAttribute + + + + # mod_headers, y u no match by Content-Type?! + + SetEnvIf Origin ":" IS_CORS + Header set Access-Control-Allow-Origin "*" env=IS_CORS + + + + + +# ---------------------------------------------------------------------- +# Webfont access +# ---------------------------------------------------------------------- + +# Allow access from all domains for webfonts. +# Alternatively you could only whitelist your +# subdomains like "subdomain.example.com". + + + + Header set Access-Control-Allow-Origin "*" + + + + +# ---------------------------------------------------------------------- +# Proper MIME type for all files +# ---------------------------------------------------------------------- + +# JavaScript +# Normalize to standard type (it's sniffed in IE anyways) +# tools.ietf.org/html/rfc4329#section-7.2 +AddType application/javascript js jsonp +AddType application/json json + +# Audio +AddType audio/ogg oga ogg +AddType audio/mp4 m4a f4a f4b + +# Video +AddType video/ogg ogv +AddType video/mp4 mp4 m4v f4v f4p +AddType video/webm webm +AddType video/x-flv flv + +# SVG +# Required for svg webfonts on iPad +# twitter.com/FontSquirrel/status/14855840545 +AddType image/svg+xml svg svgz +AddEncoding gzip svgz + +# Webfonts +AddType application/vnd.ms-fontobject eot +AddType application/x-font-ttf ttf ttc +AddType font/opentype otf +AddType application/x-font-woff woff + +# Assorted types +AddType image/x-icon ico +AddType image/webp webp +AddType text/cache-manifest appcache manifest +AddType text/x-component htc +AddType application/xml rss atom xml rdf +AddType application/x-chrome-extension crx +AddType application/x-opera-extension oex +AddType application/x-xpinstall xpi +AddType application/octet-stream safariextz +AddType application/x-web-app-manifest+json webapp +AddType text/x-vcard vcf +AddType application/x-shockwave-flash swf +AddType text/vtt vtt + + +# ---------------------------------------------------------------------- +# Allow concatenation from within specific js and css files +# ---------------------------------------------------------------------- + +# e.g. Inside of script.combined.js you could have +# +# +# and they would be included into this single file. + +# This is not in use in the boilerplate as it stands. You may +# choose to use this technique if you do not have a build process. + +# +# Options +Includes +# AddOutputFilterByType INCLUDES application/javascript application/json +# SetOutputFilter INCLUDES +# + +# +# Options +Includes +# AddOutputFilterByType INCLUDES text/css +# SetOutputFilter INCLUDES +# + + +# ---------------------------------------------------------------------- +# Gzip compression +# ---------------------------------------------------------------------- + + + + # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/ + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + # HTML, TXT, CSS, JavaScript, JSON, XML, HTC: + + FilterDeclare COMPRESS + FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html + FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css + FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain + FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject + FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml + FilterProvider COMPRESS DEFLATE resp=Content-Type $image/x-icon + FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf + FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype + FilterChain COMPRESS + FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no + + + + # Legacy versions of Apache + AddOutputFilterByType DEFLATE text/html text/plain text/css application/json + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE text/xml application/xml text/x-component + AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml + AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype + + + + + +# ---------------------------------------------------------------------- +# Expires headers (for better cache control) +# ---------------------------------------------------------------------- + +# These are pretty far-future expires headers. +# They assume you control versioning with filename-based cache busting +# Additionally, consider that outdated proxies may miscache +# www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ + +# If you don't use filenames to version, lower the CSS and JS to something like +# "access plus 1 week". + + + ExpiresActive on + +# Perhaps better to whitelist expires rules? Perhaps. + ExpiresDefault "access plus 1 month" + +# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5) + ExpiresByType text/cache-manifest "access plus 0 seconds" + +# Your document html + ExpiresByType text/html "access plus 0 seconds" + +# Data + ExpiresByType text/xml "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType application/json "access plus 0 seconds" + +# Feed + ExpiresByType application/rss+xml "access plus 1 hour" + ExpiresByType application/atom+xml "access plus 1 hour" + +# Favicon (cannot be renamed) + ExpiresByType image/x-icon "access plus 1 week" + +# Media: images, video, audio + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + +# HTC files (css3pie) + ExpiresByType text/x-component "access plus 1 month" + +# Webfonts + ExpiresByType application/x-font-ttf "access plus 1 month" + ExpiresByType font/opentype "access plus 1 month" + ExpiresByType application/x-font-woff "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + +# CSS and JavaScript + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/javascript "access plus 1 year" + + + + +# ---------------------------------------------------------------------- +# Prevent mobile network providers from modifying your site +# ---------------------------------------------------------------------- + +# The following header prevents modification of your code over 3G on some +# European providers. +# This is the official 'bypass' suggested by O2 in the UK. + +# +# Header set Cache-Control "no-transform" +# + + +# ---------------------------------------------------------------------- +# ETag removal +# ---------------------------------------------------------------------- + +# FileETag None is not enough for every server. + + Header unset ETag + + +# Since we're sending far-future expires, we don't need ETags for +# static content. +# developer.yahoo.com/performance/rules.html#etags +FileETag None + + +# ---------------------------------------------------------------------- +# Stop screen flicker in IE on CSS rollovers +# ---------------------------------------------------------------------- + +# The following directives stop screen flicker in IE on CSS rollovers - in +# combination with the "ExpiresByType" rules for images (see above). + +# BrowserMatch "MSIE" brokenvary=1 +# BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1 +# BrowserMatch "Opera" !brokenvary +# SetEnvIf brokenvary 1 force-no-vary + + +# ---------------------------------------------------------------------- +# Set Keep-Alive Header +# ---------------------------------------------------------------------- + +# Keep-Alive allows the server to send multiple requests through one +# TCP-connection. Be aware of possible disadvantages of this setting. Turn on +# if you serve a lot of static content. + +# +# Header set Connection Keep-Alive +# + + +# ---------------------------------------------------------------------- +# Cookie setting from iframes +# ---------------------------------------------------------------------- + +# Allow cookies to be set from iframes (for IE only) +# If needed, specify a path or regex in the Location directive. + +# +# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" +# + + +# ---------------------------------------------------------------------- +# Start rewrite engine +# ---------------------------------------------------------------------- + +# Turning on the rewrite engine is necessary for the following rules and +# features. FollowSymLinks must be enabled for this to work. + +# Some cloud hosting services require RewriteBase to be set: goo.gl/HOcPN +# If using the h5bp in a subdirectory, use `RewriteBase /foo` instead where +# 'foo' is your directory. + +# If your web host doesn't allow the FollowSymlinks option, you may need to +# comment it out and use `Options +SymLinksOfOwnerMatch`, but be aware of the +# performance impact: http://goo.gl/Mluzd + + + Options +FollowSymlinks +# Options +SymLinksIfOwnerMatch + Options +FollowSymlinks + RewriteEngine On +# RewriteBase / + + + +# ---------------------------------------------------------------------- +# Suppress or force the "www." at the beginning of URLs +# ---------------------------------------------------------------------- + +# The same content should never be available under two different URLs - +# especially not with and without "www." at the beginning, since this can cause +# SEO problems (duplicate content). That's why you should choose one of the +# alternatives and redirect the other one. + +# By default option 1 (no "www.") is activated. +# no-www.org/faq.php?q=class_b + +# If you'd prefer to use option 2, just comment out all option 1 lines +# and uncomment option 2. + +# IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME! + +# ---------------------------------------------------------------------- + +# Option 1: +# Rewrite "www.example.com -> example.com". + + + RewriteCond %{HTTPS} !=on + RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] + RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] + + +# ---------------------------------------------------------------------- + +# Option 2: +# Rewrite "example.com -> www.example.com". +# Be aware that the following rule might not be a good idea if you use "real" +# subdomains for certain parts of your website. + +# +# RewriteCond %{HTTPS} !=on +# RewriteCond %{HTTP_HOST} !^www\..+$ [NC] +# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] +# + + +# ---------------------------------------------------------------------- +# Built-in filename-based cache busting +# ---------------------------------------------------------------------- + +# If you're not using the build script to manage your filename version revving, +# you might want to consider enabling this, which will route requests for +# /css/style.20110203.css to /css/style.css + +# To understand why this is important and a better idea than all.css?v1231, +# read: github.com/h5bp/html5-boilerplate/wiki/cachebusting + +# +# RewriteCond %{REQUEST_FILENAME} !-f +# RewriteCond %{REQUEST_FILENAME} !-d +# RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L] +# + + +# ---------------------------------------------------------------------- +# Prevent SSL cert warnings +# ---------------------------------------------------------------------- + +# Rewrite secure requests properly to prevent SSL cert warnings, e.g. prevent +# https://www.example.com when your cert only allows https://secure.example.com + +# +# RewriteCond %{SERVER_PORT} !^443 +# RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L] +# + + +# ---------------------------------------------------------------------- +# Prevent 404 errors for non-existing redirected folders +# ---------------------------------------------------------------------- + +# without -MultiViews, Apache will give a 404 for a rewrite if a folder of the +# same name does not exist. +# webmasterworld.com/apache/3808792.htm + +Options -MultiViews + + +# ---------------------------------------------------------------------- +# Custom 404 page +# ---------------------------------------------------------------------- + +# You can add custom pages to handle 500 or 403 pretty easily, if you like. +# If you are hosting your site in subdirectory, adjust this accordingly +# e.g. ErrorDocument 404 /subdir/404.html +ErrorDocument 404 /404.html + + +# ---------------------------------------------------------------------- +# UTF-8 encoding +# ---------------------------------------------------------------------- + +# Use UTF-8 encoding for anything served text/plain or text/html +AddDefaultCharset utf-8 + +# Force UTF-8 for a number of file formats +AddCharset utf-8 .atom .css .js .json .rss .vtt .xml + + +# ---------------------------------------------------------------------- +# A little more security +# ---------------------------------------------------------------------- + +# To avoid displaying the exact version number of Apache being used, add the +# following to httpd.conf (it will not work in .htaccess): +# ServerTokens Prod + +# "-Indexes" will have Apache block users from browsing folders without a +# default document Usually you should leave this activated, because you +# shouldn't allow everybody to surf through every folder on your server (which +# includes rather private places like CMS system folders). + + Options -Indexes + + +# Block access to "hidden" directories or files whose names begin with a +# period. This includes directories used by version control systems such as +# Subversion or Git. + + RewriteCond %{SCRIPT_FILENAME} -d [OR] + RewriteCond %{SCRIPT_FILENAME} -f + RewriteRule "(^|/)\." - [F] + + +# Block access to backup and source files. These files may be left by some +# text/html editors and pose a great security danger, when anyone can access +# them. + + Order allow,deny + Deny from all + Satisfy All + + +# If your server is not already configured as such, the following directive +# should be uncommented in order to set PHP's register_globals option to OFF. +# This closes a major security hole that is abused by most XSS (cross-site +# scripting) attacks. For more information: http://php.net/register_globals +# +# IF REGISTER_GLOBALS DIRECTIVE CAUSES 500 INTERNAL SERVER ERRORS: +# +# Your server does not allow PHP directives to be set via .htaccess. In that +# case you must make this change in your php.ini file instead. If you are +# using a commercial web host, contact the administrators for assistance in +# doing this. Not all servers allow local php.ini files, and they should +# include all PHP configurations (not just this one), or you will effectively +# reset everything to PHP defaults. Consult www.php.net for more detailed +# information about setting PHP directives. + +# php_flag register_globals Off + +# Rename session cookie to something else, than PHPSESSID +# php_value session.name sid + +# Disable magic quotes (This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.) +# php_flag magic_quotes_gpc Off + +# Do not show you are using PHP +# Note: Move this line to php.ini since it won't work in .htaccess +# php_flag expose_php Off + +# Level of log detail - log all errors +# php_value error_reporting -1 + +# Write errors to log file +# php_flag log_errors On + +# Do not display errors in browser (production - Off, development - On) +# php_flag display_errors Off + +# Do not display startup errors (production - Off, development - On) +# php_flag display_startup_errors Off + +# Format errors in plain text +# Note: Leave this setting 'On' for xdebug's var_dump() output +# php_flag html_errors Off + +# Show multiple occurrence of error +# php_flag ignore_repeated_errors Off + +# Show same errors from different sources +# php_flag ignore_repeated_source Off + +# Size limit for error messages +# php_value log_errors_max_len 1024 + +# Don't precede error with string (doesn't accept empty string, use whitespace if you need) +# php_value error_prepend_string " " + +# Don't prepend to error (doesn't accept empty string, use whitespace if you need) +# php_value error_append_string " " + +# Increase cookie security + + php_value session.cookie_httponly true + diff --git a/archive/litenull_rewrite/app/404.html b/archive/litenull_rewrite/app/404.html new file mode 100644 index 0000000000..044654413f --- /dev/null +++ b/archive/litenull_rewrite/app/404.html @@ -0,0 +1,157 @@ + + + + + Page Not Found :( + + + +
+

Not found :(

+

Sorry, but the page you were trying to view does not exist.

+

It looks like this was the result of either:

+ + + +
+ + diff --git a/archive/litenull_rewrite/app/assets/background.png b/archive/litenull_rewrite/app/assets/background.png new file mode 100644 index 0000000000..36830a35c7 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/background.png differ diff --git a/archive/litenull_rewrite/app/assets/background.svg b/archive/litenull_rewrite/app/assets/background.svg new file mode 100644 index 0000000000..de264ca158 --- /dev/null +++ b/archive/litenull_rewrite/app/assets/background.svg @@ -0,0 +1,6125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archive/litenull_rewrite/app/assets/bg.png b/archive/litenull_rewrite/app/assets/bg.png new file mode 100644 index 0000000000..1fab2cb8af Binary files /dev/null and b/archive/litenull_rewrite/app/assets/bg.png differ diff --git a/archive/litenull_rewrite/app/assets/contacts.png b/archive/litenull_rewrite/app/assets/contacts.png new file mode 100644 index 0000000000..697f9c1119 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/contacts.png differ diff --git a/archive/litenull_rewrite/app/assets/explorer.png b/archive/litenull_rewrite/app/assets/explorer.png new file mode 100644 index 0000000000..3b091e4e58 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/explorer.png differ diff --git a/archive/litenull_rewrite/app/assets/grey_diag.png b/archive/litenull_rewrite/app/assets/grey_diag.png new file mode 100755 index 0000000000..2e81524faf Binary files /dev/null and b/archive/litenull_rewrite/app/assets/grey_diag.png differ diff --git a/archive/litenull_rewrite/app/assets/home-login-click.png b/archive/litenull_rewrite/app/assets/home-login-click.png new file mode 100644 index 0000000000..f1b2751e6d Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-login-click.png differ diff --git a/archive/litenull_rewrite/app/assets/home-login.png b/archive/litenull_rewrite/app/assets/home-login.png new file mode 100644 index 0000000000..192925d528 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-login.png differ diff --git a/archive/litenull_rewrite/app/assets/home-logo.png b/archive/litenull_rewrite/app/assets/home-logo.png new file mode 100644 index 0000000000..882e671920 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-logo.png differ diff --git a/archive/litenull_rewrite/app/assets/home-scroll.png b/archive/litenull_rewrite/app/assets/home-scroll.png new file mode 100644 index 0000000000..485cc79c27 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-scroll.png differ diff --git a/archive/litenull_rewrite/app/assets/home-signup-click.png b/archive/litenull_rewrite/app/assets/home-signup-click.png new file mode 100644 index 0000000000..d514d9ae4a Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-signup-click.png differ diff --git a/archive/litenull_rewrite/app/assets/home-signup.png b/archive/litenull_rewrite/app/assets/home-signup.png new file mode 100644 index 0000000000..6a84a6bc71 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/home-signup.png differ diff --git a/archive/litenull_rewrite/app/assets/icon.png b/archive/litenull_rewrite/app/assets/icon.png new file mode 100644 index 0000000000..18bf84b0db Binary files /dev/null and b/archive/litenull_rewrite/app/assets/icon.png differ diff --git a/archive/litenull_rewrite/app/assets/logo.png b/archive/litenull_rewrite/app/assets/logo.png new file mode 100644 index 0000000000..940c266610 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/logo.png differ diff --git a/archive/litenull_rewrite/app/assets/mail.png b/archive/litenull_rewrite/app/assets/mail.png new file mode 100644 index 0000000000..f7c2b01914 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/mail.png differ diff --git a/archive/litenull_rewrite/app/assets/main-banner.png b/archive/litenull_rewrite/app/assets/main-banner.png new file mode 100644 index 0000000000..b76340c156 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/main-banner.png differ diff --git a/archive/litenull_rewrite/app/assets/main-home.png b/archive/litenull_rewrite/app/assets/main-home.png new file mode 100644 index 0000000000..e4bbf7fd99 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/main-home.png differ diff --git a/archive/litenull_rewrite/app/assets/main-menu.png b/archive/litenull_rewrite/app/assets/main-menu.png new file mode 100644 index 0000000000..5d6f564705 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/main-menu.png differ diff --git a/archive/litenull_rewrite/app/assets/mini-player.png b/archive/litenull_rewrite/app/assets/mini-player.png new file mode 100644 index 0000000000..1d00172835 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/mini-player.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-block.png b/archive/litenull_rewrite/app/assets/sidebar-block.png new file mode 100644 index 0000000000..1c66cbb35c Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-block.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-armory.png b/archive/litenull_rewrite/app/assets/sidebar-icon-armory.png new file mode 100644 index 0000000000..ed9874498c Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-armory.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-daily.png b/archive/litenull_rewrite/app/assets/sidebar-icon-daily.png new file mode 100644 index 0000000000..9f14f63c70 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-daily.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-habits.png b/archive/litenull_rewrite/app/assets/sidebar-icon-habits.png new file mode 100644 index 0000000000..9c7fc7f379 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-habits.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-market.png b/archive/litenull_rewrite/app/assets/sidebar-icon-market.png new file mode 100644 index 0000000000..ec2f10656b Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-market.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-party.png b/archive/litenull_rewrite/app/assets/sidebar-icon-party.png new file mode 100644 index 0000000000..9cff040d8c Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-party.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-quest.png b/archive/litenull_rewrite/app/assets/sidebar-icon-quest.png new file mode 100644 index 0000000000..f0a66f477e Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-quest.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-settings.png b/archive/litenull_rewrite/app/assets/sidebar-icon-settings.png new file mode 100644 index 0000000000..47788e78d0 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-settings.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-stables.png b/archive/litenull_rewrite/app/assets/sidebar-icon-stables.png new file mode 100644 index 0000000000..02c9731c87 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-stables.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-icon-task.png b/archive/litenull_rewrite/app/assets/sidebar-icon-task.png new file mode 100644 index 0000000000..315e3d6336 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-icon-task.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-number-box.png b/archive/litenull_rewrite/app/assets/sidebar-number-box.png new file mode 100644 index 0000000000..0967a505c6 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-number-box.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-title-grind.png b/archive/litenull_rewrite/app/assets/sidebar-title-grind.png new file mode 100644 index 0000000000..6080b46f18 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-title-grind.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-title-reward.png b/archive/litenull_rewrite/app/assets/sidebar-title-reward.png new file mode 100644 index 0000000000..c53e4b0e90 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-title-reward.png differ diff --git a/archive/litenull_rewrite/app/assets/sidebar-title-settings.png b/archive/litenull_rewrite/app/assets/sidebar-title-settings.png new file mode 100644 index 0000000000..a51687b0d0 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/sidebar-title-settings.png differ diff --git a/archive/litenull_rewrite/app/assets/text.png b/archive/litenull_rewrite/app/assets/text.png new file mode 100644 index 0000000000..71cd87d265 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/text.png differ diff --git a/archive/litenull_rewrite/app/assets/todo.png b/archive/litenull_rewrite/app/assets/todo.png new file mode 100644 index 0000000000..75164556db Binary files /dev/null and b/archive/litenull_rewrite/app/assets/todo.png differ diff --git a/archive/litenull_rewrite/app/assets/wood-bg.png b/archive/litenull_rewrite/app/assets/wood-bg.png new file mode 100644 index 0000000000..529361d8c2 Binary files /dev/null and b/archive/litenull_rewrite/app/assets/wood-bg.png differ diff --git a/archive/litenull_rewrite/app/config.xml b/archive/litenull_rewrite/app/config.xml new file mode 100644 index 0000000000..cb6627f77a --- /dev/null +++ b/archive/litenull_rewrite/app/config.xml @@ -0,0 +1,16 @@ + + + + HabitRPG + + + Habit tracking which treats your goals like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. + + + + + + \ No newline at end of file diff --git a/archive/litenull_rewrite/app/fonts/android-icons.ttf b/archive/litenull_rewrite/app/fonts/android-icons.ttf new file mode 100644 index 0000000000..d32093d87d Binary files /dev/null and b/archive/litenull_rewrite/app/fonts/android-icons.ttf differ diff --git a/archive/litenull_rewrite/app/fonts/icomoon.dev.svg b/archive/litenull_rewrite/app/fonts/icomoon.dev.svg new file mode 100644 index 0000000000..5c8fdf7190 --- /dev/null +++ b/archive/litenull_rewrite/app/fonts/icomoon.dev.svg @@ -0,0 +1,25 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + \ No newline at end of file diff --git a/archive/litenull_rewrite/app/fonts/icomoon.eot b/archive/litenull_rewrite/app/fonts/icomoon.eot new file mode 100644 index 0000000000..b556131fcb Binary files /dev/null and b/archive/litenull_rewrite/app/fonts/icomoon.eot differ diff --git a/archive/litenull_rewrite/app/fonts/icomoon.svg b/archive/litenull_rewrite/app/fonts/icomoon.svg new file mode 100644 index 0000000000..18444e31d5 --- /dev/null +++ b/archive/litenull_rewrite/app/fonts/icomoon.svg @@ -0,0 +1,25 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + \ No newline at end of file diff --git a/archive/litenull_rewrite/app/fonts/icomoon.ttf b/archive/litenull_rewrite/app/fonts/icomoon.ttf new file mode 100644 index 0000000000..ee1d29aa93 Binary files /dev/null and b/archive/litenull_rewrite/app/fonts/icomoon.ttf differ diff --git a/archive/litenull_rewrite/app/fonts/icomoon.woff b/archive/litenull_rewrite/app/fonts/icomoon.woff new file mode 100644 index 0000000000..27a1bf3a04 Binary files /dev/null and b/archive/litenull_rewrite/app/fonts/icomoon.woff differ diff --git a/archive/litenull_rewrite/app/img/add.png b/archive/litenull_rewrite/app/img/add.png new file mode 100644 index 0000000000..f177dba4e7 Binary files /dev/null and b/archive/litenull_rewrite/app/img/add.png differ diff --git a/archive/litenull_rewrite/app/img/calendar_google.png b/archive/litenull_rewrite/app/img/calendar_google.png new file mode 100644 index 0000000000..d362e93fa1 Binary files /dev/null and b/archive/litenull_rewrite/app/img/calendar_google.png differ diff --git a/archive/litenull_rewrite/app/img/calendar_ical.png b/archive/litenull_rewrite/app/img/calendar_ical.png new file mode 100644 index 0000000000..f4094b56a4 Binary files /dev/null and b/archive/litenull_rewrite/app/img/calendar_ical.png differ diff --git a/archive/litenull_rewrite/app/img/coin_single_gold.png b/archive/litenull_rewrite/app/img/coin_single_gold.png new file mode 100644 index 0000000000..2ed267760e Binary files /dev/null and b/archive/litenull_rewrite/app/img/coin_single_gold.png differ diff --git a/archive/litenull_rewrite/app/img/coin_single_silver.png b/archive/litenull_rewrite/app/img/coin_single_silver.png new file mode 100644 index 0000000000..d2a16a58fd Binary files /dev/null and b/archive/litenull_rewrite/app/img/coin_single_silver.png differ diff --git a/archive/litenull_rewrite/app/img/facebook-login-register.jpeg b/archive/litenull_rewrite/app/img/facebook-login-register.jpeg new file mode 100644 index 0000000000..32f16d4978 Binary files /dev/null and b/archive/litenull_rewrite/app/img/facebook-login-register.jpeg differ diff --git a/archive/litenull_rewrite/app/img/glyphicons-halflings-white.png b/archive/litenull_rewrite/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000..3bf6484a29 Binary files /dev/null and b/archive/litenull_rewrite/app/img/glyphicons-halflings-white.png differ diff --git a/archive/litenull_rewrite/app/img/glyphicons-halflings.png b/archive/litenull_rewrite/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000..79bc568c21 Binary files /dev/null and b/archive/litenull_rewrite/app/img/glyphicons-halflings.png differ diff --git a/archive/litenull_rewrite/app/img/hatching_powder.png b/archive/litenull_rewrite/app/img/hatching_powder.png new file mode 100644 index 0000000000..34db3dc933 Binary files /dev/null and b/archive/litenull_rewrite/app/img/hatching_powder.png differ diff --git a/archive/litenull_rewrite/app/img/logo/habitrpg.jpg b/archive/litenull_rewrite/app/img/logo/habitrpg.jpg new file mode 100644 index 0000000000..d4025bd194 Binary files /dev/null and b/archive/litenull_rewrite/app/img/logo/habitrpg.jpg differ diff --git a/archive/litenull_rewrite/app/img/logo/habitrpg_pixel.png b/archive/litenull_rewrite/app/img/logo/habitrpg_pixel.png new file mode 100644 index 0000000000..4bd1c43f3b Binary files /dev/null and b/archive/litenull_rewrite/app/img/logo/habitrpg_pixel.png differ diff --git a/archive/litenull_rewrite/app/img/original_user.png b/archive/litenull_rewrite/app/img/original_user.png new file mode 100644 index 0000000000..6bf1987738 Binary files /dev/null and b/archive/litenull_rewrite/app/img/original_user.png differ diff --git a/archive/litenull_rewrite/app/img/party-unlocked.png b/archive/litenull_rewrite/app/img/party-unlocked.png new file mode 100644 index 0000000000..5daba47f35 Binary files /dev/null and b/archive/litenull_rewrite/app/img/party-unlocked.png differ diff --git a/archive/litenull_rewrite/app/img/play_screenshot.jpeg b/archive/litenull_rewrite/app/img/play_screenshot.jpeg new file mode 100644 index 0000000000..e25a82d650 Binary files /dev/null and b/archive/litenull_rewrite/app/img/play_screenshot.jpeg differ diff --git a/archive/litenull_rewrite/app/img/remove.png b/archive/litenull_rewrite/app/img/remove.png new file mode 100644 index 0000000000..a12b5c701c Binary files /dev/null and b/archive/litenull_rewrite/app/img/remove.png differ diff --git a/archive/litenull_rewrite/app/img/screenshot.jpeg b/archive/litenull_rewrite/app/img/screenshot.jpeg new file mode 100644 index 0000000000..bb8f7d5c63 Binary files /dev/null and b/archive/litenull_rewrite/app/img/screenshot.jpeg differ diff --git a/archive/litenull_rewrite/app/img/sprites/Armor6_m.xcf b/archive/litenull_rewrite/app/img/sprites/Armor6_m.xcf new file mode 100644 index 0000000000..dd0e8aee61 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/Armor6_m.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/Armor7_m.xcf b/archive/litenull_rewrite/app/img/sprites/Armor7_m.xcf new file mode 100644 index 0000000000..65359e2754 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/Armor7_m.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/Armor8_m.xcf b/archive/litenull_rewrite/app/img/sprites/Armor8_m.xcf new file mode 100644 index 0000000000..782d199f22 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/Armor8_m.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/Egg_Sprite_Sheet.png b/archive/litenull_rewrite/app/img/sprites/Egg_Sprite_Sheet.png new file mode 100644 index 0000000000..716f5e96de Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/Egg_Sprite_Sheet.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/Mount-SpriteSheet.png b/archive/litenull_rewrite/app/img/sprites/Mount-SpriteSheet.png new file mode 100644 index 0000000000..36531b7b50 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/Mount-SpriteSheet.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/Mounts.css b/archive/litenull_rewrite/app/img/sprites/Mounts.css new file mode 100644 index 0000000000..06ea775b2b --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/Mounts.css @@ -0,0 +1,13 @@ +.Mount_Head_Lion, .Mount_Body_Lion, .Mount_Head_PolarBear, .Mount_Body_PolarBear, .Mount_Head_Panda, .Mount_Body_Panda, .Mount_Head_Tiger, .Mount_Body_Tiger, .Mount_Head_Bear, .Mount_Body_Bear, .Mount_Head_EtherealLion, .Mount_Body_EtherealLion {background: url(Mount-SpriteSheet.png) no-repeat} +.Mount_Head_Lion {background-position: 0 0; width: 105px; height: 123px} +.Mount_Body_Lion {background-position: -105 0; width: 105px; height: 123px} +.Mount_Head_PolarBear {background-position: -210 0; width: 105px; height: 123px} +.Mount_Body_PolarBear {background-position: -315 0; width: 105px; height: 123px} +.Mount_Head_Panda {background-position: -420 0; width: 105px; height: 123px} +.Mount_Body_Panda {background-position: -525 0; width: 105px; height: 123px} +.Mount_Head_Tiger {background-position: -630 0; width: 105px; height: 123px} +.Mount_Body_Tiger {background-position: -735 0; width: 105px; height: 123px} +.Mount_Head_Bear {background-position: -840 0; width: 105px; height: 123px} +.Mount_Body_Bear {background-position: -945 0; width: 105px; height: 123px} +.Mount_Head_EtherealLion {background-position: -1050 0; width: 105px; height: 123px} +.Mount_Body_EtherealLion {background-position: -1155 0; width: 105px; height: 123px} diff --git a/archive/litenull_rewrite/app/img/sprites/PetEggs.css b/archive/litenull_rewrite/app/img/sprites/PetEggs.css new file mode 100644 index 0000000000..b39998480e --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/PetEggs.css @@ -0,0 +1,26 @@ +.Pet_Egg_Wolf, .Pet_Egg_TigerCub, .Pet_Egg_PolarBear, .Pet_Egg_PandaCub, .Pet_Egg_LionCub, .Pet_Egg_Fox, .Pet_Egg_FlyingPig, .Pet_Egg_Dragon, .Pet_Egg_Cactus, .Pet_Egg_BearCub, .Pet_HatchingPotion_Base, .Pet_HatchingPotion_White, .Pet_HatchingPotion_Desert, .Pet_HatchingPotion_Red, .Pet_HatchingPotion_Shade, .Pet_HatchingPotion_Skeleton, .Pet_HatchingPotion_Zombie, .Pet_HatchingPotion_CottonCandyPink, .Pet_HatchingPotion_CottonCandyBlue, .Pet_HatchingPotion_Golden, .Pet_Currency_Gem, .Pet_Currency_Gem2x, .Pet_Currency_Gem1x {background: url("/img/sprites/Egg_Sprite_Sheet.png") no-repeat} +.Pet_Egg_Wolf {background-position: 0px 0px; width: 48px; height: 51px} +.Pet_Egg_TigerCub {background-position: 0px -51px; width: 48px; height: 51px} +.Pet_Egg_PolarBear {background-position: 0px -102px; width: 48px; height: 51px} +.Pet_Egg_PandaCub {background-position: 0px -153px; width: 48px; height: 51px} +.Pet_Egg_LionCub {background-position: 0px -204px; width: 48px; height: 51px} +.Pet_Egg_Fox {background-position: 0px -255px; width: 48px; height: 51px} +.Pet_Egg_FlyingPig {background-position: 0px -306px; width: 48px; height: 51px} +.Pet_Egg_Dragon {background-position: 0px -357px; width: 48px; height: 51px} +.Pet_Egg_Cactus {background-position: 0px -408px; width: 48px; height: 51px} +.Pet_Egg_BearCub {background-position: 0px -459px; width: 48px; height: 51px} + +.Pet_HatchingPotion_Base {background-position: -48px -0px; width: 48px; height: 51px} +.Pet_HatchingPotion_White {background-position: -48px -51px; width: 48px; height: 51px} +.Pet_HatchingPotion_Desert {background-position: -48px -102px; width: 48px; height: 51px} +.Pet_HatchingPotion_Red {background-position: -48px -153px; width: 48px; height: 51px} +.Pet_HatchingPotion_Shade {background-position: -48px -204px; width: 48px; height: 51px} +.Pet_HatchingPotion_Skeleton {background-position: -48px -255px; width: 48px; height: 51px} +.Pet_HatchingPotion_Zombie {background-position: -48px -306px; width: 48px; height: 51px} +.Pet_HatchingPotion_CottonCandyPink {background-position: -48px -357px; width: 48px; height: 51px} +.Pet_HatchingPotion_CottonCandyBlue {background-position: -48px -408px; width: 48px; height: 51px} +.Pet_HatchingPotion_Golden {background-position: -48px -459px; width: 48px; height: 54px} /* This sprite was a bit taller than everything else, will affect the math of anything inserted below it */ + +.Pet_Currency_Gem {background-position: 0px -510px; width: 51px; height: 45px} /* Not an egg or potion so has a different size */ +.Pet_Currency_Gem2x {background-position: -55px -513px; width: 34px; height: 30px} +.Pet_Currency_Gem1x {background-position: -63px -542px; width: 19px; height: 17px} diff --git a/archive/litenull_rewrite/app/img/sprites/css_sprite.png b/archive/litenull_rewrite/app/img/sprites/css_sprite.png new file mode 100644 index 0000000000..0ecda867ed Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/css_sprite.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/dead.png b/archive/litenull_rewrite/app/img/sprites/dead.png new file mode 100644 index 0000000000..38e882c706 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/dead.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/development.xcf b/archive/litenull_rewrite/app/img/sprites/development.xcf new file mode 100644 index 0000000000..c5d80bc5bd Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/development.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/favicon.png b/archive/litenull_rewrite/app/img/sprites/favicon.png new file mode 100644 index 0000000000..a1783aac99 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/favicon.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/female.xcf b/archive/litenull_rewrite/app/img/sprites/female.xcf new file mode 100644 index 0000000000..c2a9dbbf03 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/female.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/female_sprites b/archive/litenull_rewrite/app/img/sprites/female_sprites new file mode 100644 index 0000000000..a60eb31e8c --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/female_sprites @@ -0,0 +1,39 @@ +weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, weapon_0, shield_5, shield_4, shield_3, shield_2, shield_1, head_5_v2, head_5_v1, head_4_v2, head_4_v1, head_3_v2, head_3_v1, head_2_v2, head_2_v1, head_1, head_0, hair_white, hair_brown, hair_black, hair_blond, armor_5, armor_4, armor_3, armor_2, armor_1, armor_0_v2, armor_0_v1, skin_dead, skin_orc, skin_asian, skin_black, skin_white {background: url(female_sprites.png) no-repeat} +weapon_6 {background-position: 0 0; width: 90px; height: 90px} +weapon_5 {background-position: -90px 0; width: 90px; height: 90px} +weapon_4 {background-position: -180px 0; width: 90px; height: 90px} +weapon_3 {background-position: -270px 0; width: 90px; height: 90px} +weapon_2 {background-position: -360px 0; width: 90px; height: 90px} +weapon_1 {background-position: -450px 0; width: 90px; height: 90px} +weapon_0 {background-position: -540px 0; width: 90px; height: 90px} +shield_5 {background-position: -630px 0; width: 90px; height: 90px} +shield_4 {background-position: -720px 0; width: 90px; height: 90px} +shield_3 {background-position: -810px 0; width: 90px; height: 90px} +shield_2 {background-position: -900px 0; width: 90px; height: 90px} +shield_1 {background-position: -990px 0; width: 90px; height: 90px} +head_5_v2 {background-position: -1080px 0; width: 90px; height: 90px} +head_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} +head_4_v2 {background-position: -1260px 0; width: 90px; height: 90px} +head_4_v1 {background-position: -1350px 0; width: 90px; height: 90px} +head_3_v2 {background-position: -1440px 0; width: 90px; height: 90px} +head_3_v1 {background-position: -1530px 0; width: 90px; height: 90px} +head_2_v2 {background-position: -1620px 0; width: 90px; height: 90px} +head_2_v1 {background-position: -1710px 0; width: 90px; height: 90px} +head_1 {background-position: -1800px 0; width: 90px; height: 90px} +head_0 {background-position: -1890px 0; width: 90px; height: 90px} +hair_white {background-position: -1980px 0; width: 90px; height: 90px} +hair_brown {background-position: -2070px 0; width: 90px; height: 90px} +hair_black {background-position: -2160px 0; width: 90px; height: 90px} +hair_blond {background-position: -2250px 0; width: 90px; height: 90px} +armor_5 {background-position: -2340px 0; width: 90px; height: 90px} +armor_4 {background-position: -2430px 0; width: 90px; height: 90px} +armor_3 {background-position: -2520px 0; width: 90px; height: 90px} +armor_2 {background-position: -2610px 0; width: 90px; height: 90px} +armor_1 {background-position: -2700px 0; width: 90px; height: 90px} +armor_0_v2 {background-position: -2790px 0; width: 90px; height: 90px} +armor_0_v1 {background-position: -2880px 0; width: 90px; height: 90px} +skin_dead {background-position: -2970px 0; width: 90px; height: 90px} +skin_orc {background-position: -3060px 0; width: 90px; height: 90px} +skin_asian {background-position: -3150px 0; width: 90px; height: 90px} +skin_black {background-position: -3240px 0; width: 90px; height: 90px} +skin_white {background-position: -3330px 0; width: 90px; height: 90px} diff --git a/archive/litenull_rewrite/app/img/sprites/female_sprites.png b/archive/litenull_rewrite/app/img/sprites/female_sprites.png new file mode 100644 index 0000000000..1456ff6336 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/female_sprites.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/full.xcf b/archive/litenull_rewrite/app/img/sprites/full.xcf new file mode 100644 index 0000000000..b46740f83c Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/full.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/male.xcf b/archive/litenull_rewrite/app/img/sprites/male.xcf new file mode 100644 index 0000000000..e7b34464d0 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/male.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/male_sprites.css b/archive/litenull_rewrite/app/img/sprites/male_sprites.css new file mode 100644 index 0000000000..3e04632432 --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/male_sprites.css @@ -0,0 +1,34 @@ +weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, weapon_0, shield_5, shield_4, shield_3, shield_2, shield_1, head_5, head_4, head_3, head_2, head_1, head_0, hair blond, hair black, hair brown, hair white, armor_5, armor_4, armor_3, armor_2, armor_1, armor_0, skin_dead, skin_orc, skin_asian, skin_black, skin_white {background: url(male_sprites.png) no-repeat} +weapon_6 {background-position: 0 0; width: 90px; height: 90px} +weapon_5 {background-position: -90px 0; width: 90px; height: 90px} +weapon_4 {background-position: -180px 0; width: 90px; height: 90px} +weapon_3 {background-position: -270px 0; width: 90px; height: 90px} +weapon_2 {background-position: -360px 0; width: 90px; height: 90px} +weapon_1 {background-position: -450px 0; width: 90px; height: 90px} +weapon_0 {background-position: -540px 0; width: 90px; height: 90px} +shield_5 {background-position: -630px 0; width: 90px; height: 90px} +shield_4 {background-position: -720px 0; width: 90px; height: 90px} +shield_3 {background-position: -810px 0; width: 90px; height: 90px} +shield_2 {background-position: -900px 0; width: 90px; height: 90px} +shield_1 {background-position: -990px 0; width: 90px; height: 90px} +head_5 {background-position: -1080px 0; width: 90px; height: 90px} +head_4 {background-position: -1170px 0; width: 90px; height: 90px} +head_3 {background-position: -1260px 0; width: 90px; height: 90px} +head_2 {background-position: -1350px 0; width: 90px; height: 90px} +head_1 {background-position: -1440px 0; width: 90px; height: 90px} +head_0 {background-position: -1530px 0; width: 90px; height: 90px} +hair blond {background-position: -1620px 0; width: 90px; height: 90px} +hair black {background-position: -1710px 0; width: 90px; height: 90px} +hair brown {background-position: -1800px 0; width: 90px; height: 90px} +hair white {background-position: -1890px 0; width: 90px; height: 90px} +armor_5 {background-position: -1980px 0; width: 90px; height: 90px} +armor_4 {background-position: -2070px 0; width: 90px; height: 90px} +armor_3 {background-position: -2160px 0; width: 90px; height: 90px} +armor_2 {background-position: -2250px 0; width: 90px; height: 90px} +armor_1 {background-position: -2340px 0; width: 90px; height: 90px} +armor_0 {background-position: -2430px 0; width: 90px; height: 90px} +skin_dead {background-position: -2520px 0; width: 90px; height: 90px} +skin_orc {background-position: -2610px 0; width: 90px; height: 90px} +skin_asian {background-position: -2700px 0; width: 90px; height: 90px} +skin_black {background-position: -2790px 0; width: 90px; height: 90px} +skin_white {background-position: -2880px 0; width: 90px; height: 90px} diff --git a/archive/litenull_rewrite/app/img/sprites/male_sprites.png b/archive/litenull_rewrite/app/img/sprites/male_sprites.png new file mode 100644 index 0000000000..126f9b1738 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/male_sprites.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/pet_sprites.css b/archive/litenull_rewrite/app/img/sprites/pet_sprites.css new file mode 100644 index 0000000000..4bff991a0d --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/pet_sprites.css @@ -0,0 +1,95 @@ +.Pet-Wolf-Zombie, .Pet-Wolf-White, .Pet-Wolf-Veteran, .Pet-Wolf-Skeleton, .Pet-Wolf-Shade, .Pet-Wolf-Red, .Pet-Wolf-Golden, .Pet-Wolf-Desert, .Pet-Wolf-CottonCandyPink, .Pet-Wolf-CottonCandyBlue, .Pet-TigerCub-Zombie, .Pet-TigerCub-White, .Pet-TigerCub-Skeleton, .Pet-TigerCub-Shade, .Pet-TigerCub-Red, .Pet-TigerCub-Golden, .Pet-TigerCub-Desert, .Pet-TigerCub-CottonCandyPink, .Pet-TigerCub-CottonCandyBlue, .Pet-TigerCub-Base, .Pet-PolarBearCub-Base, .Pet-PandaCub-Zombie, .Pet-PandaCub-White, .Pet-PandaCub-Skeleton, .Pet-PandaCub-Shade, .Pet-PandaCub-Red, .Pet-PandaCub-Golden, .Pet-PandaCub-Desert, .Pet-PandaCub-CottonCandyPink, .Pet-PandaCub-CottonCandyBlue, .Pet-PandaCub-Base, .Pet-LionCub-Zombie, .Pet-LionCub-White, .Pet-LionCub-Skeleton, .Pet-LionCub-Shade, .Pet-LionCub-Red, .Pet-LionCub-Golden, .Pet-LionCub-Desert, .Pet-LionCub-CottonCandyPink, .Pet-LionCub-CottonCandyBlue, .Pet-LionCub-Base, .Pet-Fox-Zombie, .Pet-Fox-White, .Pet-Fox-Skeleton, .Pet-Fox-Shade, .Pet-Fox-Red, .Pet-Fox-Golden, .Pet-Fox-Desert, .Pet-Fox-CottonCandyPink, .Pet-Fox-CottonCandyBlue, .Pet-Fox-Base, .Pet-FlyingPig-Zombie, .Pet-FlyingPig-White, .Pet-FlyingPig-Skeleton, .Pet-FlyingPig-Shade, .Pet-FlyingPig-Red, .Pet-FlyingPig-Golden, .Pet-FlyingPig-Desert, .Pet-FlyingPig-CottonCandyPink, .Pet-FlyingPig-CottonCandyBlue, .Pet-FlyingPig-Base, .Pet-Dragon-Zombie, .Pet-Dragon-White, .Pet-Dragon-Skeleton, .Pet-Dragon-Shade, .Pet-Dragon-Red, .Pet-Dragon-Golden, .Pet-Dragon-Desert, .Pet-Dragon-CottonCandyPink, .Pet-Dragon-CottonCandyBlue, .Pet-Dragon-Base, .Pet-Cactus-Skeleton, .Pet-Cactus-Red, .Pet-Cactus-Zombie, .Pet-Cactus-Shade, .Pet-Cactus-Golden, .Pet-Cactus-White, .Pet-Cactus-CottonCandyPink, .Pet-Cactus-CottonCandyBlue, .Pet-Cactus-Desert, .Pet-Cactus-Base, .Pet-BearCub-Zombie, .Pet-BearCub-White, .Pet-BearCub-Skeleton, .Pet-BearCub-Shade, .Pet-BearCub-Red, .Pet-BearCub-Golden, .Pet-BearCub-Desert, .Pet-BearCub-CottonCandyPink, .Pet-BearCub-CottonCandyBlue, .Pet-BearCub-Base, .Pet-Wolf-Base {background: url("/img/sprites/pet_sprites.png") no-repeat} + +.Pet-Wolf-Zombie {background-position: 0 0; width: 81px; height: 99px} +.Pet-Wolf-White {background-position: -81px 0; width: 81px; height: 99px} +.Pet-Wolf-Veteran {background-position: -162px 0; width: 81px; height: 99px} +.Pet-Wolf-Skeleton {background-position: -243px 0; width: 81px; height: 99px} +.Pet-Wolf-Shade {background-position: -324px 0; width: 81px; height: 99px} +.Pet-Wolf-Red {background-position: -405px 0; width: 81px; height: 99px} +.Pet-Wolf-Golden {background-position: -486px 0; width: 81px; height: 99px} +.Pet-Wolf-Desert {background-position: -567px 0; width: 81px; height: 99px} +.Pet-Wolf-CottonCandyPink {background-position: -648px 0; width: 81px; height: 99px} +.Pet-Wolf-CottonCandyBlue {background-position: -729px 0; width: 81px; height: 99px} +.Pet-TigerCub-Zombie {background-position: -810px 0; width: 81px; height: 99px} +.Pet-TigerCub-White {background-position: -891px 0; width: 81px; height: 99px} +.Pet-TigerCub-Skeleton {background-position: -972px 0; width: 81px; height: 99px} +.Pet-TigerCub-Shade {background-position: -1053px 0; width: 81px; height: 99px} +.Pet-TigerCub-Red {background-position: -1134px 0; width: 81px; height: 99px} +.Pet-TigerCub-Golden {background-position: -1215px 0; width: 81px; height: 99px} +.Pet-TigerCub-Desert {background-position: -1296px 0; width: 81px; height: 99px} +.Pet-TigerCub-CottonCandyPink {background-position: -1377px 0; width: 81px; height: 99px} +.Pet-TigerCub-CottonCandyBlue {background-position: -1458px 0; width: 81px; height: 99px} +.Pet-TigerCub-Base {background-position: -1539px 0; width: 81px; height: 99px} +.Pet-PolarBearCub-Base {background-position: -1620px 0; width: 81px; height: 99px} +.Pet-PandaCub-Zombie {background-position: -1701px 0; width: 81px; height: 99px} +.Pet-PandaCub-White {background-position: -1782px 0; width: 81px; height: 99px} +.Pet-PandaCub-Skeleton {background-position: -1863px 0; width: 81px; height: 99px} +.Pet-PandaCub-Shade {background-position: -1944px 0; width: 81px; height: 99px} +.Pet-PandaCub-Red {background-position: -2025px 0; width: 81px; height: 99px} +.Pet-PandaCub-Golden {background-position: -2106px 0; width: 81px; height: 99px} +.Pet-PandaCub-Desert {background-position: -2187px 0; width: 81px; height: 99px} +.Pet-PandaCub-CottonCandyPink {background-position: -2268px 0; width: 81px; height: 99px} +.Pet-PandaCub-CottonCandyBlue {background-position: -2349px 0; width: 81px; height: 99px} +.Pet-PandaCub-Base {background-position: -2430px 0; width: 81px; height: 99px} +.Pet-LionCub-Zombie {background-position: -2511px 0; width: 81px; height: 99px} +.Pet-LionCub-White {background-position: -2592px 0; width: 81px; height: 99px} +.Pet-LionCub-Skeleton {background-position: -2673px 0; width: 81px; height: 99px} +.Pet-LionCub-Shade {background-position: -2754px 0; width: 81px; height: 99px} +.Pet-LionCub-Red {background-position: -2835px 0; width: 81px; height: 99px} +.Pet-LionCub-Golden {background-position: -2916px 0; width: 81px; height: 99px} +.Pet-LionCub-Desert {background-position: -2997px 0; width: 81px; height: 99px} +.Pet-LionCub-CottonCandyPink {background-position: -3078px 0; width: 81px; height: 99px} +.Pet-LionCub-CottonCandyBlue {background-position: -3159px 0; width: 81px; height: 99px} +.Pet-LionCub-Base {background-position: -3240px 0; width: 81px; height: 99px} +.Pet-Fox-Zombie {background-position: -3321px 0; width: 81px; height: 99px} +.Pet-Fox-White {background-position: -3402px 0; width: 81px; height: 99px} +.Pet-Fox-Skeleton {background-position: -3483px 0; width: 81px; height: 99px} +.Pet-Fox-Shade {background-position: -3564px 0; width: 81px; height: 99px} +.Pet-Fox-Red {background-position: -3645px 0; width: 81px; height: 99px} +.Pet-Fox-Golden {background-position: -3726px 0; width: 81px; height: 99px} +.Pet-Fox-Desert {background-position: -3807px 0; width: 81px; height: 99px} +.Pet-Fox-CottonCandyPink {background-position: -3888px 0; width: 81px; height: 99px} +.Pet-Fox-CottonCandyBlue {background-position: -3969px 0; width: 81px; height: 99px} +.Pet-Fox-Base {background-position: -4050px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Zombie {background-position: -4131px 0; width: 81px; height: 99px} +.Pet-FlyingPig-White {background-position: -4212px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Skeleton {background-position: -4293px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Shade {background-position: -4374px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Red {background-position: -4455px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Golden {background-position: -4536px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Desert {background-position: -4617px 0; width: 81px; height: 99px} +.Pet-FlyingPig-CottonCandyPink {background-position: -4698px 0; width: 81px; height: 99px} +.Pet-FlyingPig-CottonCandyBlue {background-position: -4779px 0; width: 81px; height: 99px} +.Pet-FlyingPig-Base {background-position: -4860px 0; width: 81px; height: 99px} +.Pet-Dragon-Zombie {background-position: -4941px 0; width: 81px; height: 99px} +.Pet-Dragon-White {background-position: -5022px 0; width: 81px; height: 99px} +.Pet-Dragon-Skeleton {background-position: -5103px 0; width: 81px; height: 99px} +.Pet-Dragon-Shade {background-position: -5184px 0; width: 81px; height: 99px} +.Pet-Dragon-Red {background-position: -5265px 0; width: 81px; height: 99px} +.Pet-Dragon-Golden {background-position: -5346px 0; width: 81px; height: 99px} +.Pet-Dragon-Desert {background-position: -5427px 0; width: 81px; height: 99px} +.Pet-Dragon-CottonCandyPink {background-position: -5508px 0; width: 81px; height: 99px} +.Pet-Dragon-CottonCandyBlue {background-position: -5589px 0; width: 81px; height: 99px} +.Pet-Dragon-Base {background-position: -5670px 0; width: 81px; height: 99px} +.Pet-Cactus-Zombie {background-position: -5913px 0; width: 81px; height: 99px} +.Pet-Cactus-White {background-position: -6156px 0; width: 81px; height: 99px} +.Pet-Cactus-Skeleton {background-position: -5751px 0; width: 81px; height: 99px} +.Pet-Cactus-Red {background-position: -5832px 0; width: 81px; height: 99px} +.Pet-Cactus-Shade {background-position: -5994px 0; width: 81px; height: 99px} +.Pet-Cactus-Golden {background-position: -6075px 0; width: 81px; height: 99px} +.Pet-Cactus-Desert {background-position: -6399px 0; width: 81px; height: 99px} +.Pet-Cactus-CottonCandyPink {background-position: -6237px 0; width: 81px; height: 99px} +.Pet-Cactus-CottonCandyBlue {background-position: -6318px 0; width: 81px; height: 99px} +.Pet-Cactus-Base {background-position: -6480px 0; width: 81px; height: 99px} +.Pet-BearCub-Zombie {background-position: -6561px 0; width: 81px; height: 99px} +.Pet-BearCub-White {background-position: -6642px 0; width: 81px; height: 99px} +.Pet-BearCub-Skeleton {background-position: -6723px 0; width: 81px; height: 99px} +.Pet-BearCub-Shade {background-position: -6804px 0; width: 81px; height: 99px} +.Pet-BearCub-Red {background-position: -6885px 0; width: 81px; height: 99px} +.Pet-BearCub-Golden {background-position: -6966px 0; width: 81px; height: 99px} +.Pet-BearCub-Desert {background-position: -7047px 0; width: 81px; height: 99px} +.Pet-BearCub-CottonCandyPink {background-position: -7128px 0; width: 81px; height: 99px} +.Pet-BearCub-CottonCandyBlue {background-position: -7209px 0; width: 81px; height: 99px} +.Pet-BearCub-Base {background-position: -7290px 0; width: 81px; height: 99px} +.Pet-Wolf-Base {background-position: -7371px 0; width: 81px; height: 99px} +.Pet-Egg {background: url("/img/sprites/egg.png") no-repeat; width: 39px; height: 42px;} diff --git a/archive/litenull_rewrite/app/img/sprites/pet_sprites.png b/archive/litenull_rewrite/app/img/sprites/pet_sprites.png new file mode 100644 index 0000000000..85a52ebd30 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/pet_sprites.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/player_sprites.css b/archive/litenull_rewrite/app/img/sprites/player_sprites.css new file mode 100644 index 0000000000..4a10fb6dfc --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/player_sprites.css @@ -0,0 +1,77 @@ +.weapon_6, .weapon_5, .weapon_4, .weapon_3, .weapon_2, .weapon_1, .weapon_0, .skin_white, .skin_pale, .skin_orc, .skin_dead, .skin_black, .skin_asian, .shield_5_v1, .shield_5_v0, .shield_4_v0, .shield_3_v1, .shield_3_v0, .shield_2_v1, .shield_2_v0, .shield_1_v1, .shield_1_v0, _shield_4_v1, .nh_hair_white_v1, .nh_hair_white_v0, .nh_hair_brown_v1, .nh_hair_brown_v0, .nh_hair_blond_v1, .nh_hair_blond_v0, .nh_hair_black_v1, .nh_hair_black_v0, .head_5_v2, .head_5_v1, .head_5_v0, .head_4_v2, .head_4_v1, .head_4_v0, .head_3_v2, .head_3_v1, .head_3_v0, .head_2_v2, .head_2_v1, .head_2_v0, .head_1_v1, .head_1_v0, .head_0_v1, .head_0_v0, .hair_white_v1, .hair_white_v0, .hair_brown_v1, .hair_brown_v0, .hair_blond_v1, .hair_blond_v0, .hair_black_v1, .hair_black_v0, .armor_5_v1, .armor_5_v0, .armor_4_v1, .armor_4_v0, .armor_3_v1, .armor_3_v0, .armor_2_v0, .armor_1_v1, .armor_1_v0, .armor_0_v11, .armor_0_v10, .armor_0_v9, .armor_0_v8, .armor_0_v7, .armor_0_v6, .armor_0_v5, .armor_0_v4, .armor_0_v3, .armor_0_v2, .armor_0_v1, .armor_0_v0 {background: url(player_sprites.png) no-repeat} +.weapon_6 {background-position: 0 0; width: 90px; height: 90px} +.weapon_5 {background-position: -90px 0; width: 90px; height: 90px} +.weapon_4 {background-position: -180px 0; width: 90px; height: 90px} +.weapon_3 {background-position: -270px 0; width: 90px; height: 90px} +.weapon_2 {background-position: -360px 0; width: 90px; height: 90px} +.weapon_1 {background-position: -450px 0; width: 90px; height: 90px} +.weapon_0 {background-position: -540px 0; width: 90px; height: 90px} +.skin_white {background-position: -630px 0; width: 90px; height: 90px} +.skin_pale {background-position: -720px 0; width: 90px; height: 90px} +.skin_orc {background-position: -810px 0; width: 90px; height: 90px} +.skin_dead {background-position: -900px 0; width: 90px; height: 90px} +.skin_black {background-position: -990px 0; width: 90px; height: 90px} +.skin_asian {background-position: -1080px 0; width: 90px; height: 90px} +.shield_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} +.shield_5_v0 {background-position: -1260px 0; width: 90px; height: 90px} +.shield_4_v0 {background-position: -1350px 0; width: 90px; height: 90px} +.shield_3_v1 {background-position: -1440px 0; width: 90px; height: 90px} +.shield_3_v0 {background-position: -1530px 0; width: 90px; height: 90px} +.shield_2_v1 {background-position: -1620px 0; width: 90px; height: 90px} +.shield_2_v0 {background-position: -1710px 0; width: 90px; height: 90px} +.shield_1_v1 {background-position: -1800px 0; width: 90px; height: 90px} +.shield_1_v0 {background-position: -1890px 0; width: 90px; height: 90px} +._shield_4_v1 {background-position: -1980px 0; width: 90px; height: 90px} +.nh_hair_white_v1 {background-position: -2070px 0; width: 90px; height: 90px} +.nh_hair_white_v0 {background-position: -2160px 0; width: 90px; height: 90px} +.nh_hair_brown_v1 {background-position: -2250px 0; width: 90px; height: 90px} +.nh_hair_brown_v0 {background-position: -2340px 0; width: 90px; height: 90px} +.nh_hair_blond_v1 {background-position: -2430px 0; width: 90px; height: 90px} +.nh_hair_blond_v0 {background-position: -2520px 0; width: 90px; height: 90px} +.nh_hair_black_v1 {background-position: -2610px 0; width: 90px; height: 90px} +.nh_hair_black_v0 {background-position: -2700px 0; width: 90px; height: 90px} +.head_5_v2 {background-position: -2790px 0; width: 90px; height: 90px} +.head_5_v1 {background-position: -2880px 0; width: 90px; height: 90px} +.head_5_v0 {background-position: -2970px 0; width: 90px; height: 90px} +.head_4_v2 {background-position: -3060px 0; width: 90px; height: 90px} +.head_4_v1 {background-position: -3150px 0; width: 90px; height: 90px} +.head_4_v0 {background-position: -3240px 0; width: 90px; height: 90px} +.head_3_v2 {background-position: -3330px 0; width: 90px; height: 90px} +.head_3_v1 {background-position: -3420px 0; width: 90px; height: 90px} +.head_3_v0 {background-position: -3510px 0; width: 90px; height: 90px} +.head_2_v2 {background-position: -3600px 0; width: 90px; height: 90px} +.head_2_v1 {background-position: -3690px 0; width: 90px; height: 90px} +.head_2_v0 {background-position: -3780px 0; width: 90px; height: 90px} +.head_1_v1 {background-position: -3870px 0; width: 90px; height: 90px} +.head_1_v0 {background-position: -3960px 0; width: 90px; height: 90px} +.head_0_v1 {background-position: -4050px 0; width: 90px; height: 90px} +.head_0_v0 {background-position: -4140px 0; width: 90px; height: 90px} +.hair_white_v1 {background-position: -4230px 0; width: 90px; height: 90px} +.hair_white_v0 {background-position: -4320px 0; width: 90px; height: 90px} +.hair_brown_v1 {background-position: -4410px 0; width: 90px; height: 90px} +.hair_brown_v0 {background-position: -4500px 0; width: 90px; height: 90px} +.hair_blond_v1 {background-position: -4590px 0; width: 90px; height: 90px} +.hair_blond_v0 {background-position: -4680px 0; width: 90px; height: 90px} +.hair_black_v1 {background-position: -4770px 0; width: 90px; height: 90px} +.hair_black_v0 {background-position: -4860px 0; width: 90px; height: 90px} +.armor_5_v1 {background-position: -4950px 0; width: 90px; height: 90px} +.armor_5_v0 {background-position: -5040px 0; width: 90px; height: 90px} +.armor_4_v1 {background-position: -5130px 0; width: 90px; height: 90px} +.armor_4_v0 {background-position: -5220px 0; width: 90px; height: 90px} +.armor_3_v1 {background-position: -5310px 0; width: 90px; height: 90px} +.armor_3_v0 {background-position: -5400px 0; width: 90px; height: 90px} +.armor_2_v0 {background-position: -5490px 0; width: 90px; height: 90px} +.armor_1_v1 {background-position: -5580px 0; width: 90px; height: 90px} +.armor_1_v0 {background-position: -5670px 0; width: 90px; height: 90px} +.armor_0_v11 {background-position: -5760px 0; width: 90px; height: 90px} +.armor_0_v10 {background-position: -5850px 0; width: 90px; height: 90px} +.armor_0_v9 {background-position: -5940px 0; width: 90px; height: 90px} +.armor_0_v8 {background-position: -6030px 0; width: 90px; height: 90px} +.armor_0_v7 {background-position: -6120px 0; width: 90px; height: 90px} +.armor_0_v6 {background-position: -6210px 0; width: 90px; height: 90px} +.armor_0_v5 {background-position: -6300px 0; width: 90px; height: 90px} +.armor_0_v4 {background-position: -6390px 0; width: 90px; height: 90px} +.armor_0_v3 {background-position: -6480px 0; width: 90px; height: 90px} +.armor_0_v2 {background-position: -6570px 0; width: 90px; height: 90px} +.armor_0_v1 {background-position: -6660px 0; width: 90px; height: 90px} +.armor_0_v0 {background-position: -6750px 0; width: 90px; height: 90px} diff --git a/archive/litenull_rewrite/app/img/sprites/player_sprites.png b/archive/litenull_rewrite/app/img/sprites/player_sprites.png new file mode 100644 index 0000000000..104ae3681b Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/player_sprites.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/shop.xcf b/archive/litenull_rewrite/app/img/sprites/shop.xcf new file mode 100644 index 0000000000..35fc264f42 Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/shop.xcf differ diff --git a/archive/litenull_rewrite/app/img/sprites/shop_sprites.css b/archive/litenull_rewrite/app/img/sprites/shop_sprites.css new file mode 100644 index 0000000000..eacd25a1ac --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/shop_sprites.css @@ -0,0 +1,27 @@ +weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, shield_5, shield_4, shield_3, shield_2, shield_1, head_5, head_4, head_3, head_2, head_1, armor_5, armor_4, armor_3, armor_2, armor_1, reroll, potion, copper, silver, gold {background: url(shop_sprites.css) no-repeat} +weapon_6 {background-position: 0 0; width: 40px; height: 40px} +weapon_5 {background-position: -40px 0; width: 40px; height: 40px} +weapon_4 {background-position: -80px 0; width: 40px; height: 40px} +weapon_3 {background-position: -120px 0; width: 40px; height: 40px} +weapon_2 {background-position: -160px 0; width: 40px; height: 40px} +weapon_1 {background-position: -200px 0; width: 40px; height: 40px} +shield_5 {background-position: -240px 0; width: 40px; height: 40px} +shield_4 {background-position: -280px 0; width: 40px; height: 40px} +shield_3 {background-position: -320px 0; width: 40px; height: 40px} +shield_2 {background-position: -360px 0; width: 40px; height: 40px} +shield_1 {background-position: -400px 0; width: 40px; height: 40px} +head_5 {background-position: -440px 0; width: 40px; height: 40px} +head_4 {background-position: -480px 0; width: 40px; height: 40px} +head_3 {background-position: -520px 0; width: 40px; height: 40px} +head_2 {background-position: -560px 0; width: 40px; height: 40px} +head_1 {background-position: -600px 0; width: 40px; height: 40px} +armor_5 {background-position: -640px 0; width: 40px; height: 40px} +armor_4 {background-position: -680px 0; width: 40px; height: 40px} +armor_3 {background-position: -720px 0; width: 40px; height: 40px} +armor_2 {background-position: -760px 0; width: 40px; height: 40px} +armor_1 {background-position: -800px 0; width: 40px; height: 40px} +reroll {background-position: -840px 0; width: 40px; height: 40px} +potion {background-position: -880px 0; width: 40px; height: 40px} +copper {background-position: -920px 0; width: 40px; height: 40px} +silver {background-position: -960px 0; width: 40px; height: 40px} +gold {background-position: -1000px 0; width: 40px; height: 40px} diff --git a/archive/litenull_rewrite/app/img/sprites/shop_sprites.png b/archive/litenull_rewrite/app/img/sprites/shop_sprites.png new file mode 100644 index 0000000000..366a262dfb Binary files /dev/null and b/archive/litenull_rewrite/app/img/sprites/shop_sprites.png differ diff --git a/archive/litenull_rewrite/app/img/sprites/sprites.css b/archive/litenull_rewrite/app/img/sprites/sprites.css new file mode 100644 index 0000000000..c5a3d6ec72 --- /dev/null +++ b/archive/litenull_rewrite/app/img/sprites/sprites.css @@ -0,0 +1,65 @@ +item-goldensword, item-redsword, item-bluesword, item-morningstar, item-axe, item-sword2, item-sword1, f_shield_5, f_shield_4, f_shield_3, f_shield_2, f_shield_1, m_shield_5, m_shield_4, m_shield_3, m_shield_2, m_shield_1, m_head_5, m_head_4, m_head_3, m_head_2, m_head_1, m_head_0, f_head_5_v2, f_head_5_v1, f_head_4_v2, f_head_4_v1, f_head_3_v2, f_head_3_v1, f_head_2_v2, f_head_2_v1, f_head_1, f_head_0, f_hair_white, f_hair_brown, f_hair_black, f_hair_blond, m_hair blond, m_hair black, m_hair brown, m_hair white, f_armor_5, f_armor_4, f_armor_3, f_armor_2, f_armor_1, f_armor_0_v2, f_armor_0_v1, m_armor_5, m_armor_4, m_armor_3, m_armor_2, m_armor_1, m_armor_0, f_skin_dead, f_skin_orc, f_skin_asian, f_skin_black, f_skin_white, m_skin_dead, m_skin_orc, m_skin_asian, m_skin_black, m_skin_white {background: url(css_sprite.png) no-repeat} +item-goldensword {background-position: 0 0; width: 90px; height: 90px} +item-redsword {background-position: -90px 0; width: 90px; height: 90px} +item-bluesword {background-position: -180px 0; width: 90px; height: 90px} +item-morningstar {background-position: -270px 0; width: 90px; height: 90px} +item-axe {background-position: -360px 0; width: 90px; height: 90px} +item-sword2 {background-position: -450px 0; width: 90px; height: 90px} +item-sword1 {background-position: -540px 0; width: 90px; height: 90px} +f_shield_5 {background-position: -630px 0; width: 90px; height: 90px} +f_shield_4 {background-position: -720px 0; width: 90px; height: 90px} +f_shield_3 {background-position: -810px 0; width: 90px; height: 90px} +f_shield_2 {background-position: -900px 0; width: 90px; height: 90px} +f_shield_1 {background-position: -990px 0; width: 90px; height: 90px} +m_shield_5 {background-position: -1080px 0; width: 90px; height: 90px} +m_shield_4 {background-position: -1170px 0; width: 90px; height: 90px} +m_shield_3 {background-position: -1260px 0; width: 90px; height: 90px} +m_shield_2 {background-position: -1350px 0; width: 90px; height: 90px} +m_shield_1 {background-position: -1440px 0; width: 90px; height: 90px} +m_head_5 {background-position: -1530px 0; width: 90px; height: 90px} +m_head_4 {background-position: -1620px 0; width: 90px; height: 90px} +m_head_3 {background-position: -1710px 0; width: 90px; height: 90px} +m_head_2 {background-position: -1800px 0; width: 90px; height: 90px} +m_head_1 {background-position: -1890px 0; width: 90px; height: 90px} +m_head_0 {background-position: -1980px 0; width: 90px; height: 90px} +f_head_5_v2 {background-position: -2070px 0; width: 90px; height: 90px} +f_head_5_v1 {background-position: -2160px 0; width: 90px; height: 90px} +f_head_4_v2 {background-position: -2250px 0; width: 90px; height: 90px} +f_head_4_v1 {background-position: -2340px 0; width: 90px; height: 90px} +f_head_3_v2 {background-position: -2430px 0; width: 90px; height: 90px} +f_head_3_v1 {background-position: -2520px 0; width: 90px; height: 90px} +f_head_2_v2 {background-position: -2610px 0; width: 90px; height: 90px} +f_head_2_v1 {background-position: -2700px 0; width: 90px; height: 90px} +f_head_1 {background-position: -2790px 0; width: 90px; height: 90px} +f_head_0 {background-position: -2880px 0; width: 90px; height: 90px} +f_hair_white {background-position: -2970px 0; width: 90px; height: 90px} +f_hair_brown {background-position: -3060px 0; width: 90px; height: 90px} +f_hair_black {background-position: -3150px 0; width: 90px; height: 90px} +f_hair_blond {background-position: -3240px 0; width: 90px; height: 90px} +m_hair blond {background-position: -3330px 0; width: 90px; height: 90px} +m_hair black {background-position: -3420px 0; width: 90px; height: 90px} +m_hair brown {background-position: -3510px 0; width: 90px; height: 90px} +m_hair white {background-position: -3600px 0; width: 90px; height: 90px} +f_armor_5 {background-position: -3690px 0; width: 90px; height: 90px} +f_armor_4 {background-position: -3780px 0; width: 90px; height: 90px} +f_armor_3 {background-position: -3870px 0; width: 90px; height: 90px} +f_armor_2 {background-position: -3960px 0; width: 90px; height: 90px} +f_armor_1 {background-position: -4050px 0; width: 90px; height: 90px} +f_armor_0_v2 {background-position: -4140px 0; width: 90px; height: 90px} +f_armor_0_v1 {background-position: -4230px 0; width: 90px; height: 90px} +m_armor_5 {background-position: -4320px 0; width: 90px; height: 90px} +m_armor_4 {background-position: -4410px 0; width: 90px; height: 90px} +m_armor_3 {background-position: -4500px 0; width: 90px; height: 90px} +m_armor_2 {background-position: -4590px 0; width: 90px; height: 90px} +m_armor_1 {background-position: -4680px 0; width: 90px; height: 90px} +m_armor_0 {background-position: -4770px 0; width: 90px; height: 90px} +f_skin_dead {background-position: -4860px 0; width: 90px; height: 90px} +f_skin_orc {background-position: -4950px 0; width: 90px; height: 90px} +f_skin_asian {background-position: -5040px 0; width: 90px; height: 90px} +f_skin_black {background-position: -5130px 0; width: 90px; height: 90px} +f_skin_white {background-position: -5220px 0; width: 90px; height: 90px} +m_skin_dead {background-position: -5310px 0; width: 90px; height: 90px} +m_skin_orc {background-position: -5400px 0; width: 90px; height: 90px} +m_skin_asian {background-position: -5490px 0; width: 90px; height: 90px} +m_skin_black {background-position: -5580px 0; width: 90px; height: 90px} +m_skin_white {background-position: -5670px 0; width: 90px; height: 90px} diff --git a/archive/litenull_rewrite/app/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif b/archive/litenull_rewrite/app/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif new file mode 100644 index 0000000000..4efa8c789e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png b/archive/litenull_rewrite/app/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png new file mode 100644 index 0000000000..0a4eab9615 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png b/archive/litenull_rewrite/app/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png new file mode 100644 index 0000000000..e38298d7ab Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif b/archive/litenull_rewrite/app/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif new file mode 100644 index 0000000000..48b607f2f5 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif b/archive/litenull_rewrite/app/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif new file mode 100644 index 0000000000..e7da02d4f7 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png b/archive/litenull_rewrite/app/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png new file mode 100644 index 0000000000..5cc6af84e6 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png new file mode 100644 index 0000000000..03e1bdf4f2 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png new file mode 100644 index 0000000000..de47ac52d0 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png new file mode 100644 index 0000000000..5d7f89df92 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png new file mode 100644 index 0000000000..7ef25a11bc Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif new file mode 100644 index 0000000000..f88037a4e6 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif new file mode 100644 index 0000000000..3e55728320 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png b/archive/litenull_rewrite/app/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png new file mode 100644 index 0000000000..7f0ee85adf Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif new file mode 100644 index 0000000000..2cc75ebeab Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif new file mode 100644 index 0000000000..612a424d55 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif new file mode 100644 index 0000000000..539113d8cc Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif new file mode 100644 index 0000000000..69c4bf6cc4 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif new file mode 100644 index 0000000000..252b1e6908 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif b/archive/litenull_rewrite/app/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif new file mode 100644 index 0000000000..276483e0ec Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif b/archive/litenull_rewrite/app/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif new file mode 100644 index 0000000000..3e5be58f41 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif b/archive/litenull_rewrite/app/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif new file mode 100644 index 0000000000..bd4267a5f8 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif b/archive/litenull_rewrite/app/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif new file mode 100644 index 0000000000..11c95837f3 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png b/archive/litenull_rewrite/app/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png new file mode 100644 index 0000000000..4b025ef899 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png b/archive/litenull_rewrite/app/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png new file mode 100644 index 0000000000..9c5e6c7a79 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png b/archive/litenull_rewrite/app/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png new file mode 100644 index 0000000000..ed2584e6d8 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif new file mode 100644 index 0000000000..e1a5963b39 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif new file mode 100644 index 0000000000..b50ee081a2 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif new file mode 100644 index 0000000000..bec63f0915 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif new file mode 100644 index 0000000000..39086a14ff Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif new file mode 100644 index 0000000000..ec52bdddcb Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif new file mode 100644 index 0000000000..1141910799 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png b/archive/litenull_rewrite/app/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png new file mode 100644 index 0000000000..a5415250fa Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif b/archive/litenull_rewrite/app/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif new file mode 100644 index 0000000000..046c6b4817 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png b/archive/litenull_rewrite/app/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png new file mode 100644 index 0000000000..9143feb639 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png new file mode 100644 index 0000000000..5f53907632 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png new file mode 100644 index 0000000000..efc930ca6e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png new file mode 100644 index 0000000000..d057032960 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png b/archive/litenull_rewrite/app/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png new file mode 100644 index 0000000000..b72e693953 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png b/archive/litenull_rewrite/app/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png new file mode 100644 index 0000000000..bc31150249 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png b/archive/litenull_rewrite/app/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png new file mode 100644 index 0000000000..7a4dfcca8f Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png b/archive/litenull_rewrite/app/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png new file mode 100644 index 0000000000..b7b70e237a Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png b/archive/litenull_rewrite/app/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png new file mode 100644 index 0000000000..2e61ea92b2 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif b/archive/litenull_rewrite/app/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif new file mode 100644 index 0000000000..0d873aa493 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png b/archive/litenull_rewrite/app/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png new file mode 100644 index 0000000000..c97d47448c Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png b/archive/litenull_rewrite/app/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png new file mode 100644 index 0000000000..897ed12bbd Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png new file mode 100644 index 0000000000..37c8c1476e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png new file mode 100644 index 0000000000..5137e84fad Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png new file mode 100644 index 0000000000..ba738bcc80 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png new file mode 100644 index 0000000000..d8a77b9543 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png new file mode 100644 index 0000000000..d2d541ecdc Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png new file mode 100644 index 0000000000..246f2031e6 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png new file mode 100644 index 0000000000..1396b6e37e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png new file mode 100644 index 0000000000..e579d5c15d Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png new file mode 100644 index 0000000000..f36e4aab2e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png new file mode 100644 index 0000000000..bd1d337f61 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png new file mode 100644 index 0000000000..f910ae3a91 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png new file mode 100644 index 0000000000..ad89e6e5ca Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png new file mode 100644 index 0000000000..11fbb4cde3 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png new file mode 100644 index 0000000000..c88818377a Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png b/archive/litenull_rewrite/app/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png new file mode 100644 index 0000000000..c084393ab6 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny lavender.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny lavender.png new file mode 100644 index 0000000000..adf317483b Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny lavender.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny light blue.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny light blue.png new file mode 100644 index 0000000000..2b0dee060c Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny light blue.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny pink.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny pink.png new file mode 100644 index 0000000000..19fddb633c Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny pink.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny yellow.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny yellow.png new file mode 100644 index 0000000000..ac993a62c5 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny yellow.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny1.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny1.png new file mode 100644 index 0000000000..7ea2c2e388 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore bunny1.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes white.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes white.png new file mode 100644 index 0000000000..bf7e6475a2 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes white.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes.png new file mode 100644 index 0000000000..0c51fe8d30 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore hermes.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/special/compstore kitties1.png b/archive/litenull_rewrite/app/img/unprocessed/special/compstore kitties1.png new file mode 100644 index 0000000000..9a5386d355 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/special/compstore kitties1.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png new file mode 100644 index 0000000000..e3b195d449 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png new file mode 100644 index 0000000000..1a53a0bd63 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png new file mode 100644 index 0000000000..6517e33078 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png new file mode 100644 index 0000000000..608c77e10e Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png new file mode 100644 index 0000000000..2985f66163 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png new file mode 100644 index 0000000000..a37b543dae Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png new file mode 100644 index 0000000000..40084bca48 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png new file mode 100644 index 0000000000..39842812c7 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png new file mode 100644 index 0000000000..2f9f99f89f Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png new file mode 100644 index 0000000000..4b1c240bb3 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png new file mode 100644 index 0000000000..a7bea79ca0 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png new file mode 100644 index 0000000000..831cae9f58 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png new file mode 100644 index 0000000000..a8a3d3fd5a Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png new file mode 100644 index 0000000000..e8005412b0 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png new file mode 100644 index 0000000000..01c83ff60f Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png new file mode 100644 index 0000000000..f2696f09d0 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png new file mode 100644 index 0000000000..d0c79cf98c Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png new file mode 100644 index 0000000000..983c0c44ad Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png new file mode 100644 index 0000000000..54807f6093 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png new file mode 100644 index 0000000000..464e5ad3ae Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png new file mode 100644 index 0000000000..d4f58be318 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png new file mode 100644 index 0000000000..ac4bac66a3 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png new file mode 100644 index 0000000000..664ad5ed83 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png new file mode 100644 index 0000000000..240c549bb4 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png new file mode 100644 index 0000000000..1ef5a4083d Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png b/archive/litenull_rewrite/app/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png new file mode 100644 index 0000000000..c81719e62b Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png new file mode 100644 index 0000000000..6ed26e1c2c Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png new file mode 100644 index 0000000000..fbd1e287ce Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png new file mode 100644 index 0000000000..c3d0298789 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png new file mode 100644 index 0000000000..f28037da01 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png new file mode 100644 index 0000000000..0910c08d6f Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png new file mode 100644 index 0000000000..5895b86f24 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png new file mode 100644 index 0000000000..377f9b69a3 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png new file mode 100644 index 0000000000..92f9048e73 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png new file mode 100644 index 0000000000..2ff417a7d9 Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png new file mode 100644 index 0000000000..b6c1d745aa Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png new file mode 100644 index 0000000000..c22d69040b Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png differ diff --git a/archive/litenull_rewrite/app/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png new file mode 100644 index 0000000000..1348413c7d Binary files /dev/null and b/archive/litenull_rewrite/app/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png differ diff --git a/archive/litenull_rewrite/app/index.html b/archive/litenull_rewrite/app/index.html new file mode 100644 index 0000000000..c0507ee8b3 --- /dev/null +++ b/archive/litenull_rewrite/app/index.html @@ -0,0 +1,133 @@ + + + + + + HabitRPG + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archive/litenull_rewrite/app/scripts/app.js b/archive/litenull_rewrite/app/scripts/app.js new file mode 100644 index 0000000000..e37b7d3ef0 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/app.js @@ -0,0 +1,74 @@ +'use strict'; + +/** + * The main HabitRPG app module. + * + * @type {angular.Module} + */ + +var habitrpg = angular.module('habitrpg', ['userServices', 'sharedServices', 'authServices', 'notificationServices', 'hmTouchEvents']) + .config(['$routeProvider', function ($routeProvider) { + $routeProvider + .when('/home', {templateUrl: 'views/home.html'}) + .when('/login', {templateUrl: 'views/login.html'}) + .when('/settings', {templateUrl: 'views/settings.html'}) + .when('/profile', {templateUrl: 'views/profile.html'}) + .when('/options', {templateUrl: 'views/options.html'}) + .when('/:action', {templateUrl: 'views/list.html'}) + .when('/tasks/:taskId', {templateUrl: 'views/details.html'}) + .when('/todo/active', {templateUrl: 'views/list.html'}) + .when('/todo/completed', {templateUrl: 'views/list.html'}) + .otherwise({redirectTo: '/habit'}); + }]) + .config(['$compileProvider', function ($compileProvider) { + $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/); + }]); + + +// Touch directive, binding to touchstart as to not wait for 300ms + +habitrpg.directive('gfTap', ["$location", "$parse", function ($location, $parse) { + return function (scope, element, attrs) { + var tapping = false; + element.bind('touchstart', function () { + tapping = true; + }); + + element.bind('touchmove', function () { + tapping = false + }); + + element.bind('touchend', function (event) { + if (tapping) { + var fn = $parse(attrs['gfTap']); + + if (attrs['href']) { + var location = attrs['href'].replace('#', '/'); + $location.path(location); + } + + scope.$apply(function () { + fn(scope, {$event: event}) + }); + } + }); + + }; +}]); + +habitrpg.directive('sort', function (User) { + return function ($scope, element, attrs, ngModel) { + $(element).sortable({ + axis: "y", + start: function (event, ui) { + ui.item.data('startIndex', ui.item.index()); + }, + stop: function (event, ui) { + var taskType = angular.element(ui.item[0]).scope().task.type + 's' + var startIndex = ui.item.data('startIndex'); + var task = User.user[taskType][startIndex]; + User.log({op: 'sortTask', task: task, from: startIndex, to: ui.item.index()}); + } + }); + } +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/authCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/authCtrl.js new file mode 100644 index 0000000000..5449c699c9 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/authCtrl.js @@ -0,0 +1,27 @@ +'use strict'; + +/** + * The authentication controller (login & facebook) + * + */ + +habitrpg.controller('AuthCtrl', function AuthCtrl($scope, Facebook, LocalAuth, User, $http, $location) { + $scope.Facebook = Facebook; + $scope.Local = LocalAuth; + + $scope.uuid = '' + $scope.apiToken = '' + + $scope.apiLogin = function() { + + User.authenticate($scope.uuid, $scope.apiToken, function(err) { + if (!err) { + alert('Login succesfull!'); + $location.path("/habit"); + User.fetch() + } + }); + + } + +}); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/controllers/characterCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/characterCtrl.js new file mode 100644 index 0000000000..14c47e5872 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/characterCtrl.js @@ -0,0 +1,32 @@ +'use strict'; + +/** + * The character controller: + * + */ + +habitrpg.controller( 'CharacterCtrl', function CharacterCtrl( $scope, $location, filterFilter, User ) { + + $scope.user = User.user; + + $scope.equipped = function(user, type) { + return window.habitrpgShared.helpers.equipped(user, type); + } + + $scope.$watch('user.tasks', function(){ + $scope.hpPercent = function(hp) { + return (hp / 50) * 100; + } + + $scope.expPercent = function(exp, level) { + return Math.round((exp / window.habitrpgShared.algos.tnl(level)) * 100); + } + }) + + $scope.showUserAvatar = function() { + $('.userAvatar').show() + } + + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/eventCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/eventCtrl.js new file mode 100644 index 0000000000..ec8da115cc --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/eventCtrl.js @@ -0,0 +1,14 @@ +'use strict'; + +/** + * Phonegap events + * + */ + + if (typeof cordova != 'undefined') { + // the second parameter is the callback to be called + document.addEventListener("online", yourCallbackFunction, false); + document.addEventListener("offline", yourCallbackFunction, false); + document.addEventListener("resume", yourCallbackFunction, false); + document.addEventListener("pause", yourCallbackFunction, false); + } diff --git a/archive/litenull_rewrite/app/scripts/controllers/loginCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/loginCtrl.js new file mode 100644 index 0000000000..bf58133c07 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/loginCtrl.js @@ -0,0 +1,11 @@ +'use strict'; + +/** + * The login controller: + * + */ + +habitrpg.controller( 'LoginCtrl', function CharacterCtrl( $scope, $location, filterFilter, User ) { + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/menuCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/menuCtrl.js new file mode 100644 index 0000000000..139a1cb280 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/menuCtrl.js @@ -0,0 +1,43 @@ +'use strict'; + +/** + * The menu controller: + * - sets the menu options, should we do it dynamic so it generates the menu like: width = 1/elements * 100 ? + * - exposes the model to the template and provides event handlers + */ + +habitrpg.controller( 'MenuCtrl', function MenuCtrl( $scope, $location, filterFilter) { + + var nav = $scope.nav = [ + + { + 'name' :'#habit', + 'img' :'explorer.png', + 'link' :'Habits' + }, + + { + 'name' :'#daily', + 'img' :'contacts.png', + 'link' :'Dailies' + }, + + { + 'name' :'#todo', + 'img' :'todo.png', + 'link' :'Todos' + }, + + { + 'name' :'#reward', + 'img' :'explorer.png', + 'link' :'Rewards' + } + + ] + + + + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/navCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/navCtrl.js new file mode 100644 index 0000000000..a83951180c --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/navCtrl.js @@ -0,0 +1,34 @@ +'use strict'; + +/** + * The nav controller: + * - sets the menu options, should we do it dynamic so it generates the menu like: width = 1/elements * 100 ? + * - exposes the model to the template and provides event handlers + */ + +habitrpg.controller( 'NavCtrl', function NavCtrl( $scope, $location, filterFilter ) { + var nav = $scope.nav = [ + + { + 'name' :'#habit', + 'img' :'explorer.png' + }, + + { + 'name' :'#daily', + 'img' :'contacts.png' + }, + + { + 'name' :'#todo', + 'img' :'todo.png' + }, + + { + 'name' :'#reward', + 'img' :'explorer.png' + } + + ] + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/notificationCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/notificationCtrl.js new file mode 100644 index 0000000000..2b95e09705 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/notificationCtrl.js @@ -0,0 +1,13 @@ +'use strict'; + + +habitrpg.controller('NotificationCtrl', function ($scope, $location, filterFilter, Notification) { + $scope.data = Notification.get(); + + $('#notification').bind('touchend.swipe', function (event) { + Notification.clearTimer(); + Notification.hide(); + }); + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/rootCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/rootCtrl.js new file mode 100644 index 0000000000..7ca0380578 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/rootCtrl.js @@ -0,0 +1,8 @@ +'use strict'; +// Make user and settings available for everyone through root scope. +habitrpg.controller( 'RootCtrl', function ( $scope, $rootScope, User) { + $rootScope.User = User; + $rootScope.user = User.user; + $rootScope.settings = User.settings; + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/settingsCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/settingsCtrl.js new file mode 100644 index 0000000000..c739ae81f4 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/settingsCtrl.js @@ -0,0 +1,17 @@ +'use strict'; +// Make user and settings available for everyone through root scope. +habitrpg.controller('SettingsCtrl', function ($scope, User, $location) { + $scope.resetApp = function () { + localStorage.clear(); + location.reload(); + }; + $scope.auth = function (id, token) { + User.authenticate(id, token, function (err) { + if (!err) { + alert('Login succesfull!'); + $location.path("/habit"); + } + }); + } + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/statsCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/statsCtrl.js new file mode 100644 index 0000000000..f559ddb2cd --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/statsCtrl.js @@ -0,0 +1,23 @@ +'use strict'; + +/* + +Statz controller + +- Retrieves statz from localStorage. +- Exposes the model to the template and provides event handlers + + +*/ + + +habitrpg.controller( 'StatsCtrl', function StatsCtrl( $scope, $location, filterFilter, User ) { + $scope.refreshing = function () { + return User.settings.fetching ? "spin" : "" + }; + $scope.queueLength = function () { + return User.settings.sync.queue.length || User.settings.sync.sent.length + }; + $scope.stats = User.user.stats; + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/taskDetailsCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/taskDetailsCtrl.js new file mode 100644 index 0000000000..3af75ed89f --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/taskDetailsCtrl.js @@ -0,0 +1,50 @@ +'use strict'; + +habitrpg.controller('TaskDetailsCtrl', function TaskDetailsCtrl($scope, $rootScope, $location, User) { + + $scope.task = $rootScope.selectedTask; + $scope.editing = false; + $scope.editedTask = null; + + $scope.goBack = function () { + $rootScope.selectedTask = null; + $location.path('/' + $scope.task.type); + }; + + $scope.edit = function () { + $scope.originalTask = _.clone($scope.task); // TODO deep clone?; + $scope.editedTask = $scope.task; + $scope.editing = true; + }; + + $scope.save = function () { + var task = $scope.task; + User.log([ + {op: 'set', path: "tasks." + task.id + ".text", value: task.text}, + {op: 'set', path: "tasks." + task.id + ".notes", value: task.notes} + ]); + $rootScope.selectedTask = null; + $location.path('/' + $scope.task.type); + $scope.editing = false; + }; + + $scope.cancel = function () { + // reset $scope.task to $scope.originalTask + for (var key in $scope.task) { + $scope.task[key] = $scope.originalTask[key]; + } + $scope.originalTask = null; + $scope.editedTask = null; + $scope.editing = false; + }; + + $scope.delete = function () { + var task = $scope.task; + var tasks = User.user[task.type+'s']; + User.log({op: 'delTask', task: task}); + $scope.goBack(); + delete tasks.splice(tasks.indexOf(task),1); + }; + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/tasksCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/tasksCtrl.js new file mode 100644 index 0000000000..6e9a898f0f --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/tasksCtrl.js @@ -0,0 +1,305 @@ +'use strict'; + +habitrpg.controller('TasksCtrl', function TasksCtrl($scope, $rootScope, $location, filterFilter, User, Algos, Helpers, Notification) { + + $scope.user = User.user; + + $scope.$watch('User.user.stats.gp', function() { + $scope.money_gold = Math.round(User.user.stats.gp) + }) + + $scope.taskTypeTitle = function () { +// show title according to the location + switch ($location.path().split('/')[1]) { + case 'habit': + return 'Habits'; + case 'daily': + return 'Dailies'; + case 'todo': + return 'Todos'; + case 'reward': + return 'Rewards'; + default : + return ""; + } + }; + + $scope.taskTypeTitleSingular = function () { +// show title according to the location, singular form + return $scope.taskTypeTitle().slice(0,-1); + }; + + $scope.taskType = function () { + return $location.path().split('/')[1] + }; + + $scope.tasks = function () { + //return task array based on our location i.e. /habit will return user.habits[] + var tasks = [] + //return User.user[$scope.taskType() + 's'] + + _.each(User.user['habits'], function(el, index) { + tasks.push(el) + }) + + _.each(User.user['dailys'], function(el, index) { + tasks.push(el) + }) + + _.each(User.user['todos'], function(el, index) { + tasks.push(el) + }) + + _.each(User.user['rewards'], function(el, index) { + tasks.push(el) + }) + + return tasks + }; + + $scope.taskFilter = function (task) { + return ($location.path() == '/todo') ? !task.completed : + ($location.path() == '/todo/completed') ? task.completed : + true; + }; + + $scope.score = function (task, direction) { + //save current stats to compute the difference after scoring. + var statsDiff = {}; + var oldStats = _.clone(User.user.stats); + + Algos.score(User.user, task, direction); + + //compute the stats change. + _.each(oldStats, function (value, key) { + var newValue = User.user.stats[key]; + if (newValue !== value) { + statsDiff[key] = newValue - value; + } + }); + //notify user if there are changes in stats. + if (Object.keys(statsDiff).length > 0) { + // Notification.push({type: 'stats', stats: statsDiff}); + } + User.log({op: 'score', task: task, dir: direction}); + }; + + $scope.getClass = function(task) { + var out = '' + if (task.type == 'daily' && task.completed) + out += ' completed' + else if (task.value < -20) + out += ' color-worst' + else if (task.value < -10) + out += ' color-worse' + else if (task.value < -1) + out += ' color-bad' + else if (task.value < 1) + out += ' color-neutral' + else if (task.value < 5) + out += ' color-good' + else if (task.value < 10) + out += ' color-better' + else + out += ' color-best' + return out + } + + + $scope.addTask = function (type) { + var task = null + + if (type == 'habit') { + task = $scope.newTaskHabit + }else if (type == 'daily') { + task = $scope.newTaskDailies + }else if (type == 'todo') { + task = $scope.newTaskTodo + }else if (type == 'reward') { + task = $scope.newTaskReward + } + + if (!task.length) { + return; + } + + var defaults = { + text: task, + type: type, + value: type == 'reward' ? 20 : 0 + }, + extra = {}; + + switch (type) { + case 'habit': + extra = {up: true, down: true}; + break; + case 'daily': + case 'todo': + extra = {completed: false}; + break; + } + + + var newTask = _.defaults(extra, defaults); + newTask.id = Helpers.uuid(); + User.user[newTask.type + 's'].unshift(newTask) + $scope.newTask = ''; + User.log({op: 'addTask', task: newTask}); + + //Add the new task to the actions log + + }; + + $scope.delTask = function(taskObj) { + User.log({op:'delTask', task:taskObj}) + } + + $scope.clearDoneTodos = function () { + //We can't alter $scope.user.tasks here. We have to invoke API call. + //To be implemented + }; + + $scope.selectTask = function (task) { + $rootScope.selectedTask = task; + $location.path('/tasks/' + task.id) + } + + $scope.changeCheck = function (task) { + // This is calculated post-change, so task.completed=true if they just checked it + if (task.completed) { + $scope.score(task, 'up') + } else { + $scope.score(task, 'down') + } + } + + $scope.editTask = function(task) { + if (!task.editing) { + task.editing = true + if (typeof task.tags == 'undefined') { + task.tags = {} + } + }else{ + task.editing = false + } + } + + $scope.save = function(task) { + + var ops = ([ + {op: 'set', path: "tasks." + task.id + ".text", value: task.text}, + {op: 'set', path: "tasks." + task.id + ".notes", value: task.notes}, + {op: 'set', path: "tasks." + task.id + ".up", value: task.up}, + {op: 'set', path: "tasks." + task.id + ".down", value: task.down}, + {op: 'set', path: "tasks." + task.id + ".priority", value: task.priority}, + {op: 'set', path: "tasks." + task.id + ".date", value: task.date}, + {op: 'set', path: "tasks." + task.id + ".price", value: task.price}, + ]) + + _.each(task.tags, function(el, key, list) { + ops.push({op: 'set', path: "tasks." + task.id + ".tags." + key, value: el}) + }) + + _.each(task.repeat, function(el, key, list) { + ops.push({op: 'set', path: "tasks." + task.id + ".repeat." + key, value: el}) + }) + + User.log(ops) + + task.editing = false + + } + + $scope.showAdvancedOptions = function(task) { + if (!task.advanced) { + task.advanced = true + }else{ + task.advanced = false + } + } + + $scope.setPriority = function(task, priority) { + task.priority = priority + } + + $scope.getPriority = function(task, priority) { + if (task.priority == priority) { + return true; + }else{ + return false; + } + } + + $scope.getRepeat = function(task, repeat) { + var enabled = ''; + _.each(task.repeat, function(el, key, list) { + if (key == repeat && el == true) { + enabled = true + } + }) + + if (enabled) { + return true + }else{ + return false + } + } + + $scope.setRepeat = function(task, repeat) { + + if (typeof task.repeat == 'undefined') { + var obj = {} + obj[repeat] = true; + + task.repeat = {} + task.repeat = obj + return true + } + + + if (!task.repeat[repeat]) { + task.repeat[repeat] = true + }else{ + task.repeat[repeat] = false + } + + } + + $scope.addTag = function(task, tag) { + var obj = {} + obj[tag] = true + task.tags.push(obj) + } + + $scope.toggleTag = function(task, tag) { + var obj = {} + if (typeof task.tags != 'undefined') { + if (!task.tags[tag]) { + task.tags[tag] = false; + }else{ + task.tags[tag] = true + } + }else{ + task.tags = {} + task.tags[tag] = true + } + } + + $scope.deleteTask = function(task) { + var info = confirm('Are you sure you want to delete this task ?') + + if (info == true) { + + _.each(User.user[task.type + 's'], function(el, index) { + if (el.id == task.id) { + User.user[task.type + 's'].splice(index, 1) + } + }) + + User.log({op:'delTask', task:task}) + } + } + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/userAvatarCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/userAvatarCtrl.js new file mode 100644 index 0000000000..0926b596e6 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/userAvatarCtrl.js @@ -0,0 +1,38 @@ +'use strict'; + +/** + * The character controller: + * + */ + +habitrpg.controller( 'userAvatarCtrl', function CharacterCtrl( $scope, $location, filterFilter, User ) { + + $scope.user = User.user; + + $scope.changeHair = function(color) { + User.user.preferences.hair = color; + User.log({op:"set",path:"preferences.hair",value:color}) + } + + $scope.changeSkin = function(color) { + User.user.preferences.skin = color + User.log({op:"set",path:"preferences.skin",value:color}) + } + + $scope.changeSex = function(gender) { + User.user.preferences.gender = gender + User.log({op:"set",path:"preferences.gender",value:gender}) + } + + $scope.changeArmor = function(set) { + User.user.preferences.armorSet = v + User.log({op:"set",path:"preferences.armorSet",value:set}) + } + + $scope.hideUserAvatar = function() { + $('.userAvatar').hide() + } + + + +}); diff --git a/archive/litenull_rewrite/app/scripts/controllers/wrapperCtrl.js b/archive/litenull_rewrite/app/scripts/controllers/wrapperCtrl.js new file mode 100644 index 0000000000..15554c0fc4 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/controllers/wrapperCtrl.js @@ -0,0 +1,28 @@ +'use strict'; + +/** + * The nav controller: + * - sets the menu options, should we do it dynamic so it generates the menu like: width = 1/elements * 100 ? + * - exposes the model to the template and provides event handlers + */ + +habitrpg.controller( 'WrapperCtrl', function WrapperCtrl( $scope, $location, filterFilter, Facebook ) { + + +$scope.showMenu = function() { + + if ($location.path() == '/options') { + $location.path('/') + }else{ + $location.path('/options') + } + +} + +$scope.logout = function() { + localStorage.clear() + $location.path('login') + location.reload() +} + +}); diff --git a/archive/litenull_rewrite/app/scripts/directives/taskBlur.js b/archive/litenull_rewrite/app/scripts/directives/taskBlur.js new file mode 100644 index 0000000000..ac8f1269bd --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/directives/taskBlur.js @@ -0,0 +1,12 @@ +'use strict'; + +/** + * Directive that executes an expression when the element it is applied to loses focus. + */ +habitrpg.directive('taskBlur', function() { + return function( scope, elem, attrs ) { + elem.bind('blur', function() { + scope.$apply(attrs.taskBlur); + }); + }; +}); diff --git a/archive/litenull_rewrite/app/scripts/directives/taskFocus.js b/archive/litenull_rewrite/app/scripts/directives/taskFocus.js new file mode 100644 index 0000000000..d076a36119 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/directives/taskFocus.js @@ -0,0 +1,16 @@ +'use strict'; + +/** + * Directive that places focus on the element it is applied to when the expression it binds to evaluates to true. + */ +habitrpg.directive('taskFocus', function( $timeout ) { + return function( scope, elem, attrs ) { + scope.$watch(attrs.taskFocus, function( newval ) { + if ( newval ) { + $timeout(function() { + elem[0].focus(); + }, 0, false); + } + }); + }; +}); diff --git a/archive/litenull_rewrite/app/scripts/filters/filters.js b/archive/litenull_rewrite/app/scripts/filters/filters.js new file mode 100644 index 0000000000..0e0d79d0ae --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/filters/filters.js @@ -0,0 +1,10 @@ +angular.module('habitrpg') + .filter('gold', function () { + return function (gp) { + return Math.floor(gp); + } + }).filter('silver', function () { + return function (gp) { + return Math.floor((gp - Math.floor(gp))*100); + } + }); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/services/authServices.js b/archive/litenull_rewrite/app/scripts/services/authServices.js new file mode 100644 index 0000000000..7b4393f741 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/services/authServices.js @@ -0,0 +1,98 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +var facebook = {} + +angular.module('authServices', ['userServices']). +factory('Facebook', function($http, User) { + //TODO FB.init({appId: '${section.parameters['facebook.app.id']}', status: true, cookie: true, xfbml: true}); + var auth, user = User.user; + + facebook.handleStatusChange = function(session) { + if (session.authResponse) { + + FB.api('/me', { + fields: 'name, picture, email' + }, function(response) { + console.log(response.error) + if (!response.error) { + + var data = { + name: response.name, + facebook_id: response.id, + email: response.email + } + + $http.post('http://127.0.0.1:3000/api/v1/user/auth/facebook', data).success(function(data, status, headers, config) { + User.authenticate(data.id, data.token, function(err) { + if (!err) { + alert('Login succesfull!'); + $location.path("/habit"); + } + }); + }).error(function(response) { + console.log('error') + }) + + } else { + alert('napaka') + } + //clearAction(); + }); + } else { + document.body.className = 'not_connected'; + //clearAction(); + } + } + + return { + + authUser: function() { + FB.Event.subscribe('auth.statusChange', facebook.handleStatusChange); + }, + + getAuth: function() { + return auth; + }, + + login: function() { + + FB.login(null, { + scope: 'email' + }); + }, + + logout: function() { + FB.logout(function(response) { + window.location.reload(); + }); + } + } + +}) + +.factory('LocalAuth', function($http, User) { + + var auth, user = User.user; + + return { + + getAuth: function() { + return auth; + }, + + login: function() { + user.id = ''; + user.apiToken = ''; + User.authenticate(); + return; + + }, + + logout: function() {} + } + +}); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/services/notificationServices.js b/archive/litenull_rewrite/app/scripts/services/notificationServices.js new file mode 100644 index 0000000000..01c81913db --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/services/notificationServices.js @@ -0,0 +1,74 @@ +angular.module('notificationServices', []). + factory('Notification', function () { + var data = {message:''}; + var active = false; + var timer = null; + + return { + + hide: function () { + $('#notification').fadeOut(function () { + $('#notification').css('top', '-60px').css('webkit-transform', 'none').show().css('left', '0px'); + }); + + active = false; + timer = null; + }, + + animate: function () { + + if (timer) { + clearTimeout(timer); + timer = setTimeout(this.hide, 2000) + } + + if (active == false) { + active = true; + + $('#notification').transition({ y: 60, x: 0 }); + timer = setTimeout(this.hide, 2000); + } + + }, + + push: function (message) { + data.message = '' + // TODO implement message growl type notifications instead. + // {type:'stats',stats:stats} and {type:"text", text:"text"} + // {hp:1,gp:-2.2} + switch(message.type) { + case 'stats': + var keys = Object.keys(message.stats) + _.each(keys, function(el, index) { + if (message.stats[el] < 0) { + data.message += el + ':' + '' + message.stats[el] + '' + }else{ + data.message += el + ':' + message.stats[el] + } + }) + break; + case 'text': + data.message = message.text + break; + } + + this.animate() + }, + + get: function () { + return data; + }, + + clearTimer: function () { + clearTimeout(timer); + timer = null; + active = false; + }, + + init: function () { + timer = setTimeout(this.hide, 2000); + } + + } + + }); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/services/partyMembersStorage.js b/archive/litenull_rewrite/app/scripts/services/partyMembersStorage.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/archive/litenull_rewrite/app/scripts/services/partyStorage.js b/archive/litenull_rewrite/app/scripts/services/partyStorage.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/archive/litenull_rewrite/app/scripts/services/sharedServices.js b/archive/litenull_rewrite/app/scripts/services/sharedServices.js new file mode 100644 index 0000000000..0265ffc75d --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/services/sharedServices.js @@ -0,0 +1,16 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('sharedServices', [] ). + factory("Items", function($rootScope){ + return window.habitrpgShared.items; + }). + factory("Algos", function($rootScope){ + return window.habitrpgShared.algos; + }). + factory("Helpers", function($rootScope){ + return window.habitrpgShared.helpers; + }); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/services/userServices.js b/archive/litenull_rewrite/app/scripts/services/userServices.js new file mode 100644 index 0000000000..739ab56e8e --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/services/userServices.js @@ -0,0 +1,212 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('userServices', []). +factory('User', function($http, $location, $rootScope, $timeout) { + var STORAGE_ID = 'habitrpg-user', + HABIT_MOBILE_SETTINGS = 'habit-mobile-settings', + authenticated = false, + defaultSettings = { + auth: { + apiId: '', + apiToken: '' + }, + sync: { + queue: [], + //here OT will be queued up, this is NOT call-back queue! + sent: [] //here will be OT which have been sent, but we have not got reply from server yet. + }, + fetching: false, + // whether fetch() was called or no. this is to avoid race conditions + online: false + }, + settings = {}, + //habit mobile settings (like auth etc.) to be stored here + URL = 'https://beta.habitrpg.com/api/v1/user/batch-update', + schema = { + stats: { + gp: 0, + exp: 0, + lvl: 1, + hp: 50 + }, + party: { + current: null, + invitation: null + }, + items: { + weapon: 0, + armor: 0, + head: 0, + shield: 0, + pets: [], + eggs: [] + }, + preferences: { + gender: 'm', + skin: 'white', + hair: 'blond', + armorSet: 'v1' + }, + auth: { + timestamps: { + savedAt: +new Date + } + }, + tasks: [], + habits:[], + dailys:[], + rewards:[], + todos:[], + // note task-types are differentiated / filtered by type {habit, daily, todo, reward} + lastCron: 'new', + balance: 1, + flags: {} + }, + user = {}; // this is stored as a reference accessible to all controllers, that way updates propagate + + var syncQueue = function(cb) { + if (!authenticated) { + alert("Not authenticated, can't sync, go to settings first."); + return; + } + + var queue = settings.sync.queue; + var sent = settings.sync.sent; + if (queue.length === 0) { + console.log('Sync: Queue is empty'); + return; + } + if (settings.fetching) { + console.log('Sync: Already fetching'); + return; + } + if (settings.online !== true) { + console.log('Sync: Not online'); + return; + } + + settings.fetching = true; + // move all actions from queue array to sent array + _.times(queue.length, function() { + sent.push(queue.shift()); + }); + + $http.post(URL, sent).success(function(data, status, heacreatingders, config) { + data.tasks = _.toArray(data.tasks); + //make sure there are no pending actions to sync. If there are any it is not safe to apply model from server as we may overwrite user data. + + sent.length = 0; + settings.fetching = false; + save(); + if (cb) { + cb(false) + } + + syncQueue(); // call syncQueue to check if anyone pushed more actions to the queue while we were talking to server. + }).error(function(data, status, headers, config) { + //move sent actions back to queue + _.times(sent.length, function() { + queue.push(sent.shift()) + }); + settings.fetching = false; + + }); + + + }; + + var fetch = function() { + $http.post(URL, {}) + .success(function(response) { + _.extend(user,response) + }) + } + var save = function() { + localStorage.setItem(STORAGE_ID, JSON.stringify(user)); + localStorage.setItem(HABIT_MOBILE_SETTINGS, JSON.stringify(settings)); + }; + var userServices = { + user: user, + online: function(status) { + if (status === true) { + settings.online = true; + syncQueue(); + } else { + settings.online = false; + }; + }, + + authenticate: function(apiId, apiToken, cb) { + if ( !! apiId && !! apiToken) { + $http.defaults.headers.common = { + 'Content-Type': "application/json;charset=utf-8" + }; + $http.defaults.headers.common['x-api-user'] = apiId; + $http.defaults.headers.common['x-api-key'] = apiToken; + authenticated = true; + settings.auth.apiId = apiId; + settings.auth.apiToken = apiToken; + settings.online = true; + this.log({}, cb); + } else { + alert('Please enter your ID and Token in settings.') + } + }, + + log: function(action, cb) { + //push by one buy one if an array passed in. + if (_.isArray(action)) { + action.forEach(function(a) { + settings.sync.queue.push(a); + }); + } else { + settings.sync.queue.push(action); + } + + save(); + syncQueue(cb); + + + }, + fetch:fetch, + settings: settings + }; + + + //load settings if we have them + if (localStorage.getItem(HABIT_MOBILE_SETTINGS)) { + //use extend here to make sure we keep object reference in other angular controllers + _.extend(settings, JSON.parse(localStorage.getItem(HABIT_MOBILE_SETTINGS))); + + //if settings were saved while fetch was in process reset the flag. + settings.fetching = false; + //create and load if not + } else { + localStorage.setItem(HABIT_MOBILE_SETTINGS, JSON.stringify(defaultSettings)); + _.extend(settings, defaultSettings); + } + + //If user does not have ApiID that forward him to settings. + if (!settings.auth.apiId || !settings.auth.apiToken) { + $location.path("/login"); + } else { + userServices.authenticate(settings.auth.apiId, settings.auth.apiToken) + } + + fetch() + + //first we populate user with schema + _.extend(user, schema); + + //than we try to load localStorage + if (localStorage.getItem(STORAGE_ID)) { + _.extend(user, JSON.parse(localStorage.getItem(STORAGE_ID))); + } + + return userServices; + +}); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/vendor/cdv-plugin-fb-connect.js b/archive/litenull_rewrite/app/scripts/vendor/cdv-plugin-fb-connect.js new file mode 100755 index 0000000000..14b2cd21c0 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/vendor/cdv-plugin-fb-connect.js @@ -0,0 +1,58 @@ +CDV = ( typeof CDV == 'undefined' ? {} : CDV ); +var cordova = window.cordova || window.Cordova; +CDV.FB = { + init: function(apiKey, fail) { + // create the fb-root element if it doesn't exist + if (!document.getElementById('fb-root')) { + var elem = document.createElement('div'); + elem.id = 'fb-root'; + document.body.appendChild(elem); + } + cordova.exec(function() { + var authResponse = JSON.parse(localStorage.getItem('cdv_fb_session') || '{"expiresIn":0}'); + if (authResponse && authResponse.expirationTime) { + var nowTime = (new Date()).getTime(); + if (authResponse.expirationTime > nowTime) { + // Update expires in information + updatedExpiresIn = Math.floor((authResponse.expirationTime - nowTime) / 1000); + authResponse.expiresIn = updatedExpiresIn; + + localStorage.setItem('cdv_fb_session', JSON.stringify(authResponse)); + FB.Auth.setAuthResponse(authResponse, 'connected'); + } + } + console.log('Cordova Facebook Connect plugin initialized successfully.'); + }, (fail?fail:null), 'org.apache.cordova.facebook.Connect', 'init', [apiKey]); + }, + login: function(params, cb, fail) { + params = params || { scope: '' }; + cordova.exec(function(e) { // login + if (e.authResponse && e.authResponse.expiresIn) { + var expirationTime = e.authResponse.expiresIn === 0 + ? 0 + : (new Date()).getTime() + e.authResponse.expiresIn * 1000; + e.authResponse.expirationTime = expirationTime; + } + localStorage.setItem('cdv_fb_session', JSON.stringify(e.authResponse)); + FB.Auth.setAuthResponse(e.authResponse, 'connected'); + if (cb) cb(e); + }, (fail?fail:null), 'org.apache.cordova.facebook.Connect', 'login', params.scope.split(',') ); + }, + logout: function(cb, fail) { + cordova.exec(function(e) { + localStorage.removeItem('cdv_fb_session'); + FB.Auth.setAuthResponse(null, 'notConnected'); + if (cb) cb(e); + }, (fail?fail:null), 'org.apache.cordova.facebook.Connect', 'logout', []); + }, + getLoginStatus: function(cb, fail) { + cordova.exec(function(e) { + if (cb) cb(e); + }, (fail?fail:null), 'org.apache.cordova.facebook.Connect', 'getLoginStatus', []); + }, + dialog: function(params, cb, fail) { + cordova.exec(function(e) { // login + if (cb) cb(e); + }, (fail?fail:null), 'org.apache.cordova.facebook.Connect', 'showDialog', [params] ); + } +}; diff --git a/archive/litenull_rewrite/app/scripts/vendor/cordova-2.4.0.js b/archive/litenull_rewrite/app/scripts/vendor/cordova-2.4.0.js new file mode 100755 index 0000000000..bc15819c83 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/vendor/cordova-2.4.0.js @@ -0,0 +1,6028 @@ +// Platform: ios + +// commit ac725f6ae0bd655789771e2a40b8d60cb4c8c221 + +// File generated at :: Tue Feb 05 2013 05:30:42 GMT+0100 (CET) + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +;(function() { + +// file: lib/scripts/require.js + +var require, + define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + + function build(module) { + var factory = module.factory; + module.exports = {}; + delete module.factory; + factory(require, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); + +/** + * Listen for DOMContentLoaded and notify our channel subscribers. + */ +document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); +}, false); +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +if(typeof window.console === "undefined") { + window.console = { + log:function(){} + }; +} + +var cordova = { + define:define, + require:require, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, args.message, args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, args.message, args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, message, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success(message); + } else if (!success) { + callback.fail && callback.fail(message); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +module.exports = cordova; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running jake test. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +module.exports = { + buildIntoButDoNotClobber: function(objects, target) { + include(target, objects, false, false); + }, + buildIntoAndClobber: function(objects, target) { + include(target, objects, true, false); + }, + buildIntoAndMerge: function(objects, target) { + include(target, objects, true, true); + }, + recursiveMerge: recursiveMerge, + assignOrWrapInDeprecateGetter: assignOrWrapInDeprecateGetter +}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onCordovaInfoReady* Internal event fired when device properties are available. + * onCordovaConnectionReady* Internal event fired when the connection property has been set. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative messages. + isInContextOfEvalJs = 0; + +function createExecIframe() { + var iframe = document.createElement("iframe"); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + return iframe; +} + +function shouldBundleCommandJson() { + if (bridgeMode == jsToNativeModes.XHR_WITH_PAYLOAD) { + return true; + } + if (bridgeMode == jsToNativeModes.XHR_OPTIONAL_PAYLOAD) { + var payloadLength = 0; + for (var i = 0; i < commandQueue.length; ++i) { + payloadLength += commandQueue[i].length; + } + // The value here was determined using the benchmark within CordovaLibApp on an iPad 3. + return payloadLength < 4500; + } + return false; +} + +function massageArgsJsToNative(args) { + var encodeArrayBufferAs8bitString = function(ab) { + return String.fromCharCode.apply(null, new Uint8Array(ab)); + }; + var encodeArrayBufferAsBase64 = function(ab) { + return window.btoa(encodeArrayBufferAs8bitString(ab)); + }; + args.forEach(function(arg, i) { + if (utils.typeName(arg) == 'ArrayBuffer') { + args[i] = { + 'CDVType': 'ArrayBuffer', + 'data': encodeArrayBufferAsBase64(arg) + }; + } + }); + return args; +} + +function massagePayloadNativeToJs(payload) { + if (payload && payload.hasOwnProperty('CDVType') && payload.CDVType == 'ArrayBuffer') { + var stringToArrayBuffer = function(str) { + var ret = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + ret[i] = str.charCodeAt(i); + } + return ret.buffer; + }; + var base64ToArrayBuffer = function(b64) { + return stringToArrayBuffer(atob(b64)); + }; + payload = base64ToArrayBuffer(payload.data); + } + return payload; +} + +function iOSExec() { + // XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices. + // XHR mode's main advantage is working around a bug in -webkit-scroll, which + // doesn't exist in 4.X devices anyways. + if (bridgeMode === undefined) { + bridgeMode = navigator.userAgent.indexOf(' 4_') == -1 ? jsToNativeModes.XHR_NO_PAYLOAD : jsToNativeModes.IFRAME_NAV; + } + + var successCallback, failCallback, service, action, actionArgs, splitCommand; + var callbackId = null; + if (typeof arguments[0] !== "string") { + // FORMAT ONE + successCallback = arguments[0]; + failCallback = arguments[1]; + service = arguments[2]; + action = arguments[3]; + actionArgs = arguments[4]; + + // Since we need to maintain backwards compatibility, we have to pass + // an invalid callbackId even if no callback was provided since plugins + // will be expecting it. The Cordova.exec() implementation allocates + // an invalid callbackId and passes it even if no callbacks were given. + callbackId = 'INVALID'; + } else { + // FORMAT TWO + splitCommand = arguments[0].split("."); + action = splitCommand.pop(); + service = splitCommand.join("."); + actionArgs = Array.prototype.splice.call(arguments, 1); + } + + // Register the callbacks and add the callbackId to the positional + // arguments if given. + if (successCallback || failCallback) { + callbackId = service + cordova.callbackId++; + cordova.callbacks[callbackId] = + {success:successCallback, fail:failCallback}; + } + + actionArgs = massageArgsJsToNative(actionArgs); + + var command = [callbackId, service, action, actionArgs]; + + // Stringify and queue the command. We stringify to command now to + // effectively clone the command arguments in case they are mutated before + // the command is executed. + commandQueue.push(JSON.stringify(command)); + + // If we're in the context of a stringByEvaluatingJavaScriptFromString call, + // then the queue will be flushed when it returns; no need for a poke. + // Also, if there is already a command in the queue, then we've already + // poked the native side, so there is no reason to do so again. + if (!isInContextOfEvalJs && commandQueue.length == 1) { + if (bridgeMode != jsToNativeModes.IFRAME_NAV) { + // This prevents sending an XHR when there is already one being sent. + // This should happen only in rare circumstances (refer to unit tests). + if (execXhr && execXhr.readyState != 4) { + execXhr = null; + } + // Re-using the XHR improves exec() performance by about 10%. + execXhr = execXhr || new XMLHttpRequest(); + // Changing this to a GET will make the XHR reach the URIProtocol on 4.2. + // For some reason it still doesn't work though... + // Add a timestamp to the query param to prevent caching. + execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true); + if (!vcHeaderValue) { + vcHeaderValue = /.*\((.*)\)/.exec(navigator.userAgent)[1]; + } + execXhr.setRequestHeader('vc', vcHeaderValue); + execXhr.setRequestHeader('rc', ++requestCount); + if (shouldBundleCommandJson()) { + execXhr.setRequestHeader('cmds', iOSExec.nativeFetchMessages()); + } + execXhr.send(null); + } else { + execIframe = execIframe || createExecIframe(); + execIframe.src = "gap://ready"; + } + } +} + +iOSExec.jsToNativeModes = jsToNativeModes; + +iOSExec.setJsToNativeBridgeMode = function(mode) { + // Remove the iFrame since it may be no longer required, and its existence + // can trigger browser bugs. + // https://issues.apache.org/jira/browse/CB-593 + if (execIframe) { + execIframe.parentNode.removeChild(execIframe); + execIframe = null; + } + bridgeMode = mode; +}; + +iOSExec.nativeFetchMessages = function() { + // Each entry in commandQueue is a JSON string already. + if (!commandQueue.length) { + return ''; + } + var json = '[' + commandQueue.join(',') + ']'; + commandQueue.length = 0; + return json; +}; + +iOSExec.nativeCallback = function(callbackId, status, payload, keepCallback) { + return iOSExec.nativeEvalAndFetch(function() { + var success = status === 0 || status === 1; + payload = massagePayloadNativeToJs(payload); + cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); + }); +}; + +iOSExec.nativeEvalAndFetch = function(func) { + // This shouldn't be nested, but better to be safe. + isInContextOfEvalJs++; + try { + func(); + return iOSExec.nativeFetchMessages(); + } finally { + isInContextOfEvalJs--; + } +}; + +module.exports = iOSExec; + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur[part] = cur[part] || {}; + } + return cur[parts[i-1]]; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var module = require(moduleName); + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (target) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.loadMatchingModules = function(matchingRegExp) { + for (var k in moduleMap) { + if (matchingRegExp.exec(k)) { + require(k); + } + } +}; + +exports.reset(); + + +}); + +// file: lib/ios/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: "ios", + initialize:function() { + var modulemapper = require('cordova/modulemapper'); + + modulemapper.loadMatchingModules(/cordova.*\/symbols$/); + modulemapper.mapModules(window); + }, + clobbers: { + MediaError: { // exists natively, override + path: "cordova/plugin/MediaError" + }, + console: { + path: 'cordova/plugin/ios/console' + }, + open : { + path: 'cordova/plugin/InAppBrowser' + } + }, + merges:{ + Contact:{ + path: "cordova/plugin/ios/Contact" + }, + navigator:{ + children:{ + notification:{ + path:"cordova/plugin/ios/notification" + }, + contacts:{ + path:"cordova/plugin/ios/contacts" + }, + geolocation: { + path: 'cordova/plugin/geolocation' + } + } + } + } +}; + +// use the native logger +var logger = require("cordova/plugin/logger"); +logger.useConsole(false); + +}); + +// file: lib/common/plugin/Acceleration.js +define("cordova/plugin/Acceleration", function(require, exports, module) { + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); + +// file: lib/common/plugin/Camera.js +define("cordova/plugin/Camera", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('cordova/plugin/CameraConstants'); + +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=FILE_URI. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); +}; + +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); + +// file: lib/common/plugin/CameraConstants.js +define("cordova/plugin/CameraConstants", function(require, exports, module) { + +module.exports = { + DestinationType:{ + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) + NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) + }, + EncodingType:{ + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image + }, + MediaType:{ + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types + }, + PictureSourceType:{ + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) + }, + PopoverArrowDirection:{ + ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + } +}; + +}); + +// file: lib/common/plugin/CameraPopoverOptions.js +define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { + +var Camera = require('cordova/plugin/CameraConstants'); + +/** + * Encapsulates options for iOS Popover image picker + */ +var CameraPopoverOptions = function(x,y,width,height,arrowDir){ + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + // The direction of the popover arrow + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); + +// file: lib/common/plugin/CaptureAudioOptions.js +define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { + +/** + * Encapsulates all audio capture operation configuration options. + */ +var CaptureAudioOptions = function(){ + // Upper limit of sound clips user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single sound clip in seconds. + this.duration = 0; + // The selected audio mode. Must match with one of the elements in supportedAudioModes array. + this.mode = null; +}; + +module.exports = CaptureAudioOptions; + +}); + +// file: lib/common/plugin/CaptureError.js +define("cordova/plugin/CaptureError", function(require, exports, module) { + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +var CaptureError = function(c) { + this.code = c || null; +}; + +// Camera or microphone failed to capture image or sound. +CaptureError.CAPTURE_INTERNAL_ERR = 0; +// Camera application or audio capture application is currently serving other capture request. +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +// Invalid use of the API (e.g. limit parameter has value less than one). +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +// User exited camera application or audio capture application before capturing anything. +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +// The requested capture operation is not supported. +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +module.exports = CaptureError; + +}); + +// file: lib/common/plugin/CaptureImageOptions.js +define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { + +/** + * Encapsulates all image capture operation configuration options. + */ +var CaptureImageOptions = function(){ + // Upper limit of images user can take. Value must be equal or greater than 1. + this.limit = 1; + // The selected image mode. Must match with one of the elements in supportedImageModes array. + this.mode = null; +}; + +module.exports = CaptureImageOptions; + +}); + +// file: lib/common/plugin/CaptureVideoOptions.js +define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { + +/** + * Encapsulates all video capture operation configuration options. + */ +var CaptureVideoOptions = function(){ + // Upper limit of videos user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single video clip in seconds. + this.duration = 0; + // The selected video mode. Must match with one of the elements in supportedVideoModes array. + this.mode = null; +}; + +module.exports = CaptureVideoOptions; + +}); + +// file: lib/common/plugin/CompassError.js +define("cordova/plugin/CompassError", function(require, exports, module) { + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); + +// file: lib/common/plugin/CompassHeading.js +define("cordova/plugin/CompassHeading", function(require, exports, module) { + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading || null; + this.trueHeading = trueHeading || null; + this.headingAccuracy = headingAccuracy || null; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); + +// file: lib/common/plugin/ConfigurationData.js +define("cordova/plugin/ConfigurationData", function(require, exports, module) { + +/** + * Encapsulates a set of parameters that the capture device supports. + */ +function ConfigurationData() { + // The ASCII-encoded string in lower case representing the media type. + this.type = null; + // The height attribute represents height of the image or video in pixels. + // In the case of a sound clip this attribute has value 0. + this.height = 0; + // The width attribute represents width of the image or video in pixels. + // In the case of a sound clip this attribute has value 0 + this.width = 0; +} + +module.exports = ConfigurationData; + +}); + +// file: lib/common/plugin/Connection.js +define("cordova/plugin/Connection", function(require, exports, module) { + +/** + * Network status + */ +module.exports = { + UNKNOWN: "unknown", + ETHERNET: "ethernet", + WIFI: "wifi", + CELL_2G: "2g", + CELL_3G: "3g", + CELL_4G: "4g", + CELL:"cellular", + NONE: "none" +}; + +}); + +// file: lib/common/plugin/Contact.js +define("cordova/plugin/Contact", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('cordova/plugin/contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); + +// file: lib/common/plugin/ContactAddress.js +define("cordova/plugin/ContactAddress", function(require, exports, module) { + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); + +// file: lib/common/plugin/ContactError.js +define("cordova/plugin/ContactError", function(require, exports, module) { + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); + +// file: lib/common/plugin/ContactField.js +define("cordova/plugin/ContactField", function(require, exports, module) { + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); + +// file: lib/common/plugin/ContactFindOptions.js +define("cordova/plugin/ContactFindOptions", function(require, exports, module) { + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; + +}); + +// file: lib/common/plugin/ContactName.js +define("cordova/plugin/ContactName", function(require, exports, module) { + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); + +// file: lib/common/plugin/ContactOrganization.js +define("cordova/plugin/ContactOrganization", function(require, exports, module) { + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); + +// file: lib/common/plugin/Coordinates.js +define("cordova/plugin/Coordinates", function(require, exports, module) { + +/** + * This class contains position information. + * @param {Object} lat + * @param {Object} lng + * @param {Object} alt + * @param {Object} acc + * @param {Object} head + * @param {Object} vel + * @param {Object} altacc + * @constructor + */ +var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { + /** + * The latitude of the position. + */ + this.latitude = lat; + /** + * The longitude of the position, + */ + this.longitude = lng; + /** + * The accuracy of the position. + */ + this.accuracy = acc; + /** + * The altitude of the position. + */ + this.altitude = (alt !== undefined ? alt : null); + /** + * The direction the device is moving at the position. + */ + this.heading = (head !== undefined ? head : null); + /** + * The velocity with which the device is moving at the position. + */ + this.speed = (vel !== undefined ? vel : null); + + if (this.speed === 0 || this.speed === null) { + this.heading = NaN; + } + + /** + * The altitude accuracy of the position. + */ + this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; +}; + +module.exports = Coordinates; + +}); + +// file: lib/common/plugin/DirectoryEntry.js +define("cordova/plugin/DirectoryEntry", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileError = require('cordova/plugin/FileError'), + DirectoryReader = require('cordova/plugin/DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath) { + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var win = successCallback && function(result) { + var FileEntry = require('cordova/plugin/FileEntry'); + var entry = new FileEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.fullPath, path, options]); +}; + +module.exports = DirectoryEntry; + +}); + +// file: lib/common/plugin/DirectoryReader.js +define("cordova/plugin/DirectoryReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(path) { + this.path = path || null; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i= 2) { + if (end < 0) { + newEnd = Math.max(size + end, 0); + } else { + newEnd = Math.min(end, size); + } + } + + var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); + newFile.start = this.start + newStart; + newFile.end = this.start + newEnd; + return newFile; +}; + + +module.exports = File; + +}); + +// file: lib/common/plugin/FileEntry.js +define("cordova/plugin/FileEntry", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileWriter = require('cordova/plugin/FileWriter'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'); + +/** + * An interface representing a file on the file system. + * + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the file resides (readonly) + */ +var FileEntry = function(name, fullPath) { + FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); +}; + +utils.extend(FileEntry, Entry); + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.fileName === null || writer.fileName === "") { + errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); + } else { + successCallback && successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + var win = successCallback && function(f) { + var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); + successCallback(file); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFileMetadata", [this.fullPath]); +}; + + +module.exports = FileEntry; + +}); + +// file: lib/common/plugin/FileError.js +define("cordova/plugin/FileError", function(require, exports, module) { + +/** + * FileError + */ +function FileError(error) { + this.code = error || null; +} + +// File error codes +// Found in DOMException +FileError.NOT_FOUND_ERR = 1; +FileError.SECURITY_ERR = 2; +FileError.ABORT_ERR = 3; + +// Added by File API specification +FileError.NOT_READABLE_ERR = 4; +FileError.ENCODING_ERR = 5; +FileError.NO_MODIFICATION_ALLOWED_ERR = 6; +FileError.INVALID_STATE_ERR = 7; +FileError.SYNTAX_ERR = 8; +FileError.INVALID_MODIFICATION_ERR = 9; +FileError.QUOTA_EXCEEDED_ERR = 10; +FileError.TYPE_MISMATCH_ERR = 11; +FileError.PATH_EXISTS_ERR = 12; + +module.exports = FileError; + +}); + +// file: lib/common/plugin/FileReader.js +define("cordova/plugin/FileReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'), + utils = require('cordova/utils'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'), + origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); + +/** + * This class reads the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To read from the SD card, the file name is "sdcard/my_file.txt" + * @constructor + */ +var FileReader = function() { + this._readyState = 0; + this._error = null; + this._result = null; + this._fileName = ''; + this._realReader = origFileReader ? new origFileReader() : {}; +}; + +// States +FileReader.EMPTY = 0; +FileReader.LOADING = 1; +FileReader.DONE = 2; + +utils.defineGetter(FileReader.prototype, 'readyState', function() { + return this._fileName ? this._readyState : this._realReader.readyState; +}); + +utils.defineGetter(FileReader.prototype, 'error', function() { + return this._fileName ? this._error: this._realReader.error; +}); + +utils.defineGetter(FileReader.prototype, 'result', function() { + return this._fileName ? this._result: this._realReader.result; +}); + +function defineEvent(eventName) { + utils.defineGetterSetter(FileReader.prototype, eventName, function() { + return this._realReader[eventName] || null; + }, function(value) { + this._realReader[eventName] = value; + }); +} +defineEvent('onloadstart'); // When the read starts. +defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) +defineEvent('onload'); // When the read has successfully completed. +defineEvent('onerror'); // When the read has failed (see errors). +defineEvent('onloadend'); // When the request has completed (either in success or failure). +defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. + +function initRead(reader, file) { + // Already loading something + if (reader.readyState == FileReader.LOADING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + reader._result = null; + reader._error = null; + reader._readyState = FileReader.LOADING; + + if (typeof file == 'string') { + // Deprecated in Cordova 2.4. + console.warning('Using a string argument with FileReader.readAs functions is deprecated.'); + reader._fileName = file; + } else if (typeof file.fullPath == 'string') { + reader._fileName = file.fullPath; + } else { + reader._fileName = ''; + return true; + } + + reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); +} + +/** + * Abort reading file. + */ +FileReader.prototype.abort = function() { + if (origFileReader && !this._fileName) { + return this._realReader.abort(); + } + this._result = null; + + if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { + return; + } + + this._readyState = FileReader.DONE; + + // If abort callback + if (typeof this.onabort === 'function') { + this.onabort(new ProgressEvent('abort', {target:this})); + } + // If load end callback + if (typeof this.onloadend === 'function') { + this.onloadend(new ProgressEvent('loadend', {target:this})); + } +}; + +/** + * Read text file. + * + * @param file {File} File object containing file properties + * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) + */ +FileReader.prototype.readAsText = function(file, encoding) { + if (initRead(this, file)) { + return this._realReader.readAsText(file, encoding); + } + + // Default encoding is UTF-8 + var enc = encoding ? encoding : "UTF-8"; + var me = this; + var execArgs = [this._fileName, enc]; + + // Maybe add slice parameters. + if (file.end < file.size) { + execArgs.push(file.start, file.end); + } else if (file.start > 0) { + execArgs.push(file.start); + } + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // DONE state + me._readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // null result + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsText", execArgs); +}; + + +/** + * Read file and return data as a base64 encoded data url. + * A data url is of the form: + * data:[][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsDataURL(file); + } + + var me = this; + var execArgs = [this._fileName]; + + // Maybe add slice parameters. + if (file.end < file.size) { + execArgs.push(file.start, file.end); + } else if (file.start > 0) { + execArgs.push(file.start); + } + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsDataURL", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsBinaryString(file); + } + // TODO - Can't return binary data to browser. + console.log('method "readAsBinaryString" is not supported at this time.'); + this.abort(); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsArrayBuffer(file); + } + // TODO - Can't return binary data to browser. + console.log('This method is not supported at this time.'); + this.abort(); +}; + +module.exports = FileReader; + +}); + +// file: lib/common/plugin/FileSystem.js +define("cordova/plugin/FileSystem", function(require, exports, module) { + +var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function(name, root) { + this.name = name || null; + if (root) { + this.root = new DirectoryEntry(root.name, root.fullPath); + } +}; + +module.exports = FileSystem; + +}); + +// file: lib/common/plugin/FileTransfer.js +define("cordova/plugin/FileTransfer", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('cordova/plugin/FileTransferError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + successCallback && successCallback(result); + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova/plugin/DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova/plugin/FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id]); +}; + +/** + * Aborts the ongoing file transfer on this object + * @param successCallback {Function} Callback to be invoked upon success + * @param errorCallback {Function} Callback to be invoked upon error + */ +FileTransfer.prototype.abort = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); + +// file: lib/common/plugin/FileTransferError.js +define("cordova/plugin/FileTransferError", function(require, exports, module) { + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; + +module.exports = FileTransferError; + +}); + +// file: lib/common/plugin/FileUploadOptions.js +define("cordova/plugin/FileUploadOptions", function(require, exports, module) { + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + * @param headers {Object} Keys are header names, values are header values. Multiple + * headers of the same name are not supported. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; + this.headers = headers || null; +}; + +module.exports = FileUploadOptions; + +}); + +// file: lib/common/plugin/FileUploadResult.js +define("cordova/plugin/FileUploadResult", function(require, exports, module) { + +/** + * FileUploadResult + * @constructor + */ +var FileUploadResult = function() { + this.bytesSent = 0; + this.responseCode = null; + this.response = null; +}; + +module.exports = FileUploadResult; + +}); + +// file: lib/common/plugin/FileWriter.js +define("cordova/plugin/FileWriter", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // set error + this.error = new FileError(FileError.ABORT_ERR); + + this.readyState = FileWriter.DONE; + + // If abort callback + if (typeof this.onabort === "function") { + this.onabort(new ProgressEvent("abort", {"target":this})); + } + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend(new ProgressEvent("writeend", {"target":this})); + } +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [this.fileName, text, this.position]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + if (!offset && offset !== 0) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger than file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":this})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "truncate", [this.fileName, size]); +}; + +module.exports = FileWriter; + +}); + +// file: lib/common/plugin/Flags.js +define("cordova/plugin/Flags", function(require, exports, module) { + +/** + * Supplies arguments to methods that lookup or create files and directories. + * + * @param create + * {boolean} file or directory if it doesn't exist + * @param exclusive + * {boolean} used with create; if true the command will fail if + * target path exists + */ +function Flags(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +} + +module.exports = Flags; + +}); + +// file: lib/common/plugin/GlobalizationError.js +define("cordova/plugin/GlobalizationError", function(require, exports, module) { + + +/** + * Globalization error object + * + * @constructor + * @param code + * @param message + */ +var GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +// Globalization error codes +GlobalizationError.UNKNOWN_ERROR = 0; +GlobalizationError.FORMATTING_ERROR = 1; +GlobalizationError.PARSING_ERROR = 2; +GlobalizationError.PATTERN_ERROR = 3; + +module.exports = GlobalizationError; + +}); + +// file: lib/common/plugin/InAppBrowser.js +define("cordova/plugin/InAppBrowser", function(require, exports, module) { + +var exec = require('cordova/exec'); +var channel = require('cordova/channel'); + +function InAppBrowser() { + this.channels = { + 'loadstart': channel.create('loadstart'), + 'loadstop' : channel.create('loadstop'), + 'exit' : channel.create('exit') + }; +} + +InAppBrowser.prototype = { + _eventHandler: function (event) { + if (event.type in this.channels) { + this.channels[event.type].fire(event); + } + }, + close: function (eventname) { + exec(null, null, "InAppBrowser", "close", []); + }, + addEventListener: function (eventname,f) { + if (eventname in this.channels) { + this.channels[eventname].subscribe(f); + } + }, + removeEventListener: function(eventname, f) { + if (eventname in this.channels) { + this.channels[eventname].unsubscribe(f); + } + } +}; + +module.exports = function(strUrl, strWindowName, strWindowFeatures) { + var iab = new InAppBrowser(); + var cb = function(eventname) { + iab._eventHandler(eventname); + }; + exec(cb, null, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); + return iab; +}; + +//Export the original open so it can be used if needed +module.exports._orig = window.open; + +}); + +// file: lib/common/plugin/LocalFileSystem.js +define("cordova/plugin/LocalFileSystem", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Represents a local file system. + */ +var LocalFileSystem = function() { + +}; + +LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence +LocalFileSystem.PERSISTENT = 1; //persistent + +module.exports = LocalFileSystem; + +}); + +// file: lib/common/plugin/Media.js +define("cordova/plugin/Media", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +var mediaObjects = {}; + +/** + * This class provides access to the device media, interfaces to both sound and video + * + * @constructor + * @param src The file name or url to play + * @param successCallback The callback to be called when the file is done playing or recording. + * successCallback() + * @param errorCallback The callback to be called if there is an error. + * errorCallback(int errorCode) - OPTIONAL + * @param statusCallback The callback to be called when media status has changed. + * statusCallback(int statusCode) - OPTIONAL + */ +var Media = function(src, successCallback, errorCallback, statusCallback) { + argscheck.checkArgs('SFFF', 'Media', arguments); + this.id = utils.createUUID(); + mediaObjects[this.id] = this; + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.statusCallback = statusCallback; + this._duration = -1; + this._position = -1; + exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); +}; + +// Media messages +Media.MEDIA_STATE = 1; +Media.MEDIA_DURATION = 2; +Media.MEDIA_POSITION = 3; +Media.MEDIA_ERROR = 9; + +// Media states +Media.MEDIA_NONE = 0; +Media.MEDIA_STARTING = 1; +Media.MEDIA_RUNNING = 2; +Media.MEDIA_PAUSED = 3; +Media.MEDIA_STOPPED = 4; +Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; + +// "static" function to return existing objs. +Media.get = function(id) { + return mediaObjects[id]; +}; + +/** + * Start or resume playing audio file. + */ +Media.prototype.play = function(options) { + exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); +}; + +/** + * Stop playing audio file. + */ +Media.prototype.stop = function() { + var me = this; + exec(function() { + me._position = 0; + }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); +}; + +/** + * Seek or jump to a new time in the track.. + */ +Media.prototype.seekTo = function(milliseconds) { + var me = this; + exec(function(p) { + me._position = p; + }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); +}; + +/** + * Pause playing audio file. + */ +Media.prototype.pause = function() { + exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); +}; + +/** + * Get duration of an audio file. + * The duration is only set for audio that is playing, paused or stopped. + * + * @return duration or -1 if not known. + */ +Media.prototype.getDuration = function() { + return this._duration; +}; + +/** + * Get position of audio. + */ +Media.prototype.getCurrentPosition = function(success, fail) { + var me = this; + exec(function(p) { + me._position = p; + success(p); + }, fail, "Media", "getCurrentPositionAudio", [this.id]); +}; + +/** + * Start recording audio file. + */ +Media.prototype.startRecord = function() { + exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); +}; + +/** + * Stop recording audio file. + */ +Media.prototype.stopRecord = function() { + exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); +}; + +/** + * Release the resources. + */ +Media.prototype.release = function() { + exec(null, this.errorCallback, "Media", "release", [this.id]); +}; + +/** + * Adjust the volume. + */ +Media.prototype.setVolume = function(volume) { + exec(null, null, "Media", "setVolume", [this.id, volume]); +}; + +/** + * Audio has status update. + * PRIVATE + * + * @param id The media object id (string) + * @param msgType The 'type' of update this is + * @param value Use of value is determined by the msgType + */ +Media.onStatus = function(id, msgType, value) { + + var media = mediaObjects[id]; + + if(media) { + switch(msgType) { + case Media.MEDIA_STATE : + media.statusCallback && media.statusCallback(value); + if(value == Media.MEDIA_STOPPED) { + media.successCallback && media.successCallback(); + } + break; + case Media.MEDIA_DURATION : + media._duration = value; + break; + case Media.MEDIA_ERROR : + media.errorCallback && media.errorCallback(value); + break; + case Media.MEDIA_POSITION : + media._position = Number(value); + break; + default : + console.error && console.error("Unhandled Media.onStatus :: " + msgType); + break; + } + } + else { + console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); + } + +}; + +module.exports = Media; + +}); + +// file: lib/common/plugin/MediaError.js +define("cordova/plugin/MediaError", function(require, exports, module) { + +/** + * This class contains information about any Media errors. +*/ +/* + According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror + We should never be creating these objects, we should just implement the interface + which has 1 property for an instance, 'code' + + instead of doing : + errorCallbackFunction( new MediaError(3,'msg') ); +we should simply use a literal : + errorCallbackFunction( {'code':3} ); + */ + + var _MediaError = window.MediaError; + + +if(!_MediaError) { + window.MediaError = _MediaError = function(code, msg) { + this.code = (typeof code != 'undefined') ? code : null; + this.message = msg || ""; // message is NON-standard! do not use! + }; +} + +_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; +_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; +_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; +_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; +_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; +// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. +// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes +_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; + +module.exports = _MediaError; + +}); + +// file: lib/common/plugin/MediaFile.js +define("cordova/plugin/MediaFile", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + File = require('cordova/plugin/File'), + CaptureError = require('cordova/plugin/CaptureError'); +/** + * Represents a single file. + * + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ +var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ + MediaFile.__super__.constructor.apply(this, arguments); +}; + +utils.extend(MediaFile, File); + +/** + * Request capture format data for a specific file and type + * + * @param {Function} successCB + * @param {Function} errorCB + */ +MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { + if (typeof this.fullPath === "undefined" || this.fullPath === null) { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } else { + exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); + } +}; + +module.exports = MediaFile; + +}); + +// file: lib/common/plugin/MediaFileData.js +define("cordova/plugin/MediaFileData", function(require, exports, module) { + +/** + * MediaFileData encapsulates format information of a media file. + * + * @param {DOMString} codecs + * @param {long} bitrate + * @param {long} height + * @param {long} width + * @param {float} duration + */ +var MediaFileData = function(codecs, bitrate, height, width, duration){ + this.codecs = codecs || null; + this.bitrate = bitrate || 0; + this.height = height || 0; + this.width = width || 0; + this.duration = duration || 0; +}; + +module.exports = MediaFileData; + +}); + +// file: lib/common/plugin/Metadata.js +define("cordova/plugin/Metadata", function(require, exports, module) { + +/** + * Information about the state of the file or directory + * + * {Date} modificationTime (readonly) + */ +var Metadata = function(time) { + this.modificationTime = (typeof time != 'undefined'?new Date(time):null); +}; + +module.exports = Metadata; + +}); + +// file: lib/common/plugin/Position.js +define("cordova/plugin/Position", function(require, exports, module) { + +var Coordinates = require('cordova/plugin/Coordinates'); + +var Position = function(coords, timestamp) { + if (coords) { + this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); + } else { + this.coords = new Coordinates(); + } + this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); +}; + +module.exports = Position; + +}); + +// file: lib/common/plugin/PositionError.js +define("cordova/plugin/PositionError", function(require, exports, module) { + +/** + * Position error object + * + * @constructor + * @param code + * @param message + */ +var PositionError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; + +module.exports = PositionError; + +}); + +// file: lib/common/plugin/ProgressEvent.js +define("cordova/plugin/ProgressEvent", function(require, exports, module) { + +// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill +// Feature test: See if we can instantiate a native ProgressEvent; +// if so, use that approach, +// otherwise fill-in with our own implementation. +// +// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. +var ProgressEvent = (function() { + /* + var createEvent = function(data) { + var event = document.createEvent('Events'); + event.initEvent('ProgressEvent', false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + if (data.target) { + // TODO: cannot call .dispatchEvent + // need to first figure out how to implement EventTarget + } + } + return event; + }; + try { + var ev = createEvent({type:"abort",target:document}); + return function ProgressEvent(type, data) { + data.type = type; + return createEvent(data); + }; + } catch(e){ + */ + return function ProgressEvent(type, dict) { + this.type = type; + this.bubbles = false; + this.cancelBubble = false; + this.cancelable = false; + this.lengthComputable = false; + this.loaded = dict && dict.loaded ? dict.loaded : 0; + this.total = dict && dict.total ? dict.total : 0; + this.target = dict && dict.target ? dict.target : null; + }; + //} +})(); + +module.exports = ProgressEvent; + +}); + +// file: lib/common/plugin/accelerometer.js +define("cordova/plugin/accelerometer", function(require, exports, module) { + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + var p; + var win = function(a) { + removeListeners(p); + successCallback(a); + }; + var fail = function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function(){}, function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners:p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + } + } +}; + +module.exports = accelerometer; + +}); + +// file: lib/common/plugin/battery.js +define("cordova/plugin/battery", function(require, exports, module) { + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = battery; + var level = info.level; + if (me._level !== level || me._isPlugged !== info.isPlugged) { + // Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + // Fire low battery event + if (level === 20 || level === 5) { + if (level === 20) { + cordova.fireWindowEvent("batterylow", info); + } + else { + cordova.fireWindowEvent("batterycritical", info); + } + } + } + me._level = level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); + +module.exports = battery; + +}); + +// file: lib/common/plugin/capture.js +define("cordova/plugin/capture", function(require, exports, module) { + +var exec = require('cordova/exec'), + MediaFile = require('cordova/plugin/MediaFile'); + +/** + * Launches a capture of different types. + * + * @param (DOMString} type + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +function _capture(type, successCallback, errorCallback, options) { + var win = function(pluginResult) { + var mediaFiles = []; + var i; + for (i = 0; i < pluginResult.length; i++) { + var mediaFile = new MediaFile(); + mediaFile.name = pluginResult[i].name; + mediaFile.fullPath = pluginResult[i].fullPath; + mediaFile.type = pluginResult[i].type; + mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; + mediaFile.size = pluginResult[i].size; + mediaFiles.push(mediaFile); + } + successCallback(mediaFiles); + }; + exec(win, errorCallback, "Capture", type, [options]); +} +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +} + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ + _capture("captureAudio", successCallback, errorCallback, options); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options){ + _capture("captureImage", successCallback, errorCallback, options); +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ + _capture("captureVideo", successCallback, errorCallback, options); +}; + + +module.exports = new Capture(); + +}); + +// file: lib/common/plugin/compass.js +define("cordova/plugin/compass", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('cordova/plugin/CompassHeading'), + CompassError = require('cordova/plugin/CompassError'), + timers = {}, + compass = { + /** + * Asynchronously acquires the current heading. + * @param {Function} successCallback The function to call when the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires the heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + } + } + }; + +module.exports = compass; + +}); + +// file: lib/common/plugin/console-via-logger.js +define("cordova/plugin/console-via-logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ + +var logger = require("cordova/plugin/logger"); +var utils = require("cordova/utils"); + +//------------------------------------------------------------------------------ +// object that we're exporting +//------------------------------------------------------------------------------ +var console = module.exports; + +//------------------------------------------------------------------------------ +// copy of the original console object +//------------------------------------------------------------------------------ +var WinConsole = window.console; + +//------------------------------------------------------------------------------ +// whether to use the logger +//------------------------------------------------------------------------------ +var UseLogger = false; + +//------------------------------------------------------------------------------ +// Timers +//------------------------------------------------------------------------------ +var Timers = {}; + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +function noop() {} + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error("console and logger are too intertwingly"); + } + } + + return UseLogger; +}; + +//------------------------------------------------------------------------------ +console.log = function() { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.error = function() { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.warn = function() { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.info = function() { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.debug = function() { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.assert = function(expression) { + if (expression) return; + + var message = utils.vformat(arguments[1], [].slice.call(arguments, 2)); + console.log("ASSERT: " + message); +}; + +//------------------------------------------------------------------------------ +console.clear = function() {}; + +//------------------------------------------------------------------------------ +console.dir = function(object) { + console.log("%o", object); +}; + +//------------------------------------------------------------------------------ +console.dirxml = function(node) { + console.log(node.innerHTML); +}; + +//------------------------------------------------------------------------------ +console.trace = noop; + +//------------------------------------------------------------------------------ +console.group = console.log; + +//------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +//------------------------------------------------------------------------------ +console.groupEnd = noop; + +//------------------------------------------------------------------------------ +console.time = function(name) { + Timers[name] = new Date().valueOf(); +}; + +//------------------------------------------------------------------------------ +console.timeEnd = function(name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn("unknown timer: " + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ": " + timeElapsed + "ms"); +}; + +//------------------------------------------------------------------------------ +console.timeStamp = noop; + +//------------------------------------------------------------------------------ +console.profile = noop; + +//------------------------------------------------------------------------------ +console.profileEnd = noop; + +//------------------------------------------------------------------------------ +console.count = noop; + +//------------------------------------------------------------------------------ +console.exception = console.log; + +//------------------------------------------------------------------------------ +console.table = function(data, columns) { + console.log("%o", data); +}; + +//------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +//------------------------------------------------------------------------------ +function wrappedOrigCall(orgFunc, newFunc) { + return function() { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +//------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +//------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] == "function") { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); + +// file: lib/common/plugin/contacts.js +define("cordova/plugin/contacts", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'), + Contact = require('cordova/plugin/Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); + +// file: lib/common/plugin/device.js +define("cordova/plugin/device", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.name = null; + this.uuid = null; + this.cordova = null; + this.model = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.name = info.name; + me.uuid = info.uuid; + me.cordova = info.cordova; + me.model = info.model; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); + +// file: lib/common/plugin/echo.js +define("cordova/plugin/echo", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. + * @param successCallback invoked with a FileSystem object + * @param errorCallback invoked if error occurs retrieving file system + * @param message The string to be echoed. + * @param forceAsync Whether to force an async return value (for testing native->js bridge). + */ +module.exports = function(successCallback, errorCallback, message, forceAsync) { + var action = forceAsync ? 'echoAsync' : 'echo'; + if (!forceAsync && message.constructor == ArrayBuffer) { + action = 'echoArrayBuffer'; + } + exec(successCallback, errorCallback, "Echo", action, [message]); +}; + + +}); + +// file: lib/ios/plugin/file/symbols.js +define("cordova/plugin/file/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'), + symbolshelper = require('cordova/plugin/file/symbolshelper'); + +symbolshelper(modulemapper.clobbers); +modulemapper.merges('cordova/plugin/ios/Entry', 'Entry'); + +}); + +// file: lib/common/plugin/file/symbolshelper.js +define("cordova/plugin/file/symbolshelper", function(require, exports, module) { + +module.exports = function(exportFunc) { + exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); + exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); + exportFunc('cordova/plugin/Entry', 'Entry'); + exportFunc('cordova/plugin/File', 'File'); + exportFunc('cordova/plugin/FileEntry', 'FileEntry'); + exportFunc('cordova/plugin/FileError', 'FileError'); + exportFunc('cordova/plugin/FileReader', 'FileReader'); + exportFunc('cordova/plugin/FileSystem', 'FileSystem'); + exportFunc('cordova/plugin/FileTransfer', 'FileTransfer'); + exportFunc('cordova/plugin/FileTransferError', 'FileTransferError'); + exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); + exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); + exportFunc('cordova/plugin/FileWriter', 'FileWriter'); + exportFunc('cordova/plugin/Flags', 'Flags'); + exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); + exportFunc('cordova/plugin/Metadata', 'Metadata'); + exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); + exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); +}; + +}); + +// file: lib/common/plugin/geolocation.js +define("cordova/plugin/geolocation", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + PositionError = require('cordova/plugin/PositionError'), + Position = require('cordova/plugin/Position'); + +var timers = {}; // list of timers in use + +// Returns default params, overrides if provided with values +function parseParameters(options) { + var opt = { + maximumAge: 0, + enableHighAccuracy: false, + timeout: Infinity + }; + + if (options) { + if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { + opt.maximumAge = options.maximumAge; + } + if (options.enableHighAccuracy !== undefined) { + opt.enableHighAccuracy = options.enableHighAccuracy; + } + if (options.timeout !== undefined && !isNaN(options.timeout)) { + if (options.timeout < 0) { + opt.timeout = 0; + } else { + opt.timeout = options.timeout; + } + } + } + + return opt; +} + +// Returns a timeout failure, closed over a specified timeout value and error callback. +function createTimeout(errorCallback, timeout) { + var t = setTimeout(function() { + clearTimeout(t); + t = null; + errorCallback({ + code:PositionError.TIMEOUT, + message:"Position retrieval timed out." + }); + }, timeout); + return t; +} + +var geolocation = { + lastPosition:null, // reference to last known (cached) position returned + /** + * Asynchronously acquires the current position. + * + * @param {Function} successCallback The function to call when the position data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) + * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) + */ + getCurrentPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + // Timer var that will fire an error callback if no position is retrieved from native + // before the "timeout" param provided expires + var timeoutTimer = {timer:null}; + + var win = function(p) { + clearTimeout(timeoutTimer.timer); + if (!(timeoutTimer.timer)) { + // Timeout already happened, or native fired error callback for + // this geo request. + // Don't continue with success callback. + return; + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + var fail = function(e) { + clearTimeout(timeoutTimer.timer); + timeoutTimer.timer = null; + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just + // fire the success callback with the cached position. + if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { + successCallback(geolocation.lastPosition); + // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. + } else if (options.timeout === 0) { + fail({ + code:PositionError.TIMEOUT, + message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." + }); + // Otherwise we have to call into native to retrieve a position. + } else { + if (options.timeout !== Infinity) { + // If the timeout value was not set to Infinity (default), then + // set up a timeout function that will fire the error callback + // if no successful position was retrieved before timeout expired. + timeoutTimer.timer = createTimeout(fail, options.timeout); + } else { + // This is here so the check in the win function doesn't mess stuff up + // may seem weird but this guarantees timeoutTimer is + // always truthy before we call into native + timeoutTimer.timer = true; + } + exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); + } + return timeoutTimer; + }, + /** + * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, + * the successCallback is called with the new location. + * + * @param {Function} successCallback The function to call each time the location data is available + * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + var id = utils.createUUID(); + + // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition + timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); + + var fail = function(e) { + clearTimeout(timers[id].timer); + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + var win = function(p) { + clearTimeout(timers[id].timer); + if (options.timeout !== Infinity) { + timers[id].timer = createTimeout(fail, options.timeout); + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + + exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); + + return id; + }, + /** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchPosition + */ + clearWatch:function(id) { + if (id && timers[id] !== undefined) { + clearTimeout(timers[id].timer); + timers[id].timer = false; + exec(null, null, "Geolocation", "clearWatch", [id]); + } + } +}; + +module.exports = geolocation; + +}); + +// file: lib/common/plugin/globalization.js +define("cordova/plugin/globalization", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + GlobalizationError = require('cordova/plugin/GlobalizationError'); + +var globalization = { + +/** +* Returns the string identifier for the client's current language. +* It returns the language identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the language, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The language identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, +* function () {}); +*/ +getPreferredLanguage:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); + exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); +}, + +/** +* Returns the string identifier for the client's current locale setting. +* It returns the locale identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the locale, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The locale identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, +* function () {}); +*/ +getLocaleName:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); + exec(successCB, failureCB, "Globalization","getLocaleName", []); +}, + + +/** +* Returns a date formatted as a string according to the client's user preferences and +* calendar using the time zone of the client. It returns the formatted date string to the +* successCB callback with a properties object as a parameter. If there is an error +* formatting the date, then the errorCB callback is invoked. +* +* The defaults are: formatLenght="short" and selector="date and time" +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.value {String}: The localized date string +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.dateToString(new Date(), +* function (date) {alert('date:' + date.value + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {formatLength:'short'}); +*/ +dateToString:function(date, successCB, failureCB, options) { + argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); +}, + + +/** +* Parses a date formatted as a string according to the client's user +* preferences and calendar using the time zone of the client and returns +* the corresponding date object. It returns the date to the successCB +* callback with a properties object as a parameter. If there is an error +* parsing the date string, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {String} dateString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.year {Number}: The four digit year +* Object.month {Number}: The month from (0 - 11) +* Object.day {Number}: The day from (1 - 31) +* Object.hour {Number}: The hour from (0 - 23) +* Object.minute {Number}: The minute from (0 - 59) +* Object.second {Number}: The second from (0 - 59) +* Object.millisecond {Number}: The milliseconds (from 0 - 999), +* not available on all platforms +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToDate('4/11/2011', +* function (date) { alert('Month:' + date.month + '\n' + +* 'Day:' + date.day + '\n' + +* 'Year:' + date.year + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {selector:'date'}); +*/ +stringToDate:function(dateString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); + exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); +}, + + +/** +* Returns a pattern string for formatting and parsing dates according to the client's +* user preferences. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, +* then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.timezone {String}: The abbreviated name of the time zone on the client +* Object.utc_offset {Number}: The current difference in seconds between the client's +* time zone and coordinated universal time. +* Object.dst_offset {Number}: The current daylight saving time offset in seconds +* between the client's non-daylight saving's time zone +* and the client's daylight saving's time zone. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getDatePattern( +* function (date) {alert('pattern:' + date.pattern + '\n');}, +* function () {}, +* {formatLength:'short'}); +*/ +getDatePattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); + exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); +}, + + +/** +* Returns an array of either the names of the months or days of the week +* according to the client's user preferences and calendar. It returns the array of names to the +* successCB callback with a properties object as a parameter. If there is an error obtaining the +* names, then the errorCB callback is invoked. +* +* The defaults are: type="wide" and item="months" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'narrow' or 'wide' +* item {String}: 'months', or 'days' +* +* @return Object.value {Array{String}}: The array of names starting from either +* the first month in the year or the +* first day of the week. +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getDateNames(function (names) { +* for(var i = 0; i < names.value.length; i++) { +* alert('Month:' + names.value[i] + '\n');}}, +* function () {}); +*/ +getDateNames:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); + exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); +}, + +/** +* Returns whether daylight savings time is in effect for a given date using the client's +* time zone and calendar. It returns whether or not daylight savings time is in effect +* to the successCB callback with a properties object as a parameter. If there is an error +* reading the date, then the errorCB callback is invoked. +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is +* in effect for the given date and "false" indicate that it is not. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.isDayLightSavingsTime(new Date(), +* function (date) {alert('dst:' + date.dst + '\n');} +* function () {}); +*/ +isDayLightSavingsTime:function(date, successCB, failureCB) { + argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); +}, + +/** +* Returns the first day of the week according to the client's user preferences and calendar. +* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. +* It returns the day to the successCB callback with a properties object as a parameter. +* If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {Number}: The number of the first day of the week. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getFirstDayOfWeek(function (day) +* { alert('Day:' + day.value + '\n');}, +* function () {}); +*/ +getFirstDayOfWeek:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); + exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); +}, + + +/** +* Returns a number formatted as a string according to the client's user preferences. +* It returns the formatted number string to the successCB callback with a properties object as a +* parameter. If there is an error formatting the number, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Number} number +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {String}: The formatted number string. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.numberToString(3.25, +* function (number) {alert('number:' + number.value + '\n');}, +* function () {}, +* {type:'decimal'}); +*/ +numberToString:function(number, successCB, failureCB, options) { + argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); + exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); +}, + +/** +* Parses a number formatted as a string according to the client's user preferences and +* returns the corresponding number. It returns the number to the successCB callback with a +* properties object as a parameter. If there is an error parsing the number string, then +* the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {String} numberString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {Number}: The parsed number. +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToNumber('1234.56', +* function (number) {alert('Number:' + number.value + '\n');}, +* function () { alert('Error parsing number');}); +*/ +stringToNumber:function(numberString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); + exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing numbers according to the client's user +* preferences. It returns the pattern to the successCB callback with a properties object as a +* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. +* The patterns follow Unicode Technical Standard #35. +* http://unicode.org/reports/tr35/tr35-4.html +* Object.symbol {String}: The symbol to be used when formatting and parsing +* e.g., percent or currency symbol. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting numbers. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. +* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getNumberPattern( +* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, +* function () {}); +*/ +getNumberPattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); + exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing currency values according to the client's +* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB +* callback is invoked. +* +* @param {String} currencyCode +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.code {String}: The ISO 4217 currency code for the pattern. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting currency. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.getCurrencyPattern('EUR', +* function (currency) {alert('Pattern:' + currency.pattern + '\n');} +* function () {}); +*/ +getCurrencyPattern:function(currencyCode, successCB, failureCB) { + argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); + exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); +} + +}; + +module.exports = globalization; + +}); + +// file: lib/ios/plugin/ios/Contact.js +define("cordova/plugin/ios/Contact", function(require, exports, module) { + +var exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'); + +/** + * Provides iOS Contact.display API. + */ +module.exports = { + display : function(errorCB, options) { + /* + * Display a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + */ + + if (this.id === null) { + if (typeof errorCB === "function") { + var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); + errorCB(errorObj); + } + } + else { + exec(null, errorCB, "Contacts","displayContact", [this.id, options]); + } + } +}; + +}); + +// file: lib/ios/plugin/ios/Entry.js +define("cordova/plugin/ios/Entry", function(require, exports, module) { + +module.exports = { + toURL:function() { + // TODO: refactor path in a cross-platform way so we can eliminate + // these kinds of platform-specific hacks. + return "file://localhost" + this.fullPath; + }, + toURI: function() { + console.log("DEPRECATED: Update your code to use 'toURL'"); + return "file://localhost" + this.fullPath; + } +}; + +}); + +// file: lib/ios/plugin/ios/console.js +define("cordova/plugin/ios/console", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * create a nice string for an object + */ +function stringify(message) { + try { + if (typeof message === "object" && JSON && JSON.stringify) { + try { + return JSON.stringify(message); + } + catch (e) { + return "error JSON.stringify()ing argument: " + e; + } + } else { + return message.toString(); + } + } catch (e) { + return e.toString(); + } +} + +/** + * Wrapper one of the console logging methods, so that + * the Cordova logging native is called, then the original. + */ +function wrappedMethod(console, method) { + var origMethod = console[method]; + + return function(message) { + exec(null, null, + 'Debug Console', 'log', + [ stringify(message), { logLevel: method.toUpperCase() } ] + ); + + if (!origMethod) return; + + origMethod.apply(console, arguments); + }; +} + +var console = window.console || {}; + +// 2012-10-06 pmuellr - marking setLevel() method and logLevel property +// on console as deprecated; +// it didn't do anything useful, since the level constants weren't accessible +// to anyone + +console.setLevel = function() {}; +console.logLevel = 0; + +// wrapper the logging messages + +var methods = ["log", "debug", "info", "warn", "error"]; + +for (var i=0; i CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // if not using the console, use the native logger + if (!UseConsole) { + exec(null, null, "Logger", "logLevel", [level, message]); + return; + } + + // make sure console is not using logger + if (console.__usingCordovaLogger) { + throw new Error("console and logger are too intertwingly"); + } + + // log to the console + switch (level) { + case logger.LOG: console.log(message); break; + case logger.ERROR: console.log("ERROR: " + message); break; + case logger.WARN: console.log("WARN: " + message); break; + case logger.INFO: console.log("INFO: " + message); break; + case logger.DEBUG: console.log("DEBUG: " + message); break; + } +}; + +// when deviceready fires, log queued messages +logger.__onDeviceReady = function() { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i=0; i 3) { + fail(FileError.SYNTAX_ERR); + } else { + // if successful, return a FileSystem object + var success = function(file_system) { + if (file_system) { + if (successCallback) { + // grab the name and root from the file system object + var result = new FileSystem(file_system.name, file_system.root); + successCallback(result); + } + } + else { + // no FileSystem object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + exec(success, fail, "File", "requestFileSystem", [type, size]); + } +}; + +module.exports = requestFileSystem; + +}); + +// file: lib/common/plugin/resolveLocalFileSystemURI.js +define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + DirectoryEntry = require('cordova/plugin/DirectoryEntry'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + exec = require('cordova/exec'); + +/** + * Look up file system Entry referred to by local URI. + * @param {DOMString} uri URI referring to a local file or directory + * @param successCallback invoked with Entry object corresponding to URI + * @param errorCallback invoked if error occurs retrieving file system entry + */ +module.exports = function(uri, successCallback, errorCallback) { + argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); + // error callback + var fail = function(error) { + errorCallback && errorCallback(new FileError(error)); + }; + // sanity check for 'not:valid:filename' + if(!uri || uri.split(":").length > 2) { + setTimeout( function() { + fail(FileError.ENCODING_ERR); + },0); + return; + } + // if successful, return either a file or directory entry + var success = function(entry) { + var result; + if (entry) { + if (successCallback) { + // create appropriate Entry object + result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); + successCallback(result); + } + } + else { + // no Entry object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + + exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); +}; + +}); + +// file: lib/common/plugin/splashscreen.js +define("cordova/plugin/splashscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var splashscreen = { + show:function() { + exec(null, null, "SplashScreen", "show", []); + }, + hide:function() { + exec(null, null, "SplashScreen", "hide", []); + } +}; + +module.exports = splashscreen; + +}); + +// file: lib/common/utils.js +define("cordova/utils", function(require, exports, module) { + +var utils = exports; + +/** + * Defines a property getter / setter for obj[key]. + */ +utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) { + if (Object.defineProperty) { + var desc = { + get: getFunc, + configurable: true + }; + if (opt_setFunc) { + desc.set = opt_setFunc; + } + Object.defineProperty(obj, key, desc); + } else { + obj.__defineGetter__(key, getFunc); + if (opt_setFunc) { + obj.__defineSetter__(key, opt_setFunc); + } + } +}; + +/** + * Defines a property getter for obj[key]. + */ +utils.defineGetter = utils.defineGetterSetter; + +utils.arrayIndexOf = function(a, item) { + if (a.indexOf) { + return a.indexOf(item); + } + var len = a.length; + for (var i = 0; i < len; ++i) { + if (a[i] == item) { + return i; + } + } + return -1; +}; + +/** + * Returns whether the item was found in the array. + */ +utils.arrayRemove = function(a, item) { + var index = utils.arrayIndexOf(a, item); + if (index != -1) { + a.splice(index, 1); + } + return index != -1; +}; + +utils.typeName = function(val) { + return Object.prototype.toString.call(val).slice(8, -1); +}; + +/** + * Returns an indication of whether the argument is an array or not + */ +utils.isArray = function(a) { + return utils.typeName(a) == 'Array'; +}; + +/** + * Returns an indication of whether the argument is a Date or not + */ +utils.isDate = function(d) { + return utils.typeName(d) == 'Date'; +}; + +/** + * Does a deep clone of the object. + */ +utils.clone = function(obj) { + if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') { + return obj; + } + + var retVal, i; + + if(utils.isArray(obj)){ + retVal = []; + for(i = 0; i < obj.length; ++i){ + retVal.push(utils.clone(obj[i])); + } + return retVal; + } + + retVal = {}; + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = utils.clone(obj[i]); + } + } + return retVal; +}; + +/** + * Returns a wrapped version of the function + */ +utils.close = function(context, func, params) { + if (typeof params == 'undefined') { + return function() { + return func.apply(context, arguments); + }; + } else { + return function() { + return func.apply(context, params); + }; + } +}; + +/** + * Create a UUID + */ +utils.createUUID = function() { + return UUIDcreatePart(4) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(6); +}; + +/** + * Extends a child object from a parent object using classical inheritance + * pattern. + */ +utils.extend = (function() { + // proxy used to establish prototype chain + var F = function() {}; + // extend Child from Parent + return function(Child, Parent) { + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.__super__ = Parent.prototype; + Child.prototype.constructor = Child; + }; +}()); + +/** + * Alerts a message in any available way: alert or console.log. + */ +utils.alert = function(msg) { + if (window.alert) { + window.alert(msg); + } else if (console && console.log) { + console.log(msg); + } +}; + +/** + * Formats a string and arguments following it ala sprintf() + * + * see utils.vformat() for more information + */ +utils.format = function(formatString /* ,... */) { + var args = [].slice.call(arguments, 1); + return utils.vformat(formatString, args); +}; + +/** + * Formats a string and arguments following it ala vsprintf() + * + * format chars: + * %j - format arg as JSON + * %o - format arg as JSON + * %c - format arg as '' + * %% - replace with '%' + * any other char following % will format it's + * arg via toString(). + * + * for rationale, see FireBug's Console API: + * http://getfirebug.com/wiki/index.php/Console_API + */ +utils.vformat = function(formatString, args) { + if (formatString === null || formatString === undefined) return ""; + if (arguments.length == 1) return formatString.toString(); + if (typeof formatString != "string") return formatString.toString(); + + var pattern = /(.*?)%(.)(.*)/; + var rest = formatString; + var result = []; + + while (args.length) { + var arg = args.shift(); + var match = pattern.exec(rest); + + if (!match) break; + + rest = match[3]; + + result.push(match[1]); + + if (match[2] == '%') { + result.push('%'); + args.unshift(arg); + continue; + } + + result.push(formatted(arg, match[2])); + } + + result.push(rest); + + return result.join(''); +}; + +//------------------------------------------------------------------------------ +function UUIDcreatePart(length) { + var uuidpart = ""; + for (var i=0; i index into requireStack of modules currently being built. + var inProgressModules = {}; + + function build(module) { + var factory = module.factory; + module.exports = {}; + delete module.factory; + factory(require, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw "module " + id + " not found"; + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw "Cycle in require graph: " + cycle; + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (modules[id]) { + throw "module " + id + " already defined"; + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +//Export for use in node +if (typeof module === "object" && typeof require === "function") { + module.exports.require = require; + module.exports.define = define; +} + +// file: lib/cordova.js +define("cordova", function(require, exports, module) { + + +var channel = require('cordova/channel'); + +/** + * Listen for DOMContentLoaded and notify our channel subscribers. + */ +document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); +}, false); +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}, + windowEventHandlers = {}; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] != 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] != 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] != "undefined") { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] != "undefined") { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent(type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + } + return event; +} + +if(typeof window.console === "undefined") { + window.console = { + log:function(){} + }; +} + +var cordova = { + define:define, + require:require, + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler:function(event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler:function(event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler:function(event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler:function(event) { + delete documentEventHandlers[event]; + }, + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function() { + return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, + 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; + }, + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function(type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] != 'undefined') { + if( bNoDetach ) { + documentEventHandlers[type].fire(evt); + } + else { + setTimeout(function() { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type == 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + fireWindowEvent: function(type, data) { + var evt = createEvent(type,data); + if (typeof windowEventHandlers[type] != 'undefined') { + setTimeout(function() { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function(callbackId, args) { + try { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function(callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + try { + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + } catch (e) { + console.log("Error in error callback: " + callbackId + " = "+e); + } + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function(callbackId, success, status, args, keepCallback) { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (success && status == cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!success) { + callback.fail && callback.fail.apply(null, args); + } + + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + }, + addConstructor: function(func) { + channel.onCordovaReady.subscribe(function() { + try { + func(); + } catch(e) { + console.log("Failed to run constructor: " + e); + } + }); + } +}; + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +module.exports = cordova; + +}); + +// file: lib/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + 'A': 'Array', + 'D': 'Date', + 'N': 'Number', + 'S': 'String', + 'F': 'Function', + 'O': 'Object' +}; + +function extractParamName(callee, argIndex) { + return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; +} + +function checkArgs(spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i), + cUpper = c.toUpperCase(), + arg = args[i]; + // Asterix means allow anything. + if (c == '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c == cUpper) { + continue; + } + if (typeName != typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running jake test. + if (typeof jasmine == 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue(value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + + +}); + +// file: lib/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each(objects, func, context) { + for (var prop in objects) { + if (objects.hasOwnProperty(prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber(obj, key, value) { + exports.replaceHookForTesting(obj, key); + obj[key] = value; + // Getters can only be overridden by getters. + if (obj[key] !== value) { + utils.defineGetter(obj, key, function() { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter(obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function() { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include(parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] == 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch(e) { + utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge(target, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function(objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function(objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function(objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; +exports.replaceHookForTesting = function() {}; + +}); + +// file: lib/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'), + nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onCordovaInfoReady* Internal event fired when device properties are available. + * onCordovaConnectionReady* Internal event fired when the connection property has been set. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function(type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}, + channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function(h, c) { + var len = c.length, + i = len, + f = function() { + if (!(--i)) h(); + }; + for (var j=0; jNative messages. + isInContextOfEvalJs = 0; + +function createExecIframe() { + var iframe = document.createElement("iframe"); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + return iframe; +} + +function shouldBundleCommandJson() { + if (bridgeMode == jsToNativeModes.XHR_WITH_PAYLOAD) { + return true; + } + if (bridgeMode == jsToNativeModes.XHR_OPTIONAL_PAYLOAD) { + var payloadLength = 0; + for (var i = 0; i < commandQueue.length; ++i) { + payloadLength += commandQueue[i].length; + } + // The value here was determined using the benchmark within CordovaLibApp on an iPad 3. + return payloadLength < 4500; + } + return false; +} + +function massageArgsJsToNative(args) { + if (!args || utils.typeName(args) != 'Array') { + return args; + } + var ret = []; + var encodeArrayBufferAs8bitString = function(ab) { + return String.fromCharCode.apply(null, new Uint8Array(ab)); + }; + var encodeArrayBufferAsBase64 = function(ab) { + return window.btoa(encodeArrayBufferAs8bitString(ab)); + }; + args.forEach(function(arg, i) { + if (utils.typeName(arg) == 'ArrayBuffer') { + ret.push({ + 'CDVType': 'ArrayBuffer', + 'data': encodeArrayBufferAsBase64(arg) + }); + } else { + ret.push(arg); + } + }); + return ret; +} + +function massageMessageNativeToJs(message) { + if (message.CDVType == 'ArrayBuffer') { + var stringToArrayBuffer = function(str) { + var ret = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + ret[i] = str.charCodeAt(i); + } + return ret.buffer; + }; + var base64ToArrayBuffer = function(b64) { + return stringToArrayBuffer(atob(b64)); + }; + message = base64ToArrayBuffer(message.data); + } + return message; +} + +function convertMessageToArgsNativeToJs(message) { + var args = []; + if (!message || !message.hasOwnProperty('CDVType')) { + args.push(message); + } else if (message.CDVType == 'MultiPart') { + message.messages.forEach(function(e) { + args.push(massageMessageNativeToJs(e)); + }); + } else { + args.push(massageMessageNativeToJs(message)); + } + return args; +} + +function iOSExec() { + // XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices. + // XHR mode's main advantage is working around a bug in -webkit-scroll, which + // doesn't exist in 4.X devices anyways. + if (bridgeMode === undefined) { + bridgeMode = navigator.userAgent.indexOf(' 4_') == -1 ? jsToNativeModes.XHR_NO_PAYLOAD : jsToNativeModes.IFRAME_NAV; + } + + var successCallback, failCallback, service, action, actionArgs, splitCommand; + var callbackId = null; + if (typeof arguments[0] !== "string") { + // FORMAT ONE + successCallback = arguments[0]; + failCallback = arguments[1]; + service = arguments[2]; + action = arguments[3]; + actionArgs = arguments[4]; + + // Since we need to maintain backwards compatibility, we have to pass + // an invalid callbackId even if no callback was provided since plugins + // will be expecting it. The Cordova.exec() implementation allocates + // an invalid callbackId and passes it even if no callbacks were given. + callbackId = 'INVALID'; + } else { + // FORMAT TWO, REMOVED + try { + splitCommand = arguments[0].split("."); + action = splitCommand.pop(); + service = splitCommand.join("."); + actionArgs = Array.prototype.splice.call(arguments, 1); + + console.log('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + + "cordova.exec(null, null, \"" + service + "\", " + action + "\"," + JSON.stringify(actionArgs) + ");" + ); + return; + } catch (e) { + } + } + + // Register the callbacks and add the callbackId to the positional + // arguments if given. + if (successCallback || failCallback) { + callbackId = service + cordova.callbackId++; + cordova.callbacks[callbackId] = + {success:successCallback, fail:failCallback}; + } + + actionArgs = massageArgsJsToNative(actionArgs); + + var command = [callbackId, service, action, actionArgs]; + + // Stringify and queue the command. We stringify to command now to + // effectively clone the command arguments in case they are mutated before + // the command is executed. + commandQueue.push(JSON.stringify(command)); + + // If we're in the context of a stringByEvaluatingJavaScriptFromString call, + // then the queue will be flushed when it returns; no need for a poke. + // Also, if there is already a command in the queue, then we've already + // poked the native side, so there is no reason to do so again. + if (!isInContextOfEvalJs && commandQueue.length == 1) { + if (bridgeMode != jsToNativeModes.IFRAME_NAV) { + // This prevents sending an XHR when there is already one being sent. + // This should happen only in rare circumstances (refer to unit tests). + if (execXhr && execXhr.readyState != 4) { + execXhr = null; + } + // Re-using the XHR improves exec() performance by about 10%. + execXhr = execXhr || new XMLHttpRequest(); + // Changing this to a GET will make the XHR reach the URIProtocol on 4.2. + // For some reason it still doesn't work though... + // Add a timestamp to the query param to prevent caching. + execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true); + if (!vcHeaderValue) { + vcHeaderValue = /.*\((.*)\)/.exec(navigator.userAgent)[1]; + } + execXhr.setRequestHeader('vc', vcHeaderValue); + execXhr.setRequestHeader('rc', ++requestCount); + if (shouldBundleCommandJson()) { + execXhr.setRequestHeader('cmds', iOSExec.nativeFetchMessages()); + } + execXhr.send(null); + } else { + execIframe = execIframe || createExecIframe(); + execIframe.src = "gap://ready"; + } + } +} + +iOSExec.jsToNativeModes = jsToNativeModes; + +iOSExec.setJsToNativeBridgeMode = function(mode) { + // Remove the iFrame since it may be no longer required, and its existence + // can trigger browser bugs. + // https://issues.apache.org/jira/browse/CB-593 + if (execIframe) { + execIframe.parentNode.removeChild(execIframe); + execIframe = null; + } + bridgeMode = mode; +}; + +iOSExec.nativeFetchMessages = function() { + // Each entry in commandQueue is a JSON string already. + if (!commandQueue.length) { + return ''; + } + var json = '[' + commandQueue.join(',') + ']'; + commandQueue.length = 0; + return json; +}; + +iOSExec.nativeCallback = function(callbackId, status, message, keepCallback) { + return iOSExec.nativeEvalAndFetch(function() { + var success = status === 0 || status === 1; + var args = convertMessageToArgsNativeToJs(message); + cordova.callbackFromNative(callbackId, success, status, args, keepCallback); + }); +}; + +iOSExec.nativeEvalAndFetch = function(func) { + // This shouldn't be nested, but better to be safe. + isInContextOfEvalJs++; + try { + func(); + return iOSExec.nativeFetchMessages(); + } finally { + isInContextOfEvalJs--; + } +}; + +module.exports = iOSExec; + +}); + +// file: lib/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'), + moduleMap = define.moduleMap, + symbolList, + deprecationMap; + +exports.reset = function() { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +function prepareNamespace(symbolPath, context) { + if (!symbolPath) { + return context; + } + var parts = symbolPath.split('.'); + var cur = context; + for (var i = 0, part; part = parts[i]; ++i) { + cur = cur[part] = cur[part] || {}; + } + return cur; +} + +exports.mapModules = function(context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var module = require(moduleName); + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy == 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy == 'd' && !target) || (strategy != 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function(context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.loadMatchingModules = function(matchingRegExp) { + for (var k in moduleMap) { + if (matchingRegExp.exec(k)) { + require(k); + } + } +}; + +exports.reset(); + + +}); + +// file: lib/ios/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: "ios", + initialize:function() { + var modulemapper = require('cordova/modulemapper'); + + modulemapper.loadMatchingModules(/cordova.*\/plugininit$/); + + modulemapper.loadMatchingModules(/cordova.*\/symbols$/); + modulemapper.mapModules(window); + } +}; + + +}); + +// file: lib/common/plugin/Acceleration.js +define("cordova/plugin/Acceleration", function(require, exports, module) { + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); + +// file: lib/common/plugin/Camera.js +define("cordova/plugin/Camera", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('cordova/plugin/CameraConstants'), + CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle'); + +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=FILE_URI. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + return new CameraPopoverHandle(); +}; + +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); + +// file: lib/common/plugin/CameraConstants.js +define("cordova/plugin/CameraConstants", function(require, exports, module) { + +module.exports = { + DestinationType:{ + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1, // Return file uri (content://media/external/images/media/2 for Android) + NATIVE_URI: 2 // Return native uri (eg. asset-library://... for iOS) + }, + EncodingType:{ + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image + }, + MediaType:{ + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types + }, + PictureSourceType:{ + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) + }, + PopoverArrowDirection:{ + ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + Direction:{ + BACK: 0, + FRONT: 1 + } +}; + +}); + +// file: lib/ios/plugin/CameraPopoverHandle.js +define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + var args = [ popoverOptions ]; + exec(null, null, "Camera", "repositionPopover", args); + }; +}; + +module.exports = CameraPopoverHandle; + +}); + +// file: lib/common/plugin/CameraPopoverOptions.js +define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) { + +var Camera = require('cordova/plugin/CameraConstants'); + +/** + * Encapsulates options for iOS Popover image picker + */ +var CameraPopoverOptions = function(x,y,width,height,arrowDir){ + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + // The direction of the popover arrow + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); + +// file: lib/common/plugin/CaptureAudioOptions.js +define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) { + +/** + * Encapsulates all audio capture operation configuration options. + */ +var CaptureAudioOptions = function(){ + // Upper limit of sound clips user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single sound clip in seconds. + this.duration = 0; + // The selected audio mode. Must match with one of the elements in supportedAudioModes array. + this.mode = null; +}; + +module.exports = CaptureAudioOptions; + +}); + +// file: lib/common/plugin/CaptureError.js +define("cordova/plugin/CaptureError", function(require, exports, module) { + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +var CaptureError = function(c) { + this.code = c || null; +}; + +// Camera or microphone failed to capture image or sound. +CaptureError.CAPTURE_INTERNAL_ERR = 0; +// Camera application or audio capture application is currently serving other capture request. +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +// Invalid use of the API (e.g. limit parameter has value less than one). +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +// User exited camera application or audio capture application before capturing anything. +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +// The requested capture operation is not supported. +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +module.exports = CaptureError; + +}); + +// file: lib/common/plugin/CaptureImageOptions.js +define("cordova/plugin/CaptureImageOptions", function(require, exports, module) { + +/** + * Encapsulates all image capture operation configuration options. + */ +var CaptureImageOptions = function(){ + // Upper limit of images user can take. Value must be equal or greater than 1. + this.limit = 1; + // The selected image mode. Must match with one of the elements in supportedImageModes array. + this.mode = null; +}; + +module.exports = CaptureImageOptions; + +}); + +// file: lib/common/plugin/CaptureVideoOptions.js +define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) { + +/** + * Encapsulates all video capture operation configuration options. + */ +var CaptureVideoOptions = function(){ + // Upper limit of videos user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single video clip in seconds. + this.duration = 0; + // The selected video mode. Must match with one of the elements in supportedVideoModes array. + this.mode = null; +}; + +module.exports = CaptureVideoOptions; + +}); + +// file: lib/common/plugin/CompassError.js +define("cordova/plugin/CompassError", function(require, exports, module) { + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); + +// file: lib/common/plugin/CompassHeading.js +define("cordova/plugin/CompassHeading", function(require, exports, module) { + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); + +// file: lib/common/plugin/ConfigurationData.js +define("cordova/plugin/ConfigurationData", function(require, exports, module) { + +/** + * Encapsulates a set of parameters that the capture device supports. + */ +function ConfigurationData() { + // The ASCII-encoded string in lower case representing the media type. + this.type = null; + // The height attribute represents height of the image or video in pixels. + // In the case of a sound clip this attribute has value 0. + this.height = 0; + // The width attribute represents width of the image or video in pixels. + // In the case of a sound clip this attribute has value 0 + this.width = 0; +} + +module.exports = ConfigurationData; + +}); + +// file: lib/common/plugin/Connection.js +define("cordova/plugin/Connection", function(require, exports, module) { + +/** + * Network status + */ +module.exports = { + UNKNOWN: "unknown", + ETHERNET: "ethernet", + WIFI: "wifi", + CELL_2G: "2g", + CELL_3G: "3g", + CELL_4G: "4g", + CELL:"cellular", + NONE: "none" +}; + +}); + +// file: lib/common/plugin/Contact.js +define("cordova/plugin/Contact", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'); + +/** +* Converts primitives into Complex Object +* Currently only used for Date fields +*/ +function convertIn(contact) { + var value = contact.birthday; + try { + contact.birthday = new Date(parseFloat(value)); + } catch (exception){ + console.log("Cordova Contact convertIn error: exception creating date."); + } + return contact; +} + +/** +* Converts Complex objects into primitives +* Only conversion at present is for Dates. +**/ + +function convertOut(contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; +} + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('cordova/plugin/contacts').create(result); + successCB(convertIn(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertOut(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); + +// file: lib/common/plugin/ContactAddress.js +define("cordova/plugin/ContactAddress", function(require, exports, module) { + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); + +// file: lib/common/plugin/ContactError.js +define("cordova/plugin/ContactError", function(require, exports, module) { + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); + +// file: lib/common/plugin/ContactField.js +define("cordova/plugin/ContactField", function(require, exports, module) { + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); + +// file: lib/common/plugin/ContactFindOptions.js +define("cordova/plugin/ContactFindOptions", function(require, exports, module) { + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + */ + +var ContactFindOptions = function(filter, multiple) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); +}; + +module.exports = ContactFindOptions; + +}); + +// file: lib/common/plugin/ContactName.js +define("cordova/plugin/ContactName", function(require, exports, module) { + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); + +// file: lib/common/plugin/ContactOrganization.js +define("cordova/plugin/ContactOrganization", function(require, exports, module) { + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); + +// file: lib/common/plugin/Coordinates.js +define("cordova/plugin/Coordinates", function(require, exports, module) { + +/** + * This class contains position information. + * @param {Object} lat + * @param {Object} lng + * @param {Object} alt + * @param {Object} acc + * @param {Object} head + * @param {Object} vel + * @param {Object} altacc + * @constructor + */ +var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { + /** + * The latitude of the position. + */ + this.latitude = lat; + /** + * The longitude of the position, + */ + this.longitude = lng; + /** + * The accuracy of the position. + */ + this.accuracy = acc; + /** + * The altitude of the position. + */ + this.altitude = (alt !== undefined ? alt : null); + /** + * The direction the device is moving at the position. + */ + this.heading = (head !== undefined ? head : null); + /** + * The velocity with which the device is moving at the position. + */ + this.speed = (vel !== undefined ? vel : null); + + if (this.speed === 0 || this.speed === null) { + this.heading = NaN; + } + + /** + * The altitude accuracy of the position. + */ + this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; +}; + +module.exports = Coordinates; + +}); + +// file: lib/common/plugin/DirectoryEntry.js +define("cordova/plugin/DirectoryEntry", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileError = require('cordova/plugin/FileError'), + DirectoryReader = require('cordova/plugin/DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath) { + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var win = successCallback && function(result) { + var FileEntry = require('cordova/plugin/FileEntry'); + var entry = new FileEntry(result.name, result.fullPath); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.fullPath, path, options]); +}; + +module.exports = DirectoryEntry; + +}); + +// file: lib/common/plugin/DirectoryReader.js +define("cordova/plugin/DirectoryReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(path) { + this.path = path || null; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i= 2) { + if (end < 0) { + newEnd = Math.max(size + end, 0); + } else { + newEnd = Math.min(end, size); + } + } + + var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size); + newFile.start = this.start + newStart; + newFile.end = this.start + newEnd; + return newFile; +}; + + +module.exports = File; + +}); + +// file: lib/common/plugin/FileEntry.js +define("cordova/plugin/FileEntry", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('cordova/plugin/Entry'), + FileWriter = require('cordova/plugin/FileWriter'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'); + +/** + * An interface representing a file on the file system. + * + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the file resides (readonly) + */ +var FileEntry = function(name, fullPath) { + FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]); +}; + +utils.extend(FileEntry, Entry); + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.fileName === null || writer.fileName === "") { + errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); + } else { + successCallback && successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + var win = successCallback && function(f) { + var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size); + successCallback(file); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFileMetadata", [this.fullPath]); +}; + + +module.exports = FileEntry; + +}); + +// file: lib/common/plugin/FileError.js +define("cordova/plugin/FileError", function(require, exports, module) { + +/** + * FileError + */ +function FileError(error) { + this.code = error || null; +} + +// File error codes +// Found in DOMException +FileError.NOT_FOUND_ERR = 1; +FileError.SECURITY_ERR = 2; +FileError.ABORT_ERR = 3; + +// Added by File API specification +FileError.NOT_READABLE_ERR = 4; +FileError.ENCODING_ERR = 5; +FileError.NO_MODIFICATION_ALLOWED_ERR = 6; +FileError.INVALID_STATE_ERR = 7; +FileError.SYNTAX_ERR = 8; +FileError.INVALID_MODIFICATION_ERR = 9; +FileError.QUOTA_EXCEEDED_ERR = 10; +FileError.TYPE_MISMATCH_ERR = 11; +FileError.PATH_EXISTS_ERR = 12; + +module.exports = FileError; + +}); + +// file: lib/common/plugin/FileReader.js +define("cordova/plugin/FileReader", function(require, exports, module) { + +var exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'), + utils = require('cordova/utils'), + File = require('cordova/plugin/File'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'), + origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader'); + +/** + * This class reads the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To read from the SD card, the file name is "sdcard/my_file.txt" + * @constructor + */ +var FileReader = function() { + this._readyState = 0; + this._error = null; + this._result = null; + this._fileName = ''; + this._realReader = origFileReader ? new origFileReader() : {}; +}; + +// States +FileReader.EMPTY = 0; +FileReader.LOADING = 1; +FileReader.DONE = 2; + +utils.defineGetter(FileReader.prototype, 'readyState', function() { + return this._fileName ? this._readyState : this._realReader.readyState; +}); + +utils.defineGetter(FileReader.prototype, 'error', function() { + return this._fileName ? this._error: this._realReader.error; +}); + +utils.defineGetter(FileReader.prototype, 'result', function() { + return this._fileName ? this._result: this._realReader.result; +}); + +function defineEvent(eventName) { + utils.defineGetterSetter(FileReader.prototype, eventName, function() { + return this._realReader[eventName] || null; + }, function(value) { + this._realReader[eventName] = value; + }); +} +defineEvent('onloadstart'); // When the read starts. +defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) +defineEvent('onload'); // When the read has successfully completed. +defineEvent('onerror'); // When the read has failed (see errors). +defineEvent('onloadend'); // When the request has completed (either in success or failure). +defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. + +function initRead(reader, file) { + // Already loading something + if (reader.readyState == FileReader.LOADING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + reader._result = null; + reader._error = null; + reader._readyState = FileReader.LOADING; + + if (typeof file == 'string') { + // Deprecated in Cordova 2.4. + console.warn('Using a string argument with FileReader.readAs functions is deprecated.'); + reader._fileName = file; + } else if (typeof file.fullPath == 'string') { + reader._fileName = file.fullPath; + } else { + reader._fileName = ''; + return true; + } + + reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); +} + +/** + * Abort reading file. + */ +FileReader.prototype.abort = function() { + if (origFileReader && !this._fileName) { + return this._realReader.abort(); + } + this._result = null; + + if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { + return; + } + + this._readyState = FileReader.DONE; + + // If abort callback + if (typeof this.onabort === 'function') { + this.onabort(new ProgressEvent('abort', {target:this})); + } + // If load end callback + if (typeof this.onloadend === 'function') { + this.onloadend(new ProgressEvent('loadend', {target:this})); + } +}; + +/** + * Read text file. + * + * @param file {File} File object containing file properties + * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) + */ +FileReader.prototype.readAsText = function(file, encoding) { + if (initRead(this, file)) { + return this._realReader.readAsText(file, encoding); + } + + // Default encoding is UTF-8 + var enc = encoding ? encoding : "UTF-8"; + var me = this; + var execArgs = [this._fileName, enc, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // DONE state + me._readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // null result + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsText", execArgs); +}; + + +/** + * Read file and return data as a base64 encoded data url. + * A data url is of the form: + * data:[][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsDataURL(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsDataURL", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsBinaryString(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsBinaryString", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsArrayBuffer(file); + } + + var me = this; + var execArgs = [this._fileName, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsArrayBuffer", execArgs); +}; + +module.exports = FileReader; + +}); + +// file: lib/common/plugin/FileSystem.js +define("cordova/plugin/FileSystem", function(require, exports, module) { + +var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function(name, root) { + this.name = name || null; + if (root) { + this.root = new DirectoryEntry(root.name, root.fullPath); + } +}; + +module.exports = FileSystem; + +}); + +// file: lib/common/plugin/FileTransfer.js +define("cordova/plugin/FileTransfer", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('cordova/plugin/FileTransferError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + if (window.btoa) { + // parse the url using the Location object + var url = document.createElement('a'); + url.href = urlString; + + var credentials = null; + var protocol = url.protocol + "//"; + var origin = protocol + url.host; + + // check whether there are the username:password credentials in the url + if (url.href.indexOf(origin) !== 0) { // credentials found + var atIndex = url.href.indexOf("@"); + credentials = url.href.substring(protocol.length, atIndex); + } + + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + successCallback && successCallback(result); + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova/plugin/DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova/plugin/FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); + +// file: lib/common/plugin/FileTransferError.js +define("cordova/plugin/FileTransferError", function(require, exports, module) { + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; + +module.exports = FileTransferError; + +}); + +// file: lib/common/plugin/FileUploadOptions.js +define("cordova/plugin/FileUploadOptions", function(require, exports, module) { + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + * @param headers {Object} Keys are header names, values are header values. Multiple + * headers of the same name are not supported. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; + this.headers = headers || null; + this.httpMethod = httpMethod || null; +}; + +module.exports = FileUploadOptions; + +}); + +// file: lib/common/plugin/FileUploadResult.js +define("cordova/plugin/FileUploadResult", function(require, exports, module) { + +/** + * FileUploadResult + * @constructor + */ +var FileUploadResult = function() { + this.bytesSent = 0; + this.responseCode = null; + this.response = null; +}; + +module.exports = FileUploadResult; + +}); + +// file: lib/common/plugin/FileWriter.js +define("cordova/plugin/FileWriter", function(require, exports, module) { + +var exec = require('cordova/exec'), + FileError = require('cordova/plugin/FileError'), + ProgressEvent = require('cordova/plugin/ProgressEvent'); + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // set error + this.error = new FileError(FileError.ABORT_ERR); + + this.readyState = FileWriter.DONE; + + // If abort callback + if (typeof this.onabort === "function") { + this.onabort(new ProgressEvent("abort", {"target":this})); + } + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend(new ProgressEvent("writeend", {"target":this})); + } +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [this.fileName, text, this.position]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + if (!offset && offset !== 0) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger than file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":this})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "truncate", [this.fileName, size]); +}; + +module.exports = FileWriter; + +}); + +// file: lib/common/plugin/Flags.js +define("cordova/plugin/Flags", function(require, exports, module) { + +/** + * Supplies arguments to methods that lookup or create files and directories. + * + * @param create + * {boolean} file or directory if it doesn't exist + * @param exclusive + * {boolean} used with create; if true the command will fail if + * target path exists + */ +function Flags(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +} + +module.exports = Flags; + +}); + +// file: lib/common/plugin/GlobalizationError.js +define("cordova/plugin/GlobalizationError", function(require, exports, module) { + + +/** + * Globalization error object + * + * @constructor + * @param code + * @param message + */ +var GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +// Globalization error codes +GlobalizationError.UNKNOWN_ERROR = 0; +GlobalizationError.FORMATTING_ERROR = 1; +GlobalizationError.PARSING_ERROR = 2; +GlobalizationError.PATTERN_ERROR = 3; + +module.exports = GlobalizationError; + +}); + +// file: lib/common/plugin/InAppBrowser.js +define("cordova/plugin/InAppBrowser", function(require, exports, module) { + +var exec = require('cordova/exec'); +var channel = require('cordova/channel'); +var modulemapper = require('cordova/modulemapper'); + +function InAppBrowser() { + this.channels = { + 'loadstart': channel.create('loadstart'), + 'loadstop' : channel.create('loadstop'), + 'loaderror' : channel.create('loaderror'), + 'exit' : channel.create('exit') + }; +} + +InAppBrowser.prototype = { + _eventHandler: function (event) { + if (event.type in this.channels) { + this.channels[event.type].fire(event); + } + }, + close: function (eventname) { + exec(null, null, "InAppBrowser", "close", []); + }, + addEventListener: function (eventname,f) { + if (eventname in this.channels) { + this.channels[eventname].subscribe(f); + } + }, + removeEventListener: function(eventname, f) { + if (eventname in this.channels) { + this.channels[eventname].unsubscribe(f); + } + }, + + executeScript: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); + } else { + throw new Error('executeScript requires exactly one of code or file to be specified'); + } + }, + + insertCSS: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); + } else { + throw new Error('insertCSS requires exactly one of code or file to be specified'); + } + } +}; + +module.exports = function(strUrl, strWindowName, strWindowFeatures) { + var iab = new InAppBrowser(); + var cb = function(eventname) { + iab._eventHandler(eventname); + }; + + // Don't catch calls that write to existing frames (e.g. named iframes). + if (window.frames && window.frames[strWindowName]) { + var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); + return origOpenFunc.apply(window, arguments); + } + + exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); + return iab; +}; + + +}); + +// file: lib/common/plugin/LocalFileSystem.js +define("cordova/plugin/LocalFileSystem", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Represents a local file system. + */ +var LocalFileSystem = function() { + +}; + +LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence +LocalFileSystem.PERSISTENT = 1; //persistent + +module.exports = LocalFileSystem; + +}); + +// file: lib/common/plugin/Media.js +define("cordova/plugin/Media", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +var mediaObjects = {}; + +/** + * This class provides access to the device media, interfaces to both sound and video + * + * @constructor + * @param src The file name or url to play + * @param successCallback The callback to be called when the file is done playing or recording. + * successCallback() + * @param errorCallback The callback to be called if there is an error. + * errorCallback(int errorCode) - OPTIONAL + * @param statusCallback The callback to be called when media status has changed. + * statusCallback(int statusCode) - OPTIONAL + */ +var Media = function(src, successCallback, errorCallback, statusCallback) { + argscheck.checkArgs('SFFF', 'Media', arguments); + this.id = utils.createUUID(); + mediaObjects[this.id] = this; + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.statusCallback = statusCallback; + this._duration = -1; + this._position = -1; + exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); +}; + +// Media messages +Media.MEDIA_STATE = 1; +Media.MEDIA_DURATION = 2; +Media.MEDIA_POSITION = 3; +Media.MEDIA_ERROR = 9; + +// Media states +Media.MEDIA_NONE = 0; +Media.MEDIA_STARTING = 1; +Media.MEDIA_RUNNING = 2; +Media.MEDIA_PAUSED = 3; +Media.MEDIA_STOPPED = 4; +Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; + +// "static" function to return existing objs. +Media.get = function(id) { + return mediaObjects[id]; +}; + +/** + * Start or resume playing audio file. + */ +Media.prototype.play = function(options) { + exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); +}; + +/** + * Stop playing audio file. + */ +Media.prototype.stop = function() { + var me = this; + exec(function() { + me._position = 0; + }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); +}; + +/** + * Seek or jump to a new time in the track.. + */ +Media.prototype.seekTo = function(milliseconds) { + var me = this; + exec(function(p) { + me._position = p; + }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); +}; + +/** + * Pause playing audio file. + */ +Media.prototype.pause = function() { + exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); +}; + +/** + * Get duration of an audio file. + * The duration is only set for audio that is playing, paused or stopped. + * + * @return duration or -1 if not known. + */ +Media.prototype.getDuration = function() { + return this._duration; +}; + +/** + * Get position of audio. + */ +Media.prototype.getCurrentPosition = function(success, fail) { + var me = this; + exec(function(p) { + me._position = p; + success(p); + }, fail, "Media", "getCurrentPositionAudio", [this.id]); +}; + +/** + * Start recording audio file. + */ +Media.prototype.startRecord = function() { + exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); +}; + +/** + * Stop recording audio file. + */ +Media.prototype.stopRecord = function() { + exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); +}; + +/** + * Release the resources. + */ +Media.prototype.release = function() { + exec(null, this.errorCallback, "Media", "release", [this.id]); +}; + +/** + * Adjust the volume. + */ +Media.prototype.setVolume = function(volume) { + exec(null, null, "Media", "setVolume", [this.id, volume]); +}; + +/** + * Audio has status update. + * PRIVATE + * + * @param id The media object id (string) + * @param msgType The 'type' of update this is + * @param value Use of value is determined by the msgType + */ +Media.onStatus = function(id, msgType, value) { + + var media = mediaObjects[id]; + + if(media) { + switch(msgType) { + case Media.MEDIA_STATE : + media.statusCallback && media.statusCallback(value); + if(value == Media.MEDIA_STOPPED) { + media.successCallback && media.successCallback(); + } + break; + case Media.MEDIA_DURATION : + media._duration = value; + break; + case Media.MEDIA_ERROR : + media.errorCallback && media.errorCallback(value); + break; + case Media.MEDIA_POSITION : + media._position = Number(value); + break; + default : + console.error && console.error("Unhandled Media.onStatus :: " + msgType); + break; + } + } + else { + console.error && console.error("Received Media.onStatus callback for unknown media :: " + id); + } + +}; + +module.exports = Media; + +}); + +// file: lib/common/plugin/MediaError.js +define("cordova/plugin/MediaError", function(require, exports, module) { + +/** + * This class contains information about any Media errors. +*/ +/* + According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror + We should never be creating these objects, we should just implement the interface + which has 1 property for an instance, 'code' + + instead of doing : + errorCallbackFunction( new MediaError(3,'msg') ); +we should simply use a literal : + errorCallbackFunction( {'code':3} ); + */ + + var _MediaError = window.MediaError; + + +if(!_MediaError) { + window.MediaError = _MediaError = function(code, msg) { + this.code = (typeof code != 'undefined') ? code : null; + this.message = msg || ""; // message is NON-standard! do not use! + }; +} + +_MediaError.MEDIA_ERR_NONE_ACTIVE = _MediaError.MEDIA_ERR_NONE_ACTIVE || 0; +_MediaError.MEDIA_ERR_ABORTED = _MediaError.MEDIA_ERR_ABORTED || 1; +_MediaError.MEDIA_ERR_NETWORK = _MediaError.MEDIA_ERR_NETWORK || 2; +_MediaError.MEDIA_ERR_DECODE = _MediaError.MEDIA_ERR_DECODE || 3; +_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4; +// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below. +// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes +_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4; + +module.exports = _MediaError; + +}); + +// file: lib/common/plugin/MediaFile.js +define("cordova/plugin/MediaFile", function(require, exports, module) { + +var utils = require('cordova/utils'), + exec = require('cordova/exec'), + File = require('cordova/plugin/File'), + CaptureError = require('cordova/plugin/CaptureError'); +/** + * Represents a single file. + * + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ +var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ + MediaFile.__super__.constructor.apply(this, arguments); +}; + +utils.extend(MediaFile, File); + +/** + * Request capture format data for a specific file and type + * + * @param {Function} successCB + * @param {Function} errorCB + */ +MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { + if (typeof this.fullPath === "undefined" || this.fullPath === null) { + errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); + } else { + exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); + } +}; + +module.exports = MediaFile; + +}); + +// file: lib/common/plugin/MediaFileData.js +define("cordova/plugin/MediaFileData", function(require, exports, module) { + +/** + * MediaFileData encapsulates format information of a media file. + * + * @param {DOMString} codecs + * @param {long} bitrate + * @param {long} height + * @param {long} width + * @param {float} duration + */ +var MediaFileData = function(codecs, bitrate, height, width, duration){ + this.codecs = codecs || null; + this.bitrate = bitrate || 0; + this.height = height || 0; + this.width = width || 0; + this.duration = duration || 0; +}; + +module.exports = MediaFileData; + +}); + +// file: lib/common/plugin/Metadata.js +define("cordova/plugin/Metadata", function(require, exports, module) { + +/** + * Information about the state of the file or directory + * + * {Date} modificationTime (readonly) + */ +var Metadata = function(time) { + this.modificationTime = (typeof time != 'undefined'?new Date(time):null); +}; + +module.exports = Metadata; + +}); + +// file: lib/common/plugin/Position.js +define("cordova/plugin/Position", function(require, exports, module) { + +var Coordinates = require('cordova/plugin/Coordinates'); + +var Position = function(coords, timestamp) { + if (coords) { + this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy); + } else { + this.coords = new Coordinates(); + } + this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); +}; + +module.exports = Position; + +}); + +// file: lib/common/plugin/PositionError.js +define("cordova/plugin/PositionError", function(require, exports, module) { + +/** + * Position error object + * + * @constructor + * @param code + * @param message + */ +var PositionError = function(code, message) { + this.code = code || null; + this.message = message || ''; +}; + +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; + +module.exports = PositionError; + +}); + +// file: lib/common/plugin/ProgressEvent.js +define("cordova/plugin/ProgressEvent", function(require, exports, module) { + +// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill +// Feature test: See if we can instantiate a native ProgressEvent; +// if so, use that approach, +// otherwise fill-in with our own implementation. +// +// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. +var ProgressEvent = (function() { + /* + var createEvent = function(data) { + var event = document.createEvent('Events'); + event.initEvent('ProgressEvent', false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + if (data.target) { + // TODO: cannot call .dispatchEvent + // need to first figure out how to implement EventTarget + } + } + return event; + }; + try { + var ev = createEvent({type:"abort",target:document}); + return function ProgressEvent(type, data) { + data.type = type; + return createEvent(data); + }; + } catch(e){ + */ + return function ProgressEvent(type, dict) { + this.type = type; + this.bubbles = false; + this.cancelBubble = false; + this.cancelable = false; + this.lengthComputable = false; + this.loaded = dict && dict.loaded ? dict.loaded : 0; + this.total = dict && dict.total ? dict.total : 0; + this.target = dict && dict.target ? dict.target : null; + }; + //} +})(); + +module.exports = ProgressEvent; + +}); + +// file: lib/common/plugin/accelerometer.js +define("cordova/plugin/accelerometer", function(require, exports, module) { + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + var p; + var win = function(a) { + removeListeners(p); + successCallback(a); + }; + var fail = function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function(){}, function(e) { + removeListeners(p); + errorCallback && errorCallback(e); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners:p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + } + } +}; + +module.exports = accelerometer; + +}); + +// file: lib/common/plugin/accelerometer/symbols.js +define("cordova/plugin/accelerometer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration'); +modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer'); + +}); + +// file: lib/common/plugin/battery.js +define("cordova/plugin/battery", function(require, exports, module) { + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = battery; + var level = info.level; + if (me._level !== level || me._isPlugged !== info.isPlugged) { + // Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + // Fire low battery event + if (level === 20 || level === 5) { + if (level === 20) { + cordova.fireWindowEvent("batterylow", info); + } + else { + cordova.fireWindowEvent("batterycritical", info); + } + } + } + me._level = level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); + +module.exports = battery; + +}); + +// file: lib/common/plugin/battery/symbols.js +define("cordova/plugin/battery/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/battery', 'navigator.battery'); + +}); + +// file: lib/common/plugin/camera/symbols.js +define("cordova/plugin/camera/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera'); +modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera'); +modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions'); + +}); + +// file: lib/common/plugin/capture.js +define("cordova/plugin/capture", function(require, exports, module) { + +var exec = require('cordova/exec'), + MediaFile = require('cordova/plugin/MediaFile'); + +/** + * Launches a capture of different types. + * + * @param (DOMString} type + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +function _capture(type, successCallback, errorCallback, options) { + var win = function(pluginResult) { + var mediaFiles = []; + var i; + for (i = 0; i < pluginResult.length; i++) { + var mediaFile = new MediaFile(); + mediaFile.name = pluginResult[i].name; + mediaFile.fullPath = pluginResult[i].fullPath; + mediaFile.type = pluginResult[i].type; + mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; + mediaFile.size = pluginResult[i].size; + mediaFiles.push(mediaFile); + } + successCallback(mediaFiles); + }; + exec(win, errorCallback, "Capture", type, [options]); +} +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +} + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ + _capture("captureAudio", successCallback, errorCallback, options); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options){ + _capture("captureImage", successCallback, errorCallback, options); +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ + _capture("captureVideo", successCallback, errorCallback, options); +}; + + +module.exports = new Capture(); + +}); + +// file: lib/common/plugin/capture/symbols.js +define("cordova/plugin/capture/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError'); +modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions'); +modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions'); +modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions'); +modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData'); +modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile'); +modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData'); +modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture'); + +}); + +// file: lib/common/plugin/compass.js +define("cordova/plugin/compass", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('cordova/plugin/CompassHeading'), + CompassError = require('cordova/plugin/CompassError'), + timers = {}, + compass = { + /** + * Asynchronously acquires the current heading. + * @param {Function} successCallback The function to call when the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires the heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the heading + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the heading data. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + } + } + }; + +module.exports = compass; + +}); + +// file: lib/common/plugin/compass/symbols.js +define("cordova/plugin/compass/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading'); +modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError'); +modulemapper.clobbers('cordova/plugin/compass', 'navigator.compass'); + +}); + +// file: lib/common/plugin/console-via-logger.js +define("cordova/plugin/console-via-logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ + +var logger = require("cordova/plugin/logger"); +var utils = require("cordova/utils"); + +//------------------------------------------------------------------------------ +// object that we're exporting +//------------------------------------------------------------------------------ +var console = module.exports; + +//------------------------------------------------------------------------------ +// copy of the original console object +//------------------------------------------------------------------------------ +var WinConsole = window.console; + +//------------------------------------------------------------------------------ +// whether to use the logger +//------------------------------------------------------------------------------ +var UseLogger = false; + +//------------------------------------------------------------------------------ +// Timers +//------------------------------------------------------------------------------ +var Timers = {}; + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +function noop() {} + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error("console and logger are too intertwingly"); + } + } + + return UseLogger; +}; + +//------------------------------------------------------------------------------ +console.log = function() { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.error = function() { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.warn = function() { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.info = function() { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.debug = function() { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.assert = function(expression) { + if (expression) return; + + var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); + console.log("ASSERT: " + message); +}; + +//------------------------------------------------------------------------------ +console.clear = function() {}; + +//------------------------------------------------------------------------------ +console.dir = function(object) { + console.log("%o", object); +}; + +//------------------------------------------------------------------------------ +console.dirxml = function(node) { + console.log(node.innerHTML); +}; + +//------------------------------------------------------------------------------ +console.trace = noop; + +//------------------------------------------------------------------------------ +console.group = console.log; + +//------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +//------------------------------------------------------------------------------ +console.groupEnd = noop; + +//------------------------------------------------------------------------------ +console.time = function(name) { + Timers[name] = new Date().valueOf(); +}; + +//------------------------------------------------------------------------------ +console.timeEnd = function(name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn("unknown timer: " + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ": " + timeElapsed + "ms"); +}; + +//------------------------------------------------------------------------------ +console.timeStamp = noop; + +//------------------------------------------------------------------------------ +console.profile = noop; + +//------------------------------------------------------------------------------ +console.profileEnd = noop; + +//------------------------------------------------------------------------------ +console.count = noop; + +//------------------------------------------------------------------------------ +console.exception = console.log; + +//------------------------------------------------------------------------------ +console.table = function(data, columns) { + console.log("%o", data); +}; + +//------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +//------------------------------------------------------------------------------ +function wrappedOrigCall(orgFunc, newFunc) { + return function() { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +//------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +//------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] == "function") { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); + +// file: lib/common/plugin/contacts.js +define("cordova/plugin/contacts", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'), + utils = require('cordova/utils'), + Contact = require('cordova/plugin/Contact'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find:function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } else { + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(contacts.create(result[i])); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create:function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); + +// file: lib/common/plugin/contacts/symbols.js +define("cordova/plugin/contacts/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts'); +modulemapper.clobbers('cordova/plugin/Contact', 'Contact'); +modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress'); +modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError'); +modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField'); +modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions'); +modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName'); +modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization'); + +}); + +// file: lib/common/plugin/device.js +define("cordova/plugin/device", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.name = null; + this.uuid = null; + this.cordova = null; + this.model = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.name = info.name; + me.uuid = info.uuid; + me.cordova = info.cordova; + me.model = info.model; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); + +// file: lib/common/plugin/device/symbols.js +define("cordova/plugin/device/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/device', 'device'); + +}); + +// file: lib/common/plugin/echo.js +define("cordova/plugin/echo", function(require, exports, module) { + +var exec = require('cordova/exec'), + utils = require('cordova/utils'); + +/** + * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback. + * @param successCallback invoked with a FileSystem object + * @param errorCallback invoked if error occurs retrieving file system + * @param message The string to be echoed. + * @param forceAsync Whether to force an async return value (for testing native->js bridge). + */ +module.exports = function(successCallback, errorCallback, message, forceAsync) { + var action = 'echo'; + var messageIsMultipart = (utils.typeName(message) == "Array"); + var args = messageIsMultipart ? message : [message]; + + if (utils.typeName(message) == 'ArrayBuffer') { + if (forceAsync) { + console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.'); + } + action += 'ArrayBuffer'; + } else if (messageIsMultipart) { + if (forceAsync) { + console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.'); + } + action += 'MultiPart'; + } else if (forceAsync) { + action += 'Async'; + } + + exec(successCallback, errorCallback, "Echo", action, args); +}; + + +}); + +// file: lib/ios/plugin/file/symbols.js +define("cordova/plugin/file/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'), + symbolshelper = require('cordova/plugin/file/symbolshelper'); + +symbolshelper(modulemapper.clobbers); +modulemapper.merges('cordova/plugin/ios/Entry', 'Entry'); + +}); + +// file: lib/common/plugin/file/symbolshelper.js +define("cordova/plugin/file/symbolshelper", function(require, exports, module) { + +module.exports = function(exportFunc) { + exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry'); + exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader'); + exportFunc('cordova/plugin/Entry', 'Entry'); + exportFunc('cordova/plugin/File', 'File'); + exportFunc('cordova/plugin/FileEntry', 'FileEntry'); + exportFunc('cordova/plugin/FileError', 'FileError'); + exportFunc('cordova/plugin/FileReader', 'FileReader'); + exportFunc('cordova/plugin/FileSystem', 'FileSystem'); + exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions'); + exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult'); + exportFunc('cordova/plugin/FileWriter', 'FileWriter'); + exportFunc('cordova/plugin/Flags', 'Flags'); + exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem'); + exportFunc('cordova/plugin/Metadata', 'Metadata'); + exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent'); + exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem'); + exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI'); +}; + +}); + +// file: lib/common/plugin/filetransfer/symbols.js +define("cordova/plugin/filetransfer/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer'); +modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError'); + +}); + +// file: lib/common/plugin/geolocation.js +define("cordova/plugin/geolocation", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + PositionError = require('cordova/plugin/PositionError'), + Position = require('cordova/plugin/Position'); + +var timers = {}; // list of timers in use + +// Returns default params, overrides if provided with values +function parseParameters(options) { + var opt = { + maximumAge: 0, + enableHighAccuracy: false, + timeout: Infinity + }; + + if (options) { + if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { + opt.maximumAge = options.maximumAge; + } + if (options.enableHighAccuracy !== undefined) { + opt.enableHighAccuracy = options.enableHighAccuracy; + } + if (options.timeout !== undefined && !isNaN(options.timeout)) { + if (options.timeout < 0) { + opt.timeout = 0; + } else { + opt.timeout = options.timeout; + } + } + } + + return opt; +} + +// Returns a timeout failure, closed over a specified timeout value and error callback. +function createTimeout(errorCallback, timeout) { + var t = setTimeout(function() { + clearTimeout(t); + t = null; + errorCallback({ + code:PositionError.TIMEOUT, + message:"Position retrieval timed out." + }); + }, timeout); + return t; +} + +var geolocation = { + lastPosition:null, // reference to last known (cached) position returned + /** + * Asynchronously acquires the current position. + * + * @param {Function} successCallback The function to call when the position data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) + * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) + */ + getCurrentPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + // Timer var that will fire an error callback if no position is retrieved from native + // before the "timeout" param provided expires + var timeoutTimer = {timer:null}; + + var win = function(p) { + clearTimeout(timeoutTimer.timer); + if (!(timeoutTimer.timer)) { + // Timeout already happened, or native fired error callback for + // this geo request. + // Don't continue with success callback. + return; + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + var fail = function(e) { + clearTimeout(timeoutTimer.timer); + timeoutTimer.timer = null; + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just + // fire the success callback with the cached position. + if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { + successCallback(geolocation.lastPosition); + // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. + } else if (options.timeout === 0) { + fail({ + code:PositionError.TIMEOUT, + message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter." + }); + // Otherwise we have to call into native to retrieve a position. + } else { + if (options.timeout !== Infinity) { + // If the timeout value was not set to Infinity (default), then + // set up a timeout function that will fire the error callback + // if no successful position was retrieved before timeout expired. + timeoutTimer.timer = createTimeout(fail, options.timeout); + } else { + // This is here so the check in the win function doesn't mess stuff up + // may seem weird but this guarantees timeoutTimer is + // always truthy before we call into native + timeoutTimer.timer = true; + } + exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); + } + return timeoutTimer; + }, + /** + * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, + * the successCallback is called with the new location. + * + * @param {Function} successCallback The function to call each time the location data is available + * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchPosition:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments); + options = parseParameters(options); + + var id = utils.createUUID(); + + // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition + timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); + + var fail = function(e) { + clearTimeout(timers[id].timer); + var err = new PositionError(e.code, e.message); + if (errorCallback) { + errorCallback(err); + } + }; + + var win = function(p) { + clearTimeout(timers[id].timer); + if (options.timeout !== Infinity) { + timers[id].timer = createTimeout(fail, options.timeout); + } + var pos = new Position( + { + latitude:p.latitude, + longitude:p.longitude, + altitude:p.altitude, + accuracy:p.accuracy, + heading:p.heading, + velocity:p.velocity, + altitudeAccuracy:p.altitudeAccuracy + }, + (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + ); + geolocation.lastPosition = pos; + successCallback(pos); + }; + + exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); + + return id; + }, + /** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchPosition + */ + clearWatch:function(id) { + if (id && timers[id] !== undefined) { + clearTimeout(timers[id].timer); + timers[id].timer = false; + exec(null, null, "Geolocation", "clearWatch", [id]); + } + } +}; + +module.exports = geolocation; + +}); + +// file: lib/common/plugin/geolocation/symbols.js +define("cordova/plugin/geolocation/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation'); +modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError'); +modulemapper.clobbers('cordova/plugin/Position', 'Position'); +modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates'); + +}); + +// file: lib/common/plugin/globalization.js +define("cordova/plugin/globalization", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + GlobalizationError = require('cordova/plugin/GlobalizationError'); + +var globalization = { + +/** +* Returns the string identifier for the client's current language. +* It returns the language identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the language, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The language identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');}, +* function () {}); +*/ +getPreferredLanguage:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments); + exec(successCB, failureCB, "Globalization","getPreferredLanguage", []); +}, + +/** +* Returns the string identifier for the client's current locale setting. +* It returns the locale identifier string to the successCB callback with a +* properties object as a parameter. If there is an error getting the locale, +* then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {String}: The locale identifier +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');}, +* function () {}); +*/ +getLocaleName:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments); + exec(successCB, failureCB, "Globalization","getLocaleName", []); +}, + + +/** +* Returns a date formatted as a string according to the client's user preferences and +* calendar using the time zone of the client. It returns the formatted date string to the +* successCB callback with a properties object as a parameter. If there is an error +* formatting the date, then the errorCB callback is invoked. +* +* The defaults are: formatLenght="short" and selector="date and time" +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.value {String}: The localized date string +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.dateToString(new Date(), +* function (date) {alert('date:' + date.value + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {formatLength:'short'}); +*/ +dateToString:function(date, successCB, failureCB, options) { + argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]); +}, + + +/** +* Parses a date formatted as a string according to the client's user +* preferences and calendar using the time zone of the client and returns +* the corresponding date object. It returns the date to the successCB +* callback with a properties object as a parameter. If there is an error +* parsing the date string, then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {String} dateString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.year {Number}: The four digit year +* Object.month {Number}: The month from (0 - 11) +* Object.day {Number}: The day from (1 - 31) +* Object.hour {Number}: The hour from (0 - 23) +* Object.minute {Number}: The minute from (0 - 59) +* Object.second {Number}: The second from (0 - 59) +* Object.millisecond {Number}: The milliseconds (from 0 - 999), +* not available on all platforms +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToDate('4/11/2011', +* function (date) { alert('Month:' + date.month + '\n' + +* 'Day:' + date.day + '\n' + +* 'Year:' + date.year + '\n');}, +* function (errorCode) {alert(errorCode);}, +* {selector:'date'}); +*/ +stringToDate:function(dateString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments); + exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]); +}, + + +/** +* Returns a pattern string for formatting and parsing dates according to the client's +* user preferences. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, +* then the errorCB callback is invoked. +* +* The defaults are: formatLength="short" and selector="date and time" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* formatLength {String}: 'short', 'medium', 'long', or 'full' +* selector {String}: 'date', 'time', or 'date and time' +* +* @return Object.pattern {String}: The date and time pattern for formatting and parsing dates. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.timezone {String}: The abbreviated name of the time zone on the client +* Object.utc_offset {Number}: The current difference in seconds between the client's +* time zone and coordinated universal time. +* Object.dst_offset {Number}: The current daylight saving time offset in seconds +* between the client's non-daylight saving's time zone +* and the client's daylight saving's time zone. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getDatePattern( +* function (date) {alert('pattern:' + date.pattern + '\n');}, +* function () {}, +* {formatLength:'short'}); +*/ +getDatePattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments); + exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]); +}, + + +/** +* Returns an array of either the names of the months or days of the week +* according to the client's user preferences and calendar. It returns the array of names to the +* successCB callback with a properties object as a parameter. If there is an error obtaining the +* names, then the errorCB callback is invoked. +* +* The defaults are: type="wide" and item="months" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'narrow' or 'wide' +* item {String}: 'months', or 'days' +* +* @return Object.value {Array{String}}: The array of names starting from either +* the first month in the year or the +* first day of the week. +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getDateNames(function (names) { +* for(var i = 0; i < names.value.length; i++) { +* alert('Month:' + names.value[i] + '\n');}}, +* function () {}); +*/ +getDateNames:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments); + exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]); +}, + +/** +* Returns whether daylight savings time is in effect for a given date using the client's +* time zone and calendar. It returns whether or not daylight savings time is in effect +* to the successCB callback with a properties object as a parameter. If there is an error +* reading the date, then the errorCB callback is invoked. +* +* @param {Date} date +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is +* in effect for the given date and "false" indicate that it is not. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.isDayLightSavingsTime(new Date(), +* function (date) {alert('dst:' + date.dst + '\n');} +* function () {}); +*/ +isDayLightSavingsTime:function(date, successCB, failureCB) { + argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments); + var dateValue = date.valueOf(); + exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]); +}, + +/** +* Returns the first day of the week according to the client's user preferences and calendar. +* The days of the week are numbered starting from 1 where 1 is considered to be Sunday. +* It returns the day to the successCB callback with a properties object as a parameter. +* If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.value {Number}: The number of the first day of the week. +* +* @error GlobalizationError.UNKNOWN_ERROR +* +* Example +* globalization.getFirstDayOfWeek(function (day) +* { alert('Day:' + day.value + '\n');}, +* function () {}); +*/ +getFirstDayOfWeek:function(successCB, failureCB) { + argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments); + exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []); +}, + + +/** +* Returns a number formatted as a string according to the client's user preferences. +* It returns the formatted number string to the successCB callback with a properties object as a +* parameter. If there is an error formatting the number, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Number} number +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {String}: The formatted number string. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.numberToString(3.25, +* function (number) {alert('number:' + number.value + '\n');}, +* function () {}, +* {type:'decimal'}); +*/ +numberToString:function(number, successCB, failureCB, options) { + argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments); + exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]); +}, + +/** +* Parses a number formatted as a string according to the client's user preferences and +* returns the corresponding number. It returns the number to the successCB callback with a +* properties object as a parameter. If there is an error parsing the number string, then +* the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {String} numberString +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.value {Number}: The parsed number. +* +* @error GlobalizationError.PARSING_ERROR +* +* Example +* globalization.stringToNumber('1234.56', +* function (number) {alert('Number:' + number.value + '\n');}, +* function () { alert('Error parsing number');}); +*/ +stringToNumber:function(numberString, successCB, failureCB, options) { + argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments); + exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing numbers according to the client's user +* preferences. It returns the pattern to the successCB callback with a properties object as a +* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked. +* +* The defaults are: type="decimal" +* +* @param {Function} successCB +* @param {Function} errorCB +* @param {Object} options {optional} +* type {String}: 'decimal', "percent", or 'currency' +* +* @return Object.pattern {String}: The number pattern for formatting and parsing numbers. +* The patterns follow Unicode Technical Standard #35. +* http://unicode.org/reports/tr35/tr35-4.html +* Object.symbol {String}: The symbol to be used when formatting and parsing +* e.g., percent or currency symbol. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting numbers. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.positive {String}: The symbol to use for positive numbers when parsing and formatting. +* Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.PATTERN_ERROR +* +* Example +* globalization.getNumberPattern( +* function (pattern) {alert('Pattern:' + pattern.pattern + '\n');}, +* function () {}); +*/ +getNumberPattern:function(successCB, failureCB, options) { + argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments); + exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]); +}, + +/** +* Returns a pattern string for formatting and parsing currency values according to the client's +* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a +* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB +* callback is invoked. +* +* @param {String} currencyCode +* @param {Function} successCB +* @param {Function} errorCB +* +* @return Object.pattern {String}: The currency pattern for formatting and parsing currency values. +* The patterns follow Unicode Technical Standard #35 +* http://unicode.org/reports/tr35/tr35-4.html +* Object.code {String}: The ISO 4217 currency code for the pattern. +* Object.fraction {Number}: The number of fractional digits to use when parsing and +* formatting currency. +* Object.rounding {Number}: The rounding increment to use when parsing and formatting. +* Object.decimal: {String}: The decimal symbol to use for parsing and formatting. +* Object.grouping: {String}: The grouping symbol to use for parsing and formatting. +* +* @error GlobalizationError.FORMATTING_ERROR +* +* Example +* globalization.getCurrencyPattern('EUR', +* function (currency) {alert('Pattern:' + currency.pattern + '\n');} +* function () {}); +*/ +getCurrencyPattern:function(currencyCode, successCB, failureCB) { + argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments); + exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]); +} + +}; + +module.exports = globalization; + +}); + +// file: lib/common/plugin/globalization/symbols.js +define("cordova/plugin/globalization/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization'); +modulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError'); + +}); + +// file: lib/ios/plugin/inappbrowser/symbols.js +define("cordova/plugin/inappbrowser/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/InAppBrowser', 'open'); + +}); + +// file: lib/ios/plugin/ios/Contact.js +define("cordova/plugin/ios/Contact", function(require, exports, module) { + +var exec = require('cordova/exec'), + ContactError = require('cordova/plugin/ContactError'); + +/** + * Provides iOS Contact.display API. + */ +module.exports = { + display : function(errorCB, options) { + /* + * Display a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + */ + + if (this.id === null) { + if (typeof errorCB === "function") { + var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); + errorCB(errorObj); + } + } + else { + exec(null, errorCB, "Contacts","displayContact", [this.id, options]); + } + } +}; + +}); + +// file: lib/ios/plugin/ios/Entry.js +define("cordova/plugin/ios/Entry", function(require, exports, module) { + +module.exports = { + toURL:function() { + // TODO: refactor path in a cross-platform way so we can eliminate + // these kinds of platform-specific hacks. + return "file://localhost" + this.fullPath; + }, + toURI: function() { + console.log("DEPRECATED: Update your code to use 'toURL'"); + return "file://localhost" + this.fullPath; + } +}; + +}); + +// file: lib/ios/plugin/ios/contacts.js +define("cordova/plugin/ios/contacts", function(require, exports, module) { + +var exec = require('cordova/exec'); + +/** + * Provides iOS enhanced contacts API. + */ +module.exports = { + newContactUI : function(successCallback) { + /* + * Create a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * returns: the id of the created contact as param to successCallback + */ + exec(successCallback, null, "Contacts","newContact", []); + }, + chooseContact : function(successCallback, options) { + /* + * Select a contact using the iOS Contact Picker UI + * NOT part of W3C spec so no official documentation + * + * @param errorCB error callback + * @param options object + * allowsEditing: boolean AS STRING + * "true" to allow editing the contact + * "false" (default) display contact + * fields: array of fields to return in contact object (see ContactOptions.fields) + * + * @returns + * id of contact selected + * ContactObject + * if no fields provided contact contains just id information + * if fields provided contact object contains information for the specified fields + * + */ + var win = function(result) { + var fullContact = require('cordova/plugin/contacts').create(result); + successCallback(fullContact.id, fullContact); + }; + exec(win, null, "Contacts","chooseContact", [options]); + } +}; + +}); + +// file: lib/ios/plugin/ios/contacts/symbols.js +define("cordova/plugin/ios/contacts/symbols", function(require, exports, module) { + +require('cordova/plugin/contacts/symbols'); + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.merges('cordova/plugin/ios/contacts', 'navigator.contacts'); +modulemapper.merges('cordova/plugin/ios/Contact', 'Contact'); + +}); + +// file: lib/ios/plugin/ios/geolocation/symbols.js +define("cordova/plugin/ios/geolocation/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.merges('cordova/plugin/geolocation', 'navigator.geolocation'); + +}); + +// file: lib/ios/plugin/ios/logger/plugininit.js +define("cordova/plugin/ios/logger/plugininit", function(require, exports, module) { + +// use the native logger +var logger = require("cordova/plugin/logger"); +logger.useConsole(false); + +}); + +// file: lib/ios/plugin/ios/logger/symbols.js +define("cordova/plugin/ios/logger/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/logger', 'console'); + +}); + +// file: lib/ios/plugin/ios/notification.js +define("cordova/plugin/ios/notification", function(require, exports, module) { + +var Media = require('cordova/plugin/Media'); + +module.exports = { + beep:function(count) { + (new Media('beep.wav')).play(); + } +}; + +}); + +// file: lib/common/plugin/logger.js +define("cordova/plugin/logger", function(require, exports, module) { + +//------------------------------------------------------------------------------ +// The logger module exports the following properties/functions: +// +// LOG - constant for the level LOG +// ERROR - constant for the level ERROR +// WARN - constant for the level WARN +// INFO - constant for the level INFO +// DEBUG - constant for the level DEBUG +// logLevel() - returns current log level +// logLevel(value) - sets and returns a new log level +// useConsole() - returns whether logger is using console +// useConsole(value) - sets and returns whether logger is using console +// log(message,...) - logs a message at level LOG +// error(message,...) - logs a message at level ERROR +// warn(message,...) - logs a message at level WARN +// info(message,...) - logs a message at level INFO +// debug(message,...) - logs a message at level DEBUG +// logLevel(level,message,...) - logs a message specified level +// +//------------------------------------------------------------------------------ + +var logger = exports; + +var exec = require('cordova/exec'); +var utils = require('cordova/utils'); + +var UseConsole = true; +var Queued = []; +var DeviceReady = false; +var CurrentLevel; + +/** + * Logging levels + */ + +var Levels = [ + "LOG", + "ERROR", + "WARN", + "INFO", + "DEBUG" +]; + +/* + * add the logging levels to the logger object and + * to a separate levelsMap object for testing + */ + +var LevelsMap = {}; +for (var i=0; i CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // if not using the console, use the native logger + if (!UseConsole) { + exec(null, null, "Logger", "logLevel", [level, message]); + return; + } + + // make sure console is not using logger + if (console.__usingCordovaLogger) { + throw new Error("console and logger are too intertwingly"); + } + + // log to the console + switch (level) { + case logger.LOG: console.log(message); break; + case logger.ERROR: console.log("ERROR: " + message); break; + case logger.WARN: console.log("WARN: " + message); break; + case logger.INFO: console.log("INFO: " + message); break; + case logger.DEBUG: console.log("DEBUG: " + message); break; + } +}; + + +/** + * Formats a string and arguments following it ala console.log() + * + * Any remaining arguments will be appended to the formatted string. + * + * for rationale, see FireBug's Console API: + * http://getfirebug.com/wiki/index.php/Console_API + */ +logger.format = function(formatString, args) { + return __format(arguments[0], [].slice.call(arguments,1)).join(' '); +}; + + +//------------------------------------------------------------------------------ +/** + * Formats a string and arguments following it ala vsprintf() + * + * format chars: + * %j - format arg as JSON + * %o - format arg as JSON + * %c - format arg as '' + * %% - replace with '%' + * any other char following % will format it's + * arg via toString(). + * + * Returns an array containing the formatted string and any remaining + * arguments. + */ +function __format(formatString, args) { + if (formatString === null || formatString === undefined) return [""]; + if (arguments.length == 1) return [formatString.toString()]; + + if (typeof formatString != "string") + formatString = formatString.toString(); + + var pattern = /(.*?)%(.)(.*)/; + var rest = formatString; + var result = []; + + while (args.length) { + var match = pattern.exec(rest); + if (!match) break; + + var arg = args.shift(); + rest = match[3]; + result.push(match[1]); + + if (match[2] == '%') { + result.push('%'); + args.unshift(arg); + continue; + } + + result.push(__formatted(arg, match[2])); + } + + result.push(rest); + + var remainingArgs = [].slice.call(args); + remainingArgs.unshift(result.join('')); + return remainingArgs; +} + +function __formatted(object, formatChar) { + + try { + switch(formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; + } + } + catch (e) { + return "error JSON.stringify()ing argument: " + e; + } + + if ((object === null) || (object === undefined)) { + return Object.prototype.toString.call(object); + } + + return object.toString(); +} + + +//------------------------------------------------------------------------------ +// when deviceready fires, log queued messages +logger.__onDeviceReady = function() { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i=0; i 3) { + fail(FileError.SYNTAX_ERR); + } else { + // if successful, return a FileSystem object + var success = function(file_system) { + if (file_system) { + if (successCallback) { + // grab the name and root from the file system object + var result = new FileSystem(file_system.name, file_system.root); + successCallback(result); + } + } + else { + // no FileSystem object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + exec(success, fail, "File", "requestFileSystem", [type, size]); + } +}; + +module.exports = requestFileSystem; + +}); + +// file: lib/common/plugin/resolveLocalFileSystemURI.js +define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { + +var argscheck = require('cordova/argscheck'), + DirectoryEntry = require('cordova/plugin/DirectoryEntry'), + FileEntry = require('cordova/plugin/FileEntry'), + FileError = require('cordova/plugin/FileError'), + exec = require('cordova/exec'); + +/** + * Look up file system Entry referred to by local URI. + * @param {DOMString} uri URI referring to a local file or directory + * @param successCallback invoked with Entry object corresponding to URI + * @param errorCallback invoked if error occurs retrieving file system entry + */ +module.exports = function(uri, successCallback, errorCallback) { + argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); + // error callback + var fail = function(error) { + errorCallback && errorCallback(new FileError(error)); + }; + // sanity check for 'not:valid:filename' + if(!uri || uri.split(":").length > 2) { + setTimeout( function() { + fail(FileError.ENCODING_ERR); + },0); + return; + } + // if successful, return either a file or directory entry + var success = function(entry) { + var result; + if (entry) { + if (successCallback) { + // create appropriate Entry object + result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); + successCallback(result); + } + } + else { + // no Entry object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + + exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); +}; + +}); + +// file: lib/common/plugin/splashscreen.js +define("cordova/plugin/splashscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var splashscreen = { + show:function() { + exec(null, null, "SplashScreen", "show", []); + }, + hide:function() { + exec(null, null, "SplashScreen", "hide", []); + } +}; + +module.exports = splashscreen; + +}); + +// file: lib/common/plugin/splashscreen/symbols.js +define("cordova/plugin/splashscreen/symbols", function(require, exports, module) { + + +var modulemapper = require('cordova/modulemapper'); + +modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen'); + +}); + +// file: lib/common/symbols.js +define("cordova/symbols", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Use merges here in case others symbols files depend on this running first, +// but fail to declare the dependency with a require(). +modulemapper.merges('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +}); + +// file: lib/common/utils.js +define("cordova/utils", function(require, exports, module) { + +var utils = exports; + +/** + * Defines a property getter / setter for obj[key]. + */ +utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) { + if (Object.defineProperty) { + var desc = { + get: getFunc, + configurable: true + }; + if (opt_setFunc) { + desc.set = opt_setFunc; + } + Object.defineProperty(obj, key, desc); + } else { + obj.__defineGetter__(key, getFunc); + if (opt_setFunc) { + obj.__defineSetter__(key, opt_setFunc); + } + } +}; + +/** + * Defines a property getter for obj[key]. + */ +utils.defineGetter = utils.defineGetterSetter; + +utils.arrayIndexOf = function(a, item) { + if (a.indexOf) { + return a.indexOf(item); + } + var len = a.length; + for (var i = 0; i < len; ++i) { + if (a[i] == item) { + return i; + } + } + return -1; +}; + +/** + * Returns whether the item was found in the array. + */ +utils.arrayRemove = function(a, item) { + var index = utils.arrayIndexOf(a, item); + if (index != -1) { + a.splice(index, 1); + } + return index != -1; +}; + +utils.typeName = function(val) { + return Object.prototype.toString.call(val).slice(8, -1); +}; + +/** + * Returns an indication of whether the argument is an array or not + */ +utils.isArray = function(a) { + return utils.typeName(a) == 'Array'; +}; + +/** + * Returns an indication of whether the argument is a Date or not + */ +utils.isDate = function(d) { + return utils.typeName(d) == 'Date'; +}; + +/** + * Does a deep clone of the object. + */ +utils.clone = function(obj) { + if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') { + return obj; + } + + var retVal, i; + + if(utils.isArray(obj)){ + retVal = []; + for(i = 0; i < obj.length; ++i){ + retVal.push(utils.clone(obj[i])); + } + return retVal; + } + + retVal = {}; + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = utils.clone(obj[i]); + } + } + return retVal; +}; + +/** + * Returns a wrapped version of the function + */ +utils.close = function(context, func, params) { + if (typeof params == 'undefined') { + return function() { + return func.apply(context, arguments); + }; + } else { + return function() { + return func.apply(context, params); + }; + } +}; + +/** + * Create a UUID + */ +utils.createUUID = function() { + return UUIDcreatePart(4) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(2) + '-' + + UUIDcreatePart(6); +}; + +/** + * Extends a child object from a parent object using classical inheritance + * pattern. + */ +utils.extend = (function() { + // proxy used to establish prototype chain + var F = function() {}; + // extend Child from Parent + return function(Child, Parent) { + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.__super__ = Parent.prototype; + Child.prototype.constructor = Child; + }; +}()); + +/** + * Alerts a message in any available way: alert or console.log. + */ +utils.alert = function(msg) { + if (window.alert) { + window.alert(msg); + } else if (console && console.log) { + console.log(msg); + } +}; + + +//------------------------------------------------------------------------------ +function UUIDcreatePart(length) { + var uuidpart = ""; + for (var i=0; i tag. + function injectScript(path) { + scriptCounter++; + var script = document.createElement("script"); + script.onload = scriptLoadedCallback; + script.src = path; + document.head.appendChild(script); + } + + // Called when: + // * There are plugins defined and all plugins are finished loading. + // * There are no plugins to load. + function finishPluginLoading() { + context.cordova.require('cordova/channel').onPluginsReady.fire(); + } + + // Handler for the cordova_plugins.json content. + // See plugman's plugin_loader.js for the details of this object. + // This function is only called if the really is a plugins array that isn't empty. + // Otherwise the XHR response handler will just call finishPluginLoading(). + function handlePluginsObject(modules) { + // First create the callback for when all plugins are loaded. + var mapper = context.cordova.require('cordova/modulemapper'); + onScriptLoadingComplete = function() { + // Loop through all the plugins and then through their clobbers and merges. + for (var i = 0; i < modules.length; i++) { + var module = modules[i]; + if (!module) continue; + + if (module.clobbers && module.clobbers.length) { + for (var j = 0; j < module.clobbers.length; j++) { + mapper.clobbers(module.id, module.clobbers[j]); + } + } + + if (module.merges && module.merges.length) { + for (var k = 0; k < module.merges.length; k++) { + mapper.merges(module.id, module.merges[k]); + } + } + + // Finally, if runs is truthy we want to simply require() the module. + // This can be skipped if it had any merges or clobbers, though, + // since the mapper will already have required the module. + if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) { + context.cordova.require(module.id); + } + } + + finishPluginLoading(); + }; + + // Now inject the scripts. + for (var i = 0; i < modules.length; i++) { + injectScript(modules[i].file); + } + } + + + // Try to XHR the cordova_plugins.json file asynchronously. + try { // we commented we were going to try, so let us actually try and catch + var xhr = new context.XMLHttpRequest(); + xhr.onload = function() { + // If the response is a JSON string which composes an array, call handlePluginsObject. + // If the request fails, or the response is not a JSON array, just call finishPluginLoading. + var obj = this.responseText && JSON.parse(this.responseText); + if (obj && obj instanceof Array && obj.length > 0) { + handlePluginsObject(obj); + } else { + finishPluginLoading(); + } + }; + xhr.onerror = function() { + finishPluginLoading(); + }; + xhr.open('GET', 'cordova_plugins.json', true); // Async + xhr.send(); + } + catch(err){ + finishPluginLoading(); + } +}(window)); + + + +})(); \ No newline at end of file diff --git a/archive/litenull_rewrite/app/scripts/vendor/facebook-js-sdk.js b/archive/litenull_rewrite/app/scripts/vendor/facebook-js-sdk.js new file mode 100755 index 0000000000..3062aed105 --- /dev/null +++ b/archive/litenull_rewrite/app/scripts/vendor/facebook-js-sdk.js @@ -0,0 +1,14638 @@ +/*1329323125,171364642,JIT Construction: v510186,en_US*/ + +/** + * Copyright Facebook Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * + * @provides fb.prelude + */ + +/** + * Prelude. + * + * Namespaces are one honking great idea -- let's do more of those! + * -- Tim Peters + * + * The Prelude is what keeps us from being messy. In order to co-exist with + * arbitary environments, we need to control our footprint. The one and only + * rule to follow here is that we need to limit the globals we introduce. The + * only global we should every have is ``FB``. This is exactly what the prelude + * enables us to do. + * + * The main method to take away from this file is `FB.copy()`_. As the name + * suggests it copies things. Its powerful -- but to get started you only need + * to know that this is what you use when you are augmenting the FB object. For + * example, this is skeleton for how ``FB.Event`` is defined:: + * + * FB.provide('Event', { + * subscribe: function() { ... }, + * unsubscribe: function() { ... }, + * fire: function() { ... } + * }); + * + * This is similar to saying:: + * + * FB.Event = { + * subscribe: function() { ... }, + * unsubscribe: function() { ... }, + * fire: function() { ... } + * }; + * + * Except it does some housekeeping, prevents redefinition by default and other + * goodness. + * + * .. _FB.copy(): #method_FB.copy + * + * @class FB + * @static + * @access private + */ +if (!window.FB) { + window.FB = { + // use the init method to set these values correctly + _apiKey : null, + _authResponse : null, + _userStatus : 'unknown', // or 'notConnected' or 'connected' + + // logging is enabled by default. this is the logging shown to the + // developer and not at all noisy. + _logging: true, + _inCanvas: ( + (window.name.indexOf('iframe_canvas') > -1) || + (window.name.indexOf('app_runner') > -1)), + + // Determines if we should use HTTPS when attempting cross-domain + // communication with facebook.com. This is assumed to be the case when + // window.name contains "_fb_https". This value may also be set by the + // response from FB.login() or FB.getLoginStatus() + _https: (window.name.indexOf('_fb_https') > -1), + + // + // DYNAMIC DATA + // + // the various domains needed for using Connect + _domain: { + api : 'https://api.facebook.com/', + api_read : 'https://api-read.facebook.com/', + cdn : 'http://static.ak.fbcdn.net/', + https_cdn : 'https://s-static.ak.fbcdn.net/', + graph : 'https://graph.facebook.com/', + staticfb : 'http://static.ak.facebook.com/', + https_staticfb : 'https://s-static.ak.facebook.com/', + www : 'http://www.facebook.com/', + https_www : 'https://www.facebook.com/', + m : 'http://m.facebook.com/', + https_m : 'https://m.facebook.com/' + }, + _locale: null, + _localeIsRtl: false, + + + // CORDOVA PATCH + _nativeInterface : null, + + /** + * Retrieve one of the various domains needed for Connect. + * + * @access private + * @param domain (String) The domain to retrieve + * @param noForcedHTTPS (bool) Do not force https domain + */ + getDomain: function(domain, noForcedHTTPS) { + var forceHTTPS = !noForcedHTTPS && + (window.location.protocol == 'https:' || FB._https); + switch (domain) { + case 'api': + return FB._domain.api; + case 'api_read': + return FB._domain.api_read; + case 'cdn': + return forceHTTPS ? FB._domain.https_cdn : FB._domain.cdn; + case 'cdn_foreign': + return FB._domain.cdn_foreign; + case 'https_cdn': + return FB._domain.https_cdn; + case 'graph': + return FB._domain.graph; + case 'staticfb': + return forceHTTPS ? FB._domain.https_staticfb : FB._domain.staticfb; + case 'https_staticfb': + return FB._domain.https_staticfb; + case 'www': + return forceHTTPS ? FB._domain.https_www : FB._domain.www; + case 'https_www': + return FB._domain.https_www; + case 'm': + return forceHTTPS ? FB._domain.https_m : FB._domain.m; + case 'https_m': + return FB._domain.https_m; + } + }, + + /** + * Copies things from source into target. + * + * @access private + * @param target {Object} the target object where things will be copied + * into + * @param source {Object} the source object where things will be copied + * from + * @param overwrite {Boolean} indicate if existing items should be + * overwritten + * @param transform {function} [Optional], transformation function for + * each item + */ + copy: function(target, source, overwrite, transform) { + for (var key in source) { + if (overwrite || typeof target[key] === 'undefined') { + target[key] = transform ? transform(source[key]) : source[key]; + } + } + return target; + }, + + /** + * Create a namespaced object. + * + * @access private + * @param name {String} full qualified name ('Util.foo', etc.) + * @param value {Object} value to set. Default value is {}. [Optional] + * @return {Object} The created object + */ + create: function(name, value) { + var node = window.FB, // We will use 'FB' as root namespace + nameParts = name ? name.split('.') : [], + c = nameParts.length; + for (var i = 0; i < c; i++) { + var part = nameParts[i]; + var nso = node[part]; + if (!nso) { + nso = (value && i + 1 == c) ? value : {}; + node[part] = nso; + } + node = nso; + } + return node; + }, + + /** + * Copy stuff from one object to the specified namespace that + * is FB.. + * If the namespace target doesn't exist, it will be created automatically. + * + * @access private + * @param target {Object|String} the target object to copy into + * @param source {Object} the source object to copy from + * @param overwrite {Boolean} indicate if we should overwrite + * @return {Object} the *same* target object back + */ + provide: function(target, source, overwrite) { + // a string means a dot separated object that gets appended to, or created + return FB.copy( + typeof target == 'string' ? FB.create(target) : target, + source, + overwrite + ); + }, + + /** + * Generates a weak random ID. + * + * @access private + * @return {String} a random ID + */ + guid: function() { + return 'f' + (Math.random() * (1<<30)).toString(16).replace('.', ''); + }, + + /** + * Logs a message for the developer if logging is on. + * + * @access private + * @param args {Object} the thing to log + */ + log: function(args) { + if (FB._logging) { + //TODO what is window.Debug, and should it instead be relying on the + // event fired below? +//#JSCOVERAGE_IF 0 + if (window.Debug && window.Debug.writeln) { + window.Debug.writeln(args); + } else if (window.console) { + window.console.log(args); + } +//#JSCOVERAGE_ENDIF + } + + // fire an event if the event system is available + if (FB.Event) { + FB.Event.fire('fb.log', args); + } + }, + + /** + * Shortcut for document.getElementById + * @method $ + * @param {string} DOM id + * @return DOMElement + * @access private + */ + $: function(id) { + return document.getElementById(id); + } + }; +} + +/** + * Copyright Facebook Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @provides fb.array + * @layer basic + * @requires fb.prelude + */ + +/** + * Array related helper methods. + * + * @class FB.Array + * @private + * @static + */ +FB.provide('Array', { + /** + * Get index of item inside an array. Return's -1 if element is not found. + * + * @param arr {Array} Array to look through. + * @param item {Object} Item to locate. + * @return {Number} Index of item. + */ + indexOf: function (arr, item) { + if (arr.indexOf) { + return arr.indexOf(item); + } + var length = arr.length; + if (length) { + for (var index = 0; index < length; index++) { + if (arr[index] === item) { + return index; + } + } + } + return -1; + }, + + /** + * Merge items from source into target, but only if they dont exist. Returns + * the target array back. + * + * @param target {Array} Target array. + * @param source {Array} Source array. + * @return {Array} Merged array. + */ + merge: function(target, source) { + for (var i=0; i < source.length; i++) { + if (FB.Array.indexOf(target, source[i]) < 0) { + target.push(source[i]); + } + } + return target; + }, + + /** + * Create an new array from the given array and a filter function. + * + * @param arr {Array} Source array. + * @param fn {Function} Filter callback function. + * @return {Array} Filtered array. + */ + filter: function(arr, fn) { + var b = []; + for (var i=0; i < arr.length; i++) { + if (fn(arr[i])) { + b.push(arr[i]); + } + } + return b; + }, + + /** + * Create an array from the keys in an object. + * + * Example: keys({'x': 2, 'y': 3'}) returns ['x', 'y'] + * + * @param obj {Object} Source object. + * @param proto {Boolean} Specify true to include inherited properties. + * @return {Array} The array of keys. + */ + keys: function(obj, proto) { + var arr = []; + for (var key in obj) { + if (proto || obj.hasOwnProperty(key)) { + arr.push(key); + } + } + return arr; + }, + + /** + * Create an array by performing transformation on the items in a source + * array. + * + * @param arr {Array} Source array. + * @param transform {Function} Transformation function. + * @return {Array} The transformed array. + */ + map: function(arr, transform) { + var ret = []; + for (var i=0; i < arr.length; i++) { + ret.push(transform(arr[i])); + } + return ret; + }, + + /** + * For looping through Arrays and Objects. + * + * @param {Object} item an Array or an Object + * @param {Function} fn the callback function for iteration. + * The function will be pass (value, [index/key], item) parameters + * @param {Bool} proto indicate if properties from the prototype should + * be included + * + */ + forEach: function(item, fn, proto) { + if (!item) { + return; + } + + if (Object.prototype.toString.apply(item) === '[object Array]' || + (!(item instanceof Function) && typeof item.length == 'number')) { + if (item.forEach) { + item.forEach(fn); + } else { + for (var i=0, l=item.length; i