From 2f315aa89bfdc0be1cb84ef27809be8886e55abe Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Thu, 5 May 2011 13:36:26 +0200 Subject: [PATCH] Initial commit --- .classpath | 8 + .gitignore | 9 + AndroidManifest.xml | 43 + assets/www/css/book_text.css | 367 ++ assets/www/css/style.css | 84 + assets/www/img/spinner.gif | Bin 0 -> 2608 bytes assets/www/img/wl-logo.png | Bin 0 -> 12741 bytes assets/www/index.html | 38 + assets/www/js/assetcopy.js | 14 + assets/www/js/catalogue.js | 727 +++ assets/www/js/downloader.js | 15 + assets/www/js/phonegap.0.9.4.js | 4229 +++++++++++++++++ default.properties | 11 + gen/pl/org/nowoczesnapolska/wlmobi/R.java | 23 + initial/book_text.css | 367 ++ initial/initdb.py | 132 + initial/initial.json | 1 + libs/phonegap.0.9.4.jar | Bin 0 -> 135951 bytes proguard.cfg | 36 + res/drawable-hdpi/icon.png | Bin 0 -> 4062 bytes res/drawable-ldpi/icon.png | Bin 0 -> 1858 bytes res/drawable-mdpi/icon.png | Bin 0 -> 2532 bytes res/layout/main.xml | 12 + res/values/strings.xml | 5 + .../nowoczesnapolska/wlmobi/AssetCopy.java | 76 + .../nowoczesnapolska/wlmobi/Catalogue.java | 13 + .../nowoczesnapolska/wlmobi/Downloader.java | 96 + 27 files changed, 6306 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 AndroidManifest.xml create mode 100644 assets/www/css/book_text.css create mode 100644 assets/www/css/style.css create mode 100644 assets/www/img/spinner.gif create mode 100644 assets/www/img/wl-logo.png create mode 100644 assets/www/index.html create mode 100644 assets/www/js/assetcopy.js create mode 100644 assets/www/js/catalogue.js create mode 100644 assets/www/js/downloader.js create mode 100755 assets/www/js/phonegap.0.9.4.js create mode 100644 default.properties create mode 100644 gen/pl/org/nowoczesnapolska/wlmobi/R.java create mode 100644 initial/book_text.css create mode 100755 initial/initdb.py create mode 100644 initial/initial.json create mode 100644 libs/phonegap.0.9.4.jar create mode 100644 proguard.cfg create mode 100644 res/drawable-hdpi/icon.png create mode 100644 res/drawable-ldpi/icon.png create mode 100644 res/drawable-mdpi/icon.png create mode 100644 res/layout/main.xml create mode 100644 res/values/strings.xml create mode 100644 src/pl/org/nowoczesnapolska/wlmobi/AssetCopy.java create mode 100644 src/pl/org/nowoczesnapolska/wlmobi/Catalogue.java create mode 100644 src/pl/org/nowoczesnapolska/wlmobi/Downloader.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..f523e53 --- /dev/null +++ b/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..90786c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/bin/ +*.db + +.project +.pydevproject +.settings + + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..b92e718 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/www/css/book_text.css b/assets/www/css/book_text.css new file mode 100644 index 0000000..cc54ce3 --- /dev/null +++ b/assets/www/css/book_text.css @@ -0,0 +1,367 @@ +#book-text { + font-size: 12px; + line-height: 1.5em; + margin: 0; +} + +#book-text a { + color: blue; + text-decoration: none; +} + + +/* ================================== */ +/* = Header with logo and menu = */ +/* ================================== */ +#book-text #header { + margin: 3.4em 0 0 1.4em; +} + +#book-text img { + border: none; +} + + +#book-text #menu { + position: fixed; + left: 0em; + top: 0em; + width: 100%; + height: 1.5em; + background: #333; + color: #FFF; + opacity: 0.9; + z-index: 99; +} + +#book-text #menu ul { + list-style: none; + padding: 0; + margin: 0; +} + +#book-text #menu li a { + display: block; + float: left; + width: 7.5em; + height: 1.5em; + margin-left: 0.5em; + text-align: center; + color: #FFF; +} + +#book-text #menu li a:hover, #menu li a:active { + color: #000; + background: #FFF url(/static/img/arrow-down.png) no-repeat center right; +} + +#book-text #menu li a.selected { + color: #000; + background: #FFF url(/static/img/arrow-up.png) no-repeat center right; +} +#book-text #menu a.menu-link { + display: block; + float: left; + height: 1.5em; + margin-left: 0.5em; + text-align: center; + color: #FFF; +} +#book-text #menu span { + color: #888; + font-style: italic; + font-size: .75em; + margin-right: 0.5em; +} + + +#book-text #toc, #themes, #nota_red, #info { + position: fixed; + left: 0em; + top: 1.5em; + width: 37em; + padding: 1.5em; + background: #FFF; + border-bottom: 0.25em solid #DDD; + border-right: 0.25em solid #DDD; + display: none; + height: 16em; + overflow-x: hidden; + overflow-y: auto; + opacity: 0.9; + z-index: 99; +} + +#book-text #toc ol, #themes ol { + list-style: none; + padding: 0; + margin: 0; +} + +#book-text #toc ol li { + font-weight: bold; +} + +#book-text #toc ol ol { + padding: 0 0 1.5em 1.5em; + margin: 0; +} + +#book-text #toc ol ol li { + font-weight: normal; +} + +#book-text #toc h2 { + display: none; +} + +#book-text #toc .anchor { + float: none; + margin: 0; + color: blue; + font-size: 16px; + position: inherit; +} + +#book-text #info p { + text-align: justify; + margin: 1.5em 0 0; +} + +/* =================================================== */ +/* = Common elements: headings, paragraphs and lines = */ +/* =================================================== */ +#book-text h1 { + font-size: 2.5em; + margin: 1.5em 0; + text-align: center; + line-height: 1.5em; + font-weight: bold; +} + +#book-text h2 { + font-size: 1.7em; + margin: 1.5em 0 0; + font-weight: bold; + line-height: 1.5em; +} + +#book-text h3 { + font-size: 1.4em; + margin: 1.5em 0 0; + font-weight: normal; + line-height: 1.5em; +} + +#book-text h4 { + font-size: 1em; + margin: 1.5em 0 0; + line-height: 1.5em; +} + +#book-text p { + margin: 0; +} + +/* ======================== */ +/* = Footnotes and themes = */ +/* ======================== */ +#book-text .theme-begin { + display:none; +/* border-left: 0.1em solid #DDDDDD; + color: #777; + padding: 0 0.5em; + + font-style: normal; + font-weight: normal; + font-variant: normal; + letter-spacing: 0; + text-transform: none; + text-decoration: none; + width: 7.5em; + + font-size: 10px; + float: right; + margin-bottom: 0.5em; + clear: both; + line-height: 1.5em; + text-align: left; +*/} + +#book-text .annotation { + font-style: normal; + font-weight: normal; + font-size: 12px; + padding-left: 2px; + position: relative; + top: -4px; +} + +#book-text #footnotes { + margin-top: 3em; +} + +#book-text #footnotes .annotation { + display: block; + float: left; + width: 2.5em; + clear: both; +} + +#book-text #footnotes div { + margin: 1.5em 0 0 0; +} + +#book-text #footnotes p, #footnotes ul { + margin-left: 2.5em; + font-size: 0.875em; +} + +#book-text #footnotes .permalink { + font-size: .75em; +} + +#book-text blockquote { + font-size: 0.875em; +} + +/* ============= */ +/* = Numbering = */ +/* ============= */ +/*.verse, .paragraph { + position:relative; +} +#book-text .anchor { + position: absolute; + margin: -0.25em -0.5em; + left: -3em; + color: #777; + font-size: 12px; + width: 2em; + text-align: center; + padding: 0.25em 0.5em; + line-height: 1.5em; +} + +#book-text .anchor:hover, #book-text .anchor:active { + color: #FFF; + background-color: #CCC; +}*/ +#book-text .anchor{display:none;} + +/* =================== */ +/* = Custom elements = */ +/* =================== */ +#book-text span.author { + font-size: 0.5em; + display: block; + line-height: 1.5em; + margin-bottom: 0.25em; +} + +#book-text span.collection { + font-size: 0.375em; + display: block; + line-height: 1.5em; + margin-bottom: -0.25em; +} + +#book-text span.subtitle { + font-size: 0.5em; + display: block; + line-height: 1.5em; + margin-top: -0.25em; +} + +#book-text span.translator { + font-size: 0.375em; + display: block; + line-height: 1.5em; + margin-top: 0.25em; +} + +#book-text div.didaskalia { + font-style: italic; + margin: 0.5em 0 0 1.5em; +} + +#book-text div.kwestia { + margin: 0.5em 0 0; +} + +#book-text div.stanza { + margin: 1.5em 0 0; +} + +#book-text div.kwestia div.stanza { + margin: 0; +} + +#book-text p.paragraph { + text-align: justify; + margin: 1.5em 0 0; +} + +#book-text p.motto { + text-align: justify; + font-style: italic; + margin: 1.5em 0 0; +} + +#book-text p.motto_podpis { + font-size: 0.875em; + text-align: right; +} + +#book-text div.fragment { + border-bottom: 0.1em solid #999; + padding-bottom: 1.5em; +} + +#book-text div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph { + text-align: right; + font-style: italic; +} + +#book-text hr.spacer { + height: 3em; + visibility: hidden; +} + +#book-text hr.spacer-line { + margin: 1.5em 0; + border: none; + border-bottom: 0.1em solid #000; +} + +#book-text p.spacer-asterisk { + padding: 0; + margin: 1.5em 0; + text-align: center; +} + +#book-text div.person-list ol { + list-style: none; + padding: 0 0 0 1.5em; +} + +#book-text p.place-and-time { + font-style: italic; +} + +#book-text em.math, em.foreign-word, em.book-title, em.didaskalia { + font-style: italic; +} + +#book-text em.author-emphasis { + letter-spacing: 0.1em; +} + +#book-text em.person { + font-style: normal; + font-variant: small-caps; +} + +#book-text .verse:after { + content: "\feff"; +} diff --git a/assets/www/css/style.css b/assets/www/css/style.css new file mode 100644 index 0000000..b1f0022 --- /dev/null +++ b/assets/www/css/style.css @@ -0,0 +1,84 @@ +body { + padding: 0; + margin: 0; + font-size: 12px; + font-family: verdana, arial, helvetica, sans-serif; +} + +.spinner { + padding: 5em; +} + +#searchbox { + font-size: 1.5em; + background: #84bf2a; + padding: 5px; + display: none; +} +#search { + border: none; + width: 100%; + padding: 5px 0 5px 0; +} +#swrap { + margin-right:85px; +} +#searchbutton { + width:80px; + float:right; +} +#logo { + padding: 1em; + text-align:center; +} +#content { + padding: 10px; +} +.buttons a { + display: block; + background: #b6e372; + font-size: 20px; + padding: 1em; + border-radius: 8px; + -webkit-border-radius: 8px; + /*margin: 0.5em;*/ + text-align:center; + color: #295158; + text-decoration: none; +} + +.book-list a { + display: block; + background: #eee; + font-size: 16px; + padding: 15px; + margin: 5px; + border-radius: 8px; + -webkit-border-radius: 8px; + text-align:center; + color: #295158; + text-decoration: none; +} + +a.Book { + background: #ccc; +} + +h1 .subheader { + display:block; + font-size: 70%; +} +.upper { + text-transform: capitalize; +} + + +.footer { + color: #888; + border-top: 1px solid #888; + margin-top: 2em; + font-size: 0.9em; +} +.footer a { + color: #888; +} \ No newline at end of file diff --git a/assets/www/img/spinner.gif b/assets/www/img/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..c69e937232b24ea30f01c68bbd2ebc798dcecfcb GIT binary patch literal 2608 zcmdVcdr(tX9tZGC9yiG~=H_*Q-0%n(kWqP*D#hw{AQu8;1%gl-Hrf&{2?48KX;hHy z3Ze*zEz4t3XdUFyLbNPUYlA`|B}P=N1fqtL1*}S;87#|-W9v<#G;ul(e%d3)N(^9c$d2Dz{7}?ErjNd;{EMKkCsk21~b9Gvg zDo<7L=3Z5HNbVlZUcm1eg#o#CZCJU`3IYHwM->zCd?uYrF3vKFeM}v?f+%s?E>ly|3W25ry9#NNbTx-}0ON58dTrs^ix{_1O0Wh~SVSBlH)Ajn zPn^Gbjz}PCtN@#keR&hK&Dhl-b$kZ8^S)x#dh0{7X=X%CCJk7P1PSO>T&S8I4{#Lg zb5#)o=;!ZP*1nM{cI4@(x7o27*SA()NHmrn67aN@Pmi~(i_SnrjYnwh36aG%!@i0d zqbvfa44f|?OG4ntP|nbjhEl1)Yp6ZN@yjy zy4==QmLy%t;ps3R?~f2KfTTI|2?q8dFd6^z5GF+Xa&Y)sjG)hxit80pPcOP zJ z*LW{SyGHD%hUotV+W%I}fBLAIx!8|7#}$;clKQ+{&FjDqGQ2ZNx(lYM3*%~}ILnao zM`aui55~ZFJlu^!5rdA9Q_7H68H_;##u{x(Yn-vSfIRCb^Nqsg zGRS!Egm>h+o<}LeV4&CLReo9FrDjDvs}8?JwC)#Qs|ie=r?~xUh)&*d`Fx>FG}%X# zNdtDHBKhLPC0wpooFDAQKL%*6T|ULH$=wX!NhcasgD3d;-d$I6yRK3yN+E~C1335_iLOt+*9uvSZ`>*KA}vm}08wRq=>5l|t*Na&jR z-C1&C`nkEk#sB|@yyt-#fXngP04My zm7u$Q%EJbHp`>~`5W&L{W!6`y&}LMS;jfUpgO~7TLVMRZ9IC)IZp0A${`yp0{&wco z#1nx@XMkhqeK%7?RE7JdLr1^nwFfaJ0Q&Lv?WNJ%9}VSJsNY2+UYs2%EU0J~ayFXv zi*?7KCXQHkD)O6!0Q%4N+HTODHxJ{kQSuQX$l-rSwkwh(zMkdfzxyGwl@yHC)C4p< z&n2%8#M?)Q@mgHL1ot8`SFdSEj9ye|jHy+U8#@HoUExG=@AVkRAe_qYm4EpzK6L*& zh`)26?V#f4#_h^P9G^%>h2-H3)$QP zQovu6J9qDvsxqweDdNNa!Lb?L4_UF{tLX_nN7r0U_vF14YKcGR-*Gl} zx3oG)bzf|65dBxD-;2ZCp??K;+TuQ9onnK?==5hzbkb^r_g>z4#D8mcv8(+XdoszA zCx-qhdgxMNMotj}SiL_6V(tLcsK7(M(r(%u<}QrVfOvyK6_;~NOTlPGfX@M7S5YQF z&*$(ylJMHJt^_aQeu{C6NaTE$G3HNN@_SnN8YcaKn%`)F@~L1x+ah7-gEJPpc6w%3 zyX}r+Qk$4RHZzfH){e~F*qJ{d*L8a6n4;U?+{de0-t)mal#TVxe)3F}^UBh+zd T)6_**#cgp_+?JL9(ew3BlNF>u literal 0 HcmV?d00001 diff --git a/assets/www/img/wl-logo.png b/assets/www/img/wl-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b623d8bdc71cdc72cbfb0af6e496512d8f805644 GIT binary patch literal 12741 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 LNkvXXu0mjfvQK%U literal 0 HcmV?d00001 diff --git a/assets/www/index.html b/assets/www/index.html new file mode 100644 index 0000000..55be216 --- /dev/null +++ b/assets/www/index.html @@ -0,0 +1,38 @@ + + + + Wolne Lektury + + + + + + + + + + + + + + + + +
+ +
+
+Ładowanie + +
+ + + + + \ No newline at end of file diff --git a/assets/www/js/assetcopy.js b/assets/www/js/assetcopy.js new file mode 100644 index 0000000..e7e0ac5 --- /dev/null +++ b/assets/www/js/assetcopy.js @@ -0,0 +1,14 @@ +function AssetCopy() { + +} + +AssetCopy.prototype.copy = function(asset, target, overwrite, win, fail) { + if(overwrite==false) overwrite="false"; + else overwrite="true"; + PhoneGap.exec(win, fail, "AssetCopy", "copy", [asset, target, overwrite]); +}; + +PhoneGap.addConstructor(function() { + PhoneGap.addPlugin("assetcopy", new AssetCopy()); + PluginManager.addService("AssetCopy","pl.org.nowoczesnapolska.wlmobi.AssetCopy"); +}); \ No newline at end of file diff --git a/assets/www/js/catalogue.js b/assets/www/js/catalogue.js new file mode 100644 index 0000000..18f809f --- /dev/null +++ b/assets/www/js/catalogue.js @@ -0,0 +1,727 @@ +// FIXME: htmlescape strings! + +var VERSION = '0.1'; + + +var FileRepo = new function() { + /* API for files repository */ + var self = this; + const WL_URL = 'http://www.wolnelektury.pl'; + this.root = null; + + this.init = function(success, error) { + self.initRoot(success); + }; + + this.initRoot = function(success) { + // fs size is irrelevant, PERSISTENT is futile (on Android, at least) + window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, function(fs) { + console.log('local fs found: ' + fs.root.fullPath); + self.root = fs.root; + success && success(); + }, function() { + console.log('local fs not found'); + success && success(); + }); + }; + + + this.withLocalHtml = function(book_id, success, error) { + console.log('info:withLocalHtml: id:' + book_id); + View.spinner('Otwieranie treści utworu'); + if (!self.root) + error && error('info:withLocalHtml: no local html: no usable filesystem'); + + var url = "file://" + self.root.fullPath + "/html/" + book_id; + console.log('info:withLocalHtml: local ajax: ' + url); + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onload = function() { + console.log('info:withLocalHtml: fetched by local ajax: ' + url); + success && success(xhr.responseText); + } + xhr.onerror = error; + xhr.send(); + }; + + + // downloads HTML file from server, saves it in cache and calls success with file contents + this.withHtmlFromServer = function(book_id, success, error) { + console.log('info:withHtmlFromServer: id:' + book_id); + // read file from WL + Catalogue.withBook(book_id, function(book) { + var url = WL_URL + book.html_file; + console.log('info:withHtmlFromServer: fetching url: ' + url); + + View.spinner("Pobieranie treści utworu z sieci"); + + if (self.root) { + window.plugins.downloader.downloadFile(url, self.root.fullPath + "/html/", ""+book_id, true, + function(data){ + console.log('info:withHtmlFromServer: loaded file from WL'); + self.withLocalHtml(book_id, success, error); + }, function(data) { + console.log('error downloading file!') + error && error("error: "+data); + }); + } + else { + // there's no big fs, so we'll just get the text from AJAX + console.log('info:withHtmlFromServer: ajax: ' + url); + var xhr = new XMLHttpRequest(); + xhr.open(url); + xhr.onload = function() { + console.log('info:withHtmlFromServer: fetched by ajax: ' + url); + success && success(xhr.responseText); + } + xhr.send(); + } + }); + }; + + // calls the callback with contents of the HTML file for a given book, + // loaded from the server and cached locally + this.withHtml = function(id, success, error) { + console.log('info:withHtml: id:' + id); + self.withLocalHtml(id, success, function() { + self.withHtmlFromServer(id, success, error); + }); + }; +}; + + +var View = new function() { + var self = this; + self.minOffset = 1000; + //self.element + self.categories = { + autor: 'Autorzy', + rodzaj: 'Rodzaje', + gatunek: 'Gatunki', + epoka: 'Epoki' + }; + + + self.init = function() { + console.log('View.init'); + + self.viewStack = []; + self.current; + navigator.app.overrideBackbutton(); + document.addEventListener("backbutton", View.goBack, true); + + self._searchbox = document.getElementById("searchbox"); + self._searchinput = document.getElementById("search"); + self._content = document.getElementById("content"); + + self.enter(location.href); + }; + + + this.sanitize = function(text) { + return text.replace(/&/g, "&").replace(/
"; + scroll(0, 0); + }; + + this.content = function(text) { + console.log('content'); + + self._content.innerHTML = ''; + self._content.innerHTML = text; + scroll(0, 0); + } + + this.enter = function(url) { + console.log('View.enter: ' + url); + + self.current = url; + var view = 'Index'; + var arg = null; + + var query_start = url.indexOf('?'); + if (query_start != -1) { + var slash_index = url.indexOf('/', query_start + 1); + if (slash_index != -1) { + view = url.substr(query_start + 1, slash_index - query_start - 1); + arg = url.substr(slash_index + 1); + } + else { + view = url.substr(query_start + 1); + } + } + console.log('View.enter: ' + view + ' ' + arg); + self['enter' + view](arg); + } + + this.enterIndex = function(arg) { + console.log('enterIndex'); + self.showSearch(); + var html = "
"; + for (category in self.categories) + html += self.a('Category', category) + self.categories[category] + "\n"; + html += "
" + + ""; + self.content(html); + }; + + this.enterBook = function(id) { + id = parseInt(id); + console.log('enterBook: ' + id); + self.showSearch(); + + Catalogue.withBook(id, function(book) { + Catalogue.withChildren(id, function(children) { + Catalogue.withAuthors(id, function(authors) { + var html = "

"; + var auths = []; + for (a in authors) auths.push(authors[a].name); + html += auths.join(", "); + html += "" + book.title + "

\n"; + if (book.html_file) { + html += "

" + self.a('BookText', id) + "Czytaj tekst

"; + } + if (children.length) { + html += "
"; + for (c in children) { + child = children[c]; + html += self.a('Book', child.id) + child.title + "\n"; + } + html += "
"; + } + self.content(html); + }); + }); + }); + } + + this.enterBookText = function(id) { + id = parseInt(id); + self.spinner("Otwieranie utworu"); + console.log('enterBookText: ' + id); + self.hideSearch(); + + FileRepo.withHtml(id, function(data) { + self.content(data); + }); + } + + this.enterTag = function(id) { + id = parseInt(id); + console.log('enterTag: ' + id); + self.showSearch(); + + self.spinner("Otwieranie listy utworów"); + + Catalogue.withTag(id, function(tag) { + var html = "

" + tag.category + ': ' + tag.name + "

\n"; + html += "
"; + if (tag._books) { + Catalogue.withBooks(tag._books, function(books) { + for (var i in books) { + var book = books[i]; + html += self.a('Book', book.id) + book.title + "\n"; + } + html += "
"; + self.content(html); + }); + } + }); + }; + + + this.enterCategory = function(category) { + console.log('enterCategory: ' + category); + self.spinner("Otwieranie katalogu"); + self.showSearch(); + + Catalogue.withCategory(category, function(tags) { + var html = "

" + self.categories[category] + "

\n"; + html += "
"; + for (i in tags) { + tag = tags[i]; + html += self.a('Tag', tag.id) + tag.name + "\n"; + } + html += "
"; + self.content(html); + }); + }; + + + + this.enterSearch = function(query) { + console.log('enterTag: ' + query); + self.showSearch(); + + var html = "

Szukana fraza:" + View.sanitize(query) + "

\n"; + + if (query.length < 2) { + html += "

Szukana fraza musi mieć co najmniej dwa znaki

"; + self.content(html); + return; + } + + Catalogue.withSearch(query, function(results) { + if (results.length == 1) { + self.enter(self.href(results[0].view, results[0].id)); + return; + } + if (results.length == 0) { + html += "

Brak wyników wyszukiwania

"; + } + else { + html += "
"; + for (var i in results) { + var result = results[i]; + html += self.a(result.view, result.id) + result.label + "\n"; + } + html += "
"; + } + self.content(html); + }); + }; + + + /* search form submit callback */ + this.search = function() { + self.goTo('?Search/' + self._searchinput.value); + return false; + } + + + this.href = function(view, par) { + return "?"+view+"/"+par; + }; + + this.a = function(view, par) { + return ""; + }; + + this.goTo = function(url) { + self.viewStack.push(self.current); + console.log('goTo: ' + url); + self.enter(url); + }; + + this.goBack = function() { + if (self.viewStack.length > 0) { + var url = self.viewStack.pop(); + console.log('goBack: ' + url); + self.enter(url); + } + else { + console.log('exiting'); + navigator.app.exitApp(); + } + }; +} + + +/* +// for preparing sql statements +// use like: +// var s = new Sql("INSERT ... '{0}', '{1}' ..."; +// s.prepare("abc", ...) +var Sql = function(scheme) { + var self = this; + self.text = scheme; + + self.sql_escape = function(term) { + return term.toString().replace("'", "''"); + }; + + self.prepare = function() { + var args = arguments; + return self.text.replace(/{(\d+)}/g, function(match, number) { + return self.sql_escape(args[number]); + }); + } +};*/ + + +var Catalogue = new function() { + /* API for database */ + + var self = this; + self.db = null; + + this.init = function(success, error) { + console.log('Catalogue.init'); + + self.updateDB(function() { + self.db = window.openDatabase("wolnelektury", "1.0", "WL Catalogue", 1); + if (self.db) { + /*var regexp = { + onFunctionCall: function(val) { + var re = new RegExp(val.getString(0)); + if (val.getString(1).match(re)) + return 1; + else + return 0; + } + }; + self.db.createFunction("REGEXP", 2, regexp);*/ + + success && success(); + } else { + error && error('Nie mogę otworzyć bazy danych: ' + err); + } + + }, function(err) { + error && error('Błąd migracji: ' + err); + }); + }; + + self.sqlSanitize = function(term) { + return term.toString().replace("'", "''"); + }; + + + /* check if DB needs updating and upload a fresh copy, if so */ + this.updateDB = function(success, error) { + var db_ver = '0.1.3'; + if (window.localStorage.getItem('db_ver') == db_ver) { + console.log('db ok, skipping') + success && success(); + return; + } + + var done = function() { + window.localStorage.setItem('db_ver', db_ver); + console.log('db updated'); + success && success(); + }; + + // db initialize + // this is Android-specific for now + var version = device.version.split('.')[0]; + switch(version) { + case '1': + self.upload_db_android1(done, error); + break; + case '2': + self.upload_db_android2(done, error); + break; + case '3': + default: + error && error('Błąd migracji: ' + err); + }; + }; + + + this.upload_db_android1 = function(success, error) { + console.log('upload db for Android 1.x'); + window.requestFileSystem(LocalFileSystem.APPLICATION, 0, function(fs) { + window.plugins.assetcopy.copy("initial/wolnelektury.db", + fs.root.fullPath + "/databases/wolnelektury.db", true, + function(data) { + console.log('db upload successful'); + success && success(); + }, function(data) { + error && error("database upload error: " + data); + }); + }, error); + }; + + + this.upload_db_android2 = function(success, error) { + console.log('upload db for Android 2.x'); + window.requestFileSystem(LocalFileSystem.APPLICATION, 0, function(fs) { + + // upload databases description file + window.plugins.assetcopy.copy("initial/Databases.db", + fs.root.fullPath + "/app_database/Databases.db", true, + function(data) { + console.log('db descriptior upload successful'); + + // upload the database file + window.plugins.assetcopy.copy("initial/0000000000000001.db", + fs.root.fullPath + "/app_database/file__0/0000000000000001.db", true, + function(data) { + console.log('db upload successful'); + success && success(); + }, function(data) { + error && error("database upload error: " + data); + }); + + + }, function(data) { + error && error("database descriptor upload error: " + data); + }); + + }, error); + }; + + + this.withBook = function(id, callback) { + console.log('withBook '+id) + self.db.transaction(function(tx) { + tx.executeSql("SELECT * FROM book WHERE id="+id, [], + function(tx, results) { + callback(results.rows.item(0)); + }); + }); + }; + + this.withBooks = function(ids, callback) { + console.log('withBooks ' + ids) + self.db.transaction(function(tx) { + tx.executeSql("SELECT * FROM book WHERE id IN ("+ids+") ORDER BY title", [], + function(tx, results) { + var items = []; + var count = results.rows.length; + for (var i=0; i + * + * @param name The plugin name + * @param obj The plugin object + */ +PhoneGap.addPlugin = function(name, obj) { + if (!window.plugins[name]) { + window.plugins[name] = obj; + } + else { + console.log("Error: Plugin "+name+" already exists."); + } +}; + +/** + * onDOMContentLoaded channel is fired when the DOM content + * of the page has been parsed. + */ +PhoneGap.onDOMContentLoaded = new PhoneGap.Channel('onDOMContentLoaded'); + +/** + * onNativeReady channel is fired when the PhoneGap native code + * has been initialized. + */ +PhoneGap.onNativeReady = new PhoneGap.Channel('onNativeReady'); + +/** + * onPhoneGapInit channel is fired when the web page is fully loaded and + * PhoneGap native code has been initialized. + */ +PhoneGap.onPhoneGapInit = new PhoneGap.Channel('onPhoneGapInit'); + +/** + * onPhoneGapReady channel is fired when the JS PhoneGap objects have been created. + */ +PhoneGap.onPhoneGapReady = new PhoneGap.Channel('onPhoneGapReady'); + +/** + * onPhoneGapInfoReady channel is fired when the PhoneGap device properties + * has been set. + */ +PhoneGap.onPhoneGapInfoReady = new PhoneGap.Channel('onPhoneGapInfoReady'); + +/** + * onResume channel is fired when the PhoneGap native code + * resumes. + */ +PhoneGap.onResume = new PhoneGap.Channel('onResume'); + +/** + * onPause channel is fired when the PhoneGap native code + * pauses. + */ +PhoneGap.onPause = new PhoneGap.Channel('onPause'); + +/** + * onDestroy channel is fired when the PhoneGap native code + * is destroyed. It is used internally. + * Window.onunload should be used by the user. + */ +PhoneGap.onDestroy = new PhoneGap.Channel('onDestroy'); +PhoneGap.onDestroy.subscribeOnce(function() { + PhoneGap.shuttingDown = true; +}); +PhoneGap.shuttingDown = false; + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any PhoneGap JS is ready. +if (typeof _nativeReady !== 'undefined') { PhoneGap.onNativeReady.fire(); } + +/** + * onDeviceReady is fired only after all PhoneGap objects are created and + * the device properties are set. + */ +PhoneGap.onDeviceReady = new PhoneGap.Channel('onDeviceReady'); + + +// Array of channels that must fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsArray = [ PhoneGap.onPhoneGapReady, PhoneGap.onPhoneGapInfoReady]; + +// Hashtable of user defined channels that must also fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsMap = {}; + +/** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up PhoneGap's "deviceready" event until the feature has been initialized + * and PhoneGap.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ +PhoneGap.waitForInitialization = function(feature) { + if (feature) { + var channel = new PhoneGap.Channel(feature); + PhoneGap.deviceReadyChannelsMap[feature] = channel; + PhoneGap.deviceReadyChannelsArray.push(channel); + } +}; + +/** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ +PhoneGap.initializationComplete = function(feature) { + var channel = PhoneGap.deviceReadyChannelsMap[feature]; + if (channel) { + channel.fire(); + } +}; + +/** + * Create all PhoneGap objects once page has fully loaded and native side is ready. + */ +PhoneGap.Channel.join(function() { + + // Start listening for XHR callbacks + setTimeout(function() { + if (PhoneGap.UsePolling) { + PhoneGap.JSCallbackPolling(); + } + else { + var polling = prompt("usePolling", "gap_callbackServer:"); + if (polling == "true") { + PhoneGap.JSCallbackPolling(); + } + else { + PhoneGap.JSCallback(); + } + } + }, 1); + + // Run PhoneGap constructors + PhoneGap.onPhoneGapInit.fire(); + + // Fire event to notify that all objects are created + PhoneGap.onPhoneGapReady.fire(); + + // Fire onDeviceReady event once all constructors have run and PhoneGap info has been + // received from native side, and any user defined initialization channels. + PhoneGap.Channel.join(function() { + + // Turn off app loading dialog + navigator.notification.activityStop(); + + PhoneGap.onDeviceReady.fire(); + + // Fire the onresume event, since first one happens before JavaScript is loaded + PhoneGap.onResume.fire(); + }, PhoneGap.deviceReadyChannelsArray); + +}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]); + +// Listen for DOMContentLoaded and notify our channel subscribers +document.addEventListener('DOMContentLoaded', function() { + PhoneGap.onDOMContentLoaded.fire(); +}, false); + +// Intercept calls to document.addEventListener and watch for deviceready +PhoneGap.m_document_addEventListener = document.addEventListener; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (e === 'deviceready') { + PhoneGap.onDeviceReady.subscribeOnce(handler); + } else if (e === 'resume') { + PhoneGap.onResume.subscribe(handler); + if (PhoneGap.onDeviceReady.fired) { + PhoneGap.onResume.fire(); + } + } else if (e === 'pause') { + PhoneGap.onPause.subscribe(handler); + } + else { + // If subscribing to Android backbutton + if (e === 'backbutton') { + PhoneGap.exec(null, null, "App", "overrideBackbutton", [true]); + } + + PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +// Intercept calls to document.removeEventListener and watch for events that +// are generated by PhoneGap native code +PhoneGap.m_document_removeEventListener = document.removeEventListener; + +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubscribing to Android backbutton + if (e === 'backbutton') { + PhoneGap.exec(null, null, "App", "overrideBackbutton", [false]); + } + + PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); +}; + +/** + * Method to fire event from native code + */ +PhoneGap.fireEvent = function(type) { + var e = document.createEvent('Events'); + e.initEvent(type); + document.dispatchEvent(e); +}; + +/** + * If JSON not included, use our own stringify. (Android 1.6) + * The restriction on ours is that it must be an array of simple types. + * + * @param args + * @return + */ +PhoneGap.stringify = function(args) { + if (typeof JSON === "undefined") { + var s = "["; + var i, type, start, name, nameType, a; + for (i = 0; i < args.length; i++) { + if (args[i] != null) { + if (i > 0) { + s = s + ","; + } + type = typeof args[i]; + if ((type === "number") || (type === "boolean")) { + s = s + args[i]; + } else if (args[i] instanceof Array) { + s = s + "[" + args[i] + "]"; + } else if (args[i] instanceof Object) { + start = true; + s = s + '{'; + for (name in args[i]) { + if (args[i][name] !== null) { + if (!start) { + s = s + ','; + } + s = s + '"' + name + '":'; + nameType = typeof args[i][name]; + if ((nameType === "number") || (nameType === "boolean")) { + s = s + args[i][name]; + } else if ((typeof args[i][name]) === 'function') { + // don't copy the functions + s = s + '""'; + } else if (args[i][name] instanceof Object) { + s = s + this.stringify(args[i][name]); + } else { + s = s + '"' + args[i][name] + '"'; + } + start = false; + } + } + s = s + '}'; + } else { + a = args[i].replace(/\\/g, '\\\\'); + a = encodeURIComponent(a).replace(/%([0-9A-F]{2})/g, "\\x$1"); + //a = a.replace(/\n/g, '\\n'); + //a = a.replace(/"/g, '\\"'); + s = s + '"' + a + '"'; + } + } + } + s = s + "]"; + return s; + } else { + return JSON.stringify(args); + } +}; + +/** + * Does a deep clone of the object. + * + * @param obj + * @return + */ +PhoneGap.clone = function(obj) { + var i, retVal; + if(!obj) { + return obj; + } + + if(obj instanceof Array){ + retVal = []; + for(i = 0; i < obj.length; ++i){ + retVal.push(PhoneGap.clone(obj[i])); + } + return retVal; + } + + if (obj instanceof Function) { + return obj; + } + + if(!(obj instanceof Object)){ + return obj; + } + + if (obj instanceof Date) { + return obj; + } + + retVal = {}; + for(i in obj){ + if(!(i in retVal) || retVal[i] !== obj[i]) { + retVal[i] = PhoneGap.clone(obj[i]); + } + } + return retVal; +}; + +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; +PhoneGap.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 + }; + + +/** + * Execute a PhoneGap command. It is up to the native side whether this action is synch or async. + * The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchrounous: Empty string "" + * If async, the native side will PhoneGap.callbackSuccess or PhoneGap.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in PhoneGap + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +PhoneGap.exec = function(success, fail, service, action, args) { + try { + var callbackId = service + PhoneGap.callbackId++; + if (success || fail) { + PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; + } + + var r = prompt(this.stringify(args), "gap:"+this.stringify([service, action, callbackId, true])); + + // If a result was returned + if (r.length > 0) { + eval("var v="+r+";"); + + // If status is OK, then return value back to caller + if (v.status === PhoneGap.callbackStatus.OK) { + + // If there is a success callback, then call it now with + // returned value + if (success) { + try { + success(v.message); + } catch (e) { + console.log("Error in success callback: " + callbackId + " = " + e); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return v.message; + } + + // If no result + else if (v.status === PhoneGap.callbackStatus.NO_RESULT) { + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + + // If error, then display error + else { + console.log("Error: Status="+v.status+" Message="+v.message); + + // If there is a fail callback, then call it now with returned value + if (fail) { + try { + fail(v.message); + } + catch (e1) { + console.log("Error in error callback: "+callbackId+" = "+e1); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return null; + } + } + } catch (e2) { + console.log("Error: "+e2); + } +}; + +/** + * Called by native code when returning successful result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackSuccess = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + + // If result is to be sent to callback + if (args.status === PhoneGap.callbackStatus.OK) { + try { + if (PhoneGap.callbacks[callbackId].success) { + PhoneGap.callbacks[callbackId].success(args.message); + } + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +/** + * Called by native code when returning error result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackError = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + try { + if (PhoneGap.callbacks[callbackId].fail) { + PhoneGap.callbacks[callbackId].fail(args.message); + } + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + + +/** + * Internal function used to dispatch the request to PhoneGap. It processes the + * command queue and executes the next command on the list. If one of the + * arguments is a JavaScript object, it will be passed on the QueryString of the + * url, which will be turned into a dictionary on the other end. + * @private + */ +// TODO: Is this used? +PhoneGap.run_command = function() { + if (!PhoneGap.available || !PhoneGap.queue.ready) { + return; + } + PhoneGap.queue.ready = false; + + var args = PhoneGap.queue.commands.shift(); + if (PhoneGap.queue.commands.length === 0) { + clearInterval(PhoneGap.queue.timer); + PhoneGap.queue.timer = null; + } + + var uri = []; + var dict = null; + var i; + for (i = 1; i < args.length; i++) { + var arg = args[i]; + if (arg === undefined || arg === null) { + arg = ''; + } + if (typeof(arg) === 'object') { + dict = arg; + } else { + uri.push(encodeURIComponent(arg)); + } + } + var url = "gap://" + args[0] + "/" + uri.join("/"); + if (dict !== null) { + var name; + var query_args = []; + for (name in dict) { + if (dict.hasOwnProperty(name) && (typeof (name) === 'string')) { + query_args.push(encodeURIComponent(name) + "=" + encodeURIComponent(dict[name])); + } + } + if (query_args.length > 0) { + url += "?" + query_args.join("&"); + } + } + document.location = url; + +}; + +PhoneGap.JSCallbackPort = null; +PhoneGap.JSCallbackToken = null; + +/** + * This is only for Android. + * + * Internal function that uses XHR to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallback = function() { + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If polling flag was changed, start using polling from now on + if (PhoneGap.UsePolling) { + PhoneGap.JSCallbackPolling(); + return; + } + + var xmlhttp = new XMLHttpRequest(); + + // Callback function when XMLHttpRequest is ready + xmlhttp.onreadystatechange=function(){ + if(xmlhttp.readyState === 4){ + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If callback has JavaScript statement to execute + if (xmlhttp.status === 200) { + + var msg = xmlhttp.responseText; + setTimeout(function() { + try { + var t = eval(msg); + } + catch (e) { + // If we're getting an error here, seeing the message will help in debugging + console.log("JSCallback: Message from Server: " + msg); + console.log("JSCallback Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallback, 1); + } + + // If callback ping (used to keep XHR request from timing out) + else if (xmlhttp.status === 404) { + setTimeout(PhoneGap.JSCallback, 10); + } + + // If security error + else if (xmlhttp.status === 403) { + console.log("JSCallback Error: Invalid token. Stopping callbacks."); + } + + // If server is stopping + else if (xmlhttp.status === 503) { + console.log("JSCallback Error: Service unavailable. Stopping callbacks."); + } + + // If request wasn't GET + else if (xmlhttp.status === 400) { + console.log("JSCallback Error: Bad request. Stopping callbacks."); + } + + // If error, restart callback server + else { + console.log("JSCallback Error: Request failed."); + prompt("restartServer", "gap_callbackServer:"); + PhoneGap.JSCallbackPort = null; + PhoneGap.JSCallbackToken = null; + setTimeout(PhoneGap.JSCallback, 100); + } + } + }; + + if (PhoneGap.JSCallbackPort === null) { + PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); + } + if (PhoneGap.JSCallbackToken === null) { + PhoneGap.JSCallbackToken = prompt("getToken", "gap_callbackServer:"); + } + xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true); + xmlhttp.send(); +}; + +/** + * The polling period to use with JSCallbackPolling. + * This can be changed by the application. The default is 50ms. + */ +PhoneGap.JSCallbackPollingPeriod = 50; + +/** + * Flag that can be set by the user to force polling to be used or force XHR to be used. + */ +PhoneGap.UsePolling = false; // T=use polling, F=use XHR + +/** + * This is only for Android. + * + * Internal function that uses polling to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallbackPolling = function() { + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If polling flag was changed, stop using polling from now on + if (!PhoneGap.UsePolling) { + PhoneGap.JSCallback(); + return; + } + + var msg = prompt("", "gap_poll:"); + if (msg) { + setTimeout(function() { + try { + var t = eval(""+msg); + } + catch (e) { + console.log("JSCallbackPolling: Message from Server: " + msg); + console.log("JSCallbackPolling Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallbackPolling, 1); + } + else { + setTimeout(PhoneGap.JSCallbackPolling, PhoneGap.JSCallbackPollingPeriod); + } +}; + +/** + * Create a UUID + * + * @return + */ +PhoneGap.createUUID = function() { + return PhoneGap.UUIDcreatePart(4) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(6); +}; + +PhoneGap.UUIDcreatePart = function(length) { + var uuidpart = ""; + var i, uuidchar; + for (i=0; i frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Accelerometer", "getTimeout", []); + + // Start watch timer + var id = PhoneGap.createUUID(); + navigator.accelerometer.timers[id] = setInterval(function() { + PhoneGap.exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); + }, (frequency ? frequency : 1)); + + return id; +}; + +/** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ +Accelerometer.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.accelerometer.timers[id] !== undefined) { + clearInterval(navigator.accelerometer.timers[id]); + delete navigator.accelerometer.timers[id]; + } +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.accelerometer === "undefined") { + navigator.accelerometer = new Accelerometer(); + } +}); +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010-2011, IBM Corporation + */ + +if (!PhoneGap.hasResource("app")) { +PhoneGap.addResource("app"); + +/** + * Constructor + */ +App = function() {}; + +/** + * Clear the resource cache. + */ +App.prototype.clearCache = function() { + PhoneGap.exec(null, null, "App", "clearCache", []); +}; + +/** + * Load the url into the webview. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * hideLoadingDialogOnPage: boolean => hide loadingDialog when page loaded instead of when deviceready event occurs. + * loadInWebView: boolean => cause all links on web page to be loaded into existing web view, instead of being loaded into new browser. + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * errorUrl: URL => URL to load if there's an error loading specified URL with loadUrl(). Should be a local URL such as file:///android_asset/www/error.html"); + * keepRunning: boolean => enable app to keep running in background + * + * Example: + * App app = new App(); + * app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ +App.prototype.loadUrl = function(url, props) { + PhoneGap.exec(null, null, "App", "loadUrl", [url, props]); +}; + +/** + * Cancel loadUrl that is waiting to be loaded. + */ +App.prototype.cancelLoadUrl = function() { + PhoneGap.exec(null, null, "App", "cancelLoadUrl", []); +}; + +/** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ +App.prototype.clearHistory = function() { + PhoneGap.exec(null, null, "App", "clearHistory", []); +}; + +/** + * Add a class that implements a service. + * + * @param serviceType + * @param className + */ +App.prototype.addService = function(serviceType, className) { + PhoneGap.exec(null, null, "App", "addService", [serviceType, className]); +}; + +/** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * Note: The user should not have to call this method. Instead, when the user + * registers for the "backbutton" event, this is automatically done. + * + * @param override T=override, F=cancel override + */ +App.prototype.overrideBackbutton = function(override) { + PhoneGap.exec(null, null, "App", "overrideBackbutton", [override]); +}; + +/** + * Exit and terminate the application. + */ +App.prototype.exitApp = function() { + return PhoneGap.exec(null, null, "App", "exitApp", []); +}; + +PhoneGap.addConstructor(function() { + navigator.app = window.app = new App(); +}); +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +if (!PhoneGap.hasResource("camera")) { +PhoneGap.addResource("camera"); + +/** + * This class provides access to the device camera. + * + * @constructor + */ +Camera = function() { + this.successCallback = null; + this.errorCallback = null; + this.options = null; +}; + +/** + * Format of image that returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.DestinationType = { + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android) +}; +Camera.prototype.DestinationType = Camera.DestinationType; + +/** + * Source to getPicture from. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.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) +}; +Camera.prototype.PictureSourceType = Camera.PictureSourceType; + +/** + * 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=DATA_URL. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +Camera.prototype.getPicture = function(successCallback, errorCallback, options) { + + // successCallback required + if (typeof successCallback !== "function") { + console.log("Camera Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("Camera Error: errorCallback is not a function"); + return; + } + + this.options = options; + var quality = 80; + if (options.quality) { + quality = this.options.quality; + } + var destinationType = Camera.DestinationType.DATA_URL; + if (this.options.destinationType) { + destinationType = this.options.destinationType; + } + var sourceType = Camera.PictureSourceType.CAMERA; + if (typeof this.options.sourceType === "number") { + sourceType = this.options.sourceType; + } + PhoneGap.exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType]); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.camera === "undefined") { + navigator.camera = new Camera(); + } +}); +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010-2011, IBM Corporation + */ + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +function CaptureError() { + this.code = null; +}; + +// Capture error codes +CaptureError.CAPTURE_INTERNAL_ERR = 0; +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioFormats = []; + this.supportedImageFormats = []; + this.supportedVideoFormats = []; +}; + +/** + * 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) { + PhoneGap.exec(successCallback, errorCallback, "Capture", "captureAudio", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options) { + PhoneGap.exec(successCallback, errorCallback, "Capture", "captureImage", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype._castMediaFile = function(pluginResult) { + var mediaFiles = []; + var i; + for (i=0; i frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Compass", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Compass", "getTimeout", []); + + // Start watch timer to get headings + var id = PhoneGap.createUUID(); + navigator.compass.timers[id] = setInterval( + function() { + PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); + }, (frequency ? frequency : 1)); + + return id; +}; + + +/** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchHeading. + */ +Compass.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.compass.timers[id]) { + clearInterval(navigator.compass.timers[id]); + delete navigator.compass.timers[id]; + } +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.compass === "undefined") { + navigator.compass = new Compass(); + } +}); +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +if (!PhoneGap.hasResource("contact")) { +PhoneGap.addResource("contact"); + +/** +* Contains information about a single contact. +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {ContactField[]} phoneNumbers array of phone numbers +* @param {ContactField[]} emails array of email addresses +* @param {ContactAddress[]} addresses array of addresses +* @param {ContactField[]} ims instant messaging user ids +* @param {ContactOrganization[]} organizations +* @param {DOMString} revision date contact was last updated +* @param {DOMString} birthday contact's birthday +* @param {DOMString} gender contact's gender +* @param {DOMString} note user notes about contact +* @param {ContactField[]} photos +* @param {ContactField[]} categories +* @param {ContactField[]} urls contact's web sites +* @param {DOMString} timezone the contacts time zone +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, revision, birthday, gender, note, photos, categories, urls, timezone) { + 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.revision = revision || null; + this.birthday = birthday || null; + this.gender = gender || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] + this.timezone = timezone || null; +}; + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + */ +var ContactError = function() { + this.code=null; +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.NOT_FOUND_ERROR = 2; +ContactError.TIMEOUT_ERROR = 3; +ContactError.PENDING_OPERATION_ERROR = 4; +ContactError.IO_ERROR = 5; +ContactError.NOT_SUPPORTED_ERROR = 6; +ContactError.PERMISSION_DENIED_ERROR = 20; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + if (this.id === null) { + var errorObj = new ContactError(); + errorObj.code = ContactError.NOT_FOUND_ERROR; + errorCB(errorObj); + } + else { + PhoneGap.exec(successCB, errorCB, "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 = PhoneGap.clone(this); + var i; + clonedContact.id = null; + clonedContact.rawId = null; + // Loop through and clear out any id's in phones, emails, etc. + if (clonedContact.phoneNumbers) { + for (i = 0; i < clonedContact.phoneNumbers.length; i++) { + clonedContact.phoneNumbers[i].id = null; + } + } + if (clonedContact.emails) { + for (i = 0; i < clonedContact.emails.length; i++) { + clonedContact.emails[i].id = null; + } + } + if (clonedContact.addresses) { + for (i = 0; i < clonedContact.addresses.length; i++) { + clonedContact.addresses[i].id = null; + } + } + if (clonedContact.ims) { + for (i = 0; i < clonedContact.ims.length; i++) { + clonedContact.ims[i].id = null; + } + } + if (clonedContact.organizations) { + for (i = 0; i < clonedContact.organizations.length; i++) { + clonedContact.organizations[i].id = null; + } + } + if (clonedContact.tags) { + for (i = 0; i < clonedContact.tags.length; i++) { + clonedContact.tags[i].id = null; + } + } + if (clonedContact.photos) { + for (i = 0; i < clonedContact.photos.length; i++) { + clonedContact.photos[i].id = null; + } + } + if (clonedContact.urls) { + for (i = 0; i < clonedContact.urls.length; i++) { + clonedContact.urls[i].id = null; + } + } + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + PhoneGap.exec(successCB, errorCB, "Contacts", "save", [this]); +}; + +/** +* Contact name. +* @param formatted +* @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; +}; + +/** +* Generic contact field. +* @param {DOMString} id unique identifier, should only be set by native code +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = type || null; + this.value = value || null; + this.pref = pref || null; +}; + +/** +* Contact address. +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ +var ContactAddress = function(formatted, streetAddress, locality, region, postalCode, country) { + this.id = 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; +}; + +/** +* Contact organization. +* @param {DOMString} id unique identifier, should only be set by native code +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ +var ContactOrganization = function(name, dept, title) { + this.id = null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +/** +* Represents a group of Contacts. +*/ +var Contacts = function() { + this.inProgress = false; + this.records = []; +}; +/** +* 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 +*/ +Contacts.prototype.find = function(fields, successCB, errorCB, options) { + PhoneGap.exec(successCB, 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 who's properties will be examined to create a new Contact +* @returns new Contact object +*/ +Contacts.prototype.create = function(properties) { + var i; + var contact = new Contact(); + for (i in properties) { + if (contact[i] !== 'undefined') { + contact[i] = properties[i]; + } + } + return contact; +}; + +/** +* This function returns and array of contacts. It is required as we need to convert raw +* JSON objects into concrete Contact objects. Currently this method is called after +* navigator.service.contacts.find but before the find methods success call back. +* +* @param jsonArray an array of JSON Objects that need to be converted to Contact objects. +* @returns an array of Contact objects +*/ +Contacts.prototype.cast = function(pluginResult) { + var contacts = []; + var i; + for (i=0; i][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + this.fileName = ""; + if (typeof file.fullPath === "undefined") { + this.fileName = file; + } else { + this.fileName = file.fullPath; + } + + // LOADING state + this.readyState = FileReader.LOADING; + + // If loadstart callback + if (typeof this.onloadstart === "function") { + this.onloadstart({"type":"loadstart", "target":this}); + } + + var me = this; + + // Read file + navigator.fileMgr.readAsDataURL(this.fileName, + + // Success callback + function(r) { + var evt; + + // 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({"type":"load", "target":me}); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend({"type":"loadend", "target":me}); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save error + var fileError = new FileError(); + fileError.code = e; + me.error = fileError; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend({"type":"loadend", "target":me}); + } + } + ); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +//----------------------------------------------------------------------------- +// File Writer +//----------------------------------------------------------------------------- + +/** + * 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" + * + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +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 FileError.INVALID_STATE_ERR; + } + + // set error + var error = new FileError(), evt; + error.code = error.ABORT_ERR; + this.error = error; + + // If error callback + if (typeof this.onerror === "function") { + this.onerror({"type":"error", "target":this}); + } + // If abort callback + if (typeof this.onabort === "function") { + this.oneabort({"type":"abort", "target":this}); + } + + this.readyState = FileWriter.DONE; + + // If write end callback + if (typeof this.onwriteend == "function") { + this.onwriteend({"type":"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 FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart({"type":"writestart", "target":me}); + } + + // Write file + navigator.fileMgr.write(this.fileName, text, this.position, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // So if the user wants to keep appending to the file + me.length = Math.max(me.length, me.position + r); + // position always increases by bytes written because file would be extended + me.position += r; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite({"type":"write", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, + + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + var fileError = new FileError(); + fileError.code = e; + me.error = fileError; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + } + ); + +}; + +/** + * 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 FileError.INVALID_STATE_ERR; + } + + if (!offset) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger then 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 FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart({"type":"writestart", "target":this}); + } + + // Write file + navigator.fileMgr.truncate(this.fileName, size, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // 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({"type":"write", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + var fileError = new FileError(); + fileError.code = e; + me.error = fileError; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + } + ); +}; + +LocalFileSystem = function() { +}; + +// File error codes +LocalFileSystem.TEMPORARY = 0; +LocalFileSystem.PERSISTENT = 1; +LocalFileSystem.RESOURCE = 2; +LocalFileSystem.APPLICATION = 3; + +/** + * Requests a filesystem in which to store application data. + * + * @param {int} type of file system being requested + * @param {Function} successCallback is called with the new FileSystem + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { + if (type < 0 || type > 3) { + if (typeof errorCallback == "function") { + errorCallback({ + "code": FileError.SYNTAX_ERR + }); + } + } + else { + PhoneGap.exec(successCallback, errorCallback, "File", "requestFileSystem", [type, size]); + } +}; + +/** + * + * @param {DOMString} uri referring to a local file in a filesystem + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "resolveLocalFileSystemURI", [uri]); +}; + +/** +* This function returns and array of contacts. It is required as we need to convert raw +* JSON objects into concrete Contact objects. Currently this method is called after +* navigator.service.contacts.find but before the find methods success call back. +* +* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. +* @returns an entry +*/ +LocalFileSystem.prototype._castFS = function(pluginResult) { + var entry = null; + entry = new DirectoryEntry(); + entry.isDirectory = pluginResult.message.root.isDirectory; + entry.isFile = pluginResult.message.root.isFile; + entry.name = pluginResult.message.root.name; + entry.fullPath = pluginResult.message.root.fullPath; + pluginResult.message.root = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntry = function(pluginResult) { + var entry = null; + if (pluginResult.message.isDirectory) { + console.log("This is a dir"); + entry = new DirectoryEntry(); + } + else if (pluginResult.message.isFile) { + console.log("This is a file"); + entry = new FileEntry(); + } + entry.isDirectory = pluginResult.message.isDirectory; + entry.isFile = pluginResult.message.isFile; + entry.name = pluginResult.message.name; + entry.fullPath = pluginResult.message.fullPath; + pluginResult.message = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntries = function(pluginResult) { + var entries = pluginResult.message; + var retVal = []; + for (i=0; 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 rEXRP~1AIN=`W`5!x836ps}l+`&_HYm%%B5*a; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d76c57a2a8095f07c2eecebb3249affa2e80ac18 GIT binary patch literal 4062 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/icon.png b/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..128dcce9ef8b0feedd777ac4bb1d046aa75c7f40 GIT binary patch literal 2532 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 + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..f2d4fb8 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Hello World, Catalogue! + Wolne Lektury + diff --git a/src/pl/org/nowoczesnapolska/wlmobi/AssetCopy.java b/src/pl/org/nowoczesnapolska/wlmobi/AssetCopy.java new file mode 100644 index 0000000..89f970a --- /dev/null +++ b/src/pl/org/nowoczesnapolska/wlmobi/AssetCopy.java @@ -0,0 +1,76 @@ +package pl.org.nowoczesnapolska.wlmobi; + +/* + @author Radek Czajka + */ + +import org.json.JSONArray; +import org.json.JSONException; + +import android.util.Log; +import android.content.res.AssetManager; + +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.IOException; + +public class AssetCopy extends Plugin{ + + @Override + public PluginResult execute(String action, JSONArray args, String callbackId) { + if (action.equals("copy")) { + try { + return this.copy(args.getString(0), args.getString(1), args.getString(2)); + } catch (JSONException e) { + return new PluginResult(PluginResult.Status.ERROR, "Param errrors"); + } + } + else { + return new PluginResult(PluginResult.Status.INVALID_ACTION); + } + } + + private PluginResult copy(String assetPath, String targetPath, String overwrite) { + int index = targetPath.lastIndexOf('/'); + String targetDir = targetPath.substring(0, index); + + try { + File dir = new File(targetDir); + if(!dir.exists()) { + Log.d("AssetCopy", "directory " + targetDir + " created"); + dir.mkdirs(); + } + + File fout = new File(targetPath); + + if(overwrite.equals("false") && fout.exists()) { + Log.d("AssetCopy", "File already exists"); + return new PluginResult(PluginResult.Status.OK, "exist"); + } + + FileOutputStream fos = new FileOutputStream(fout); + + AssetManager assetManager = this.ctx.getResources().getAssets(); + InputStream is = assetManager.open(assetPath); + + byte[] buffer = new byte[1024]; + int len1 = 0; + + while ( (len1 = is.read(buffer)) > 0 ) { + fos.write(buffer,0, len1); + } + + fos.close(); + + Log.d("AssetCopy", "Copied to " + targetPath); + } catch (IOException e) { + Log.d("AssetCopy", "Error: " + e); + return new PluginResult(PluginResult.Status.ERROR, "Error: " + e); + } + return new PluginResult(PluginResult.Status.OK, targetPath); + } +} \ No newline at end of file diff --git a/src/pl/org/nowoczesnapolska/wlmobi/Catalogue.java b/src/pl/org/nowoczesnapolska/wlmobi/Catalogue.java new file mode 100644 index 0000000..f8d69ec --- /dev/null +++ b/src/pl/org/nowoczesnapolska/wlmobi/Catalogue.java @@ -0,0 +1,13 @@ +package pl.org.nowoczesnapolska.wlmobi; + +import android.os.Bundle; +import com.phonegap.*; + +public class Catalogue extends DroidGap { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + super.loadUrl("file:///android_asset/www/index.html"); + } +} \ No newline at end of file diff --git a/src/pl/org/nowoczesnapolska/wlmobi/Downloader.java b/src/pl/org/nowoczesnapolska/wlmobi/Downloader.java new file mode 100644 index 0000000..be5a7e9 --- /dev/null +++ b/src/pl/org/nowoczesnapolska/wlmobi/Downloader.java @@ -0,0 +1,96 @@ +package pl.org.nowoczesnapolska.wlmobi; + +/* + @author Mauro Rocco http://www.toforge.com + + Radek Czajka: don't prepend /sdcard/ +*/ + +import org.json.JSONArray; +import org.json.JSONException; + +import android.util.Log; + +import com.phonegap.DroidGap; +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class Downloader extends Plugin{ + + @Override + public PluginResult execute(String action, JSONArray args, String callbackId) { + if (action.equals("downloadFile")) { + try { + return this.downloadUrl(args.getString(0),args.getString(1),args.getString(2),args.getString(3)); + } catch (JSONException e) { + return new PluginResult(PluginResult.Status.ERROR, "Param errrors"); + } + } + else { + return new PluginResult(PluginResult.Status.INVALID_ACTION); + } + + } + + private PluginResult downloadUrl(String fileUrl, String dirName, String fileName, String overwrite){ + try{ + Log.d("DownloaderPlugin", "DIRECTORY CALLED "+dirName+" created"); + File dir = new File(dirName); + if(!dir.exists()){ + Log.d("DownloaderPlugin", "directory "+dirName+" created"); + dir.mkdirs(); + } + + File file = new File(dirName+fileName); + + if(overwrite.equals("false") && file.exists()){ + Log.d("DownloaderPlugin", "File already exist"); + return new PluginResult(PluginResult.Status.OK, "exist"); + } + + URL url = new URL(fileUrl); + HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); + ucon.setRequestMethod("GET"); + ucon.setDoOutput(true); + ucon.connect(); + + Log.d("DownloaderPlugin", "download begining"); + + Log.d("DownloaderPlugin", "download url:" + url); + + InputStream is = ucon.getInputStream(); + + byte[] buffer = new byte[1024]; + + int len1 = 0; + + FileOutputStream fos = new FileOutputStream(file); + + while ( (len1 = is.read(buffer)) > 0 ) { + fos.write(buffer, 0, len1); + //new String(buffer, "ISO8859_1").getBytes("UTF-8"), 0, len1); + } + + fos.close(); + + Log.d("DownloaderPlugin", "Download complete in" + fileName); + + } catch (IOException e) { + + Log.d("DownloaderPlugin", "Error: " + e); + return new PluginResult(PluginResult.Status.ERROR, "Error: " + e); + + } + + return new PluginResult(PluginResult.Status.OK, fileName); + + } + +} \ No newline at end of file -- 2.20.1