[sword-svn] r3633 - in trunk/bindings: Android cordova cordova/cordova-plugin-crosswire-sword cordova/cordova-plugin-crosswire-sword/doc cordova/cordova-plugin-crosswire-sword/src cordova/cordova-plugin-crosswire-sword/src/android cordova/cordova-plugin-crosswire-sword/src/blackberry10 cordova/cordova-plugin-crosswire-sword/src/firefoxos cordova/cordova-plugin-crosswire-sword/src/ios cordova/cordova-plugin-crosswire-sword/src/tizen cordova/cordova-plugin-crosswire-sword/src/ubuntu cordova/cordova-plugin-crosswire-sword/src/windows8 cordova/cordova-plugin-crosswire-sword/src/wp cordova/cordova-plugin-crosswire-sword/www cordova/org.crosswire.sword.cordova.SWORD cordova/org.crosswire.sword.cordova.SWORD/doc cordova/org.crosswire.sword.cordova.SWORD/src/android cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10 cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos cordova/org.crosswire.sword.cordova.SWORD/src/ios cordova/org.crosswire.sword.cordova.SWORD/src/tizen cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu cordova/org.crosswire.sword.cordova.SWORD/src/windows8 cordova/org.crosswire.sword.cordova.SWORD/src/wp cordova/org.crosswire.sword.cordova.SWORD/www

scribe at crosswire.org scribe at crosswire.org
Fri May 24 15:40:50 MST 2019


Author: scribe
Date: 2019-05-24 15:40:50 -0700 (Fri, 24 May 2019)
New Revision: 3633

Added:
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/LICENSE
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/README.md
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/RELEASENOTES.md
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/doc/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/doc/index.md
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/package.json
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/plugin.xml
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/android/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/android/SWORD.java
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/blackberry10/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/blackberry10/index.js
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/firefoxos/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/firefoxos/DeviceProxy.js
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.h
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.m
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD-Bridging-Header.h
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/tizen/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/tizen/DeviceProxy.js
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.cpp
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.h
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.js
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/windows8/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/windows8/DeviceProxy.js
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/wp/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/wp/Device.cs
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/www/
   trunk/bindings/cordova/cordova-plugin-crosswire-sword/www/SWORD.js
Removed:
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/LICENSE
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/README.md
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/RELEASENOTES.md
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/doc/index.md
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/package.json
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/plugin.xml
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/android/SWORD.java
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10/index.js
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos/DeviceProxy.js
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.h
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.m
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD-Bridging-Header.h
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD.swift
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/tizen/DeviceProxy.js
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.cpp
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.h
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.js
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/windows8/DeviceProxy.js
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/wp/Device.cs
   trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/www/SWORD.js
Modified:
   trunk/bindings/Android/Makefile
   trunk/bindings/cordova/Makefile
Log:
standardized and published cordova-plugin-crosswire-sword

Modified: trunk/bindings/Android/Makefile
===================================================================
--- trunk/bindings/Android/Makefile	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/Android/Makefile	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,14 +1,14 @@
 all: javawrapper
-	rm -rf ../cordova/org.crosswire.sword.cordova.SWORD/libs/android/*
-	cp -a SWORD/app/build/intermediates/transforms/stripDebugSymbol/release/0/lib/* ../cordova/org.crosswire.sword.cordova.SWORD/libs/android/
+	rm -rf ../cordova/cordova-plugin-crosswire-sword/libs/android/*
+	cp -a SWORD/app/build/intermediates/transforms/stripDebugSymbol/release/0/lib/* ../cordova/cordova-plugin-crosswire-sword/libs/android/
 
 debug: javawrapper
-	rm -rf ../cordova/org.crosswire.sword.cordova.SWORD/libs/android/*
-#	cp -a SWORD/app/build/intermediates/cmake/debug/obj/* ../cordova/org.crosswire.sword.cordova.SWORD/libs/android/
-	cp -a SWORD/app/build/intermediates/cmake/release/obj/* ../cordova/org.crosswire.sword.cordova.SWORD/libs/android/
+	rm -rf ../cordova/cordova-plugin-crosswire-sword/libs/android/*
+#	cp -a SWORD/app/build/intermediates/cmake/debug/obj/* ../cordova/cordova-plugin-crosswire-sword/libs/android/
+	cp -a SWORD/app/build/intermediates/cmake/release/obj/* ../cordova/cordova-plugin-crosswire-sword/libs/android/
 
 javawrapper:
-	cp -a SWORD/app/src/main/java/org/crosswire/android/sword/* ../cordova/org.crosswire.sword.cordova.SWORD/src/android/
+	cp -a SWORD/app/src/main/java/org/crosswire/android/sword/* ../cordova/cordova-plugin-crosswire-sword/src/android/
 
 clean:
 	#these are from ../java-jni

Modified: trunk/bindings/cordova/Makefile
===================================================================
--- trunk/bindings/cordova/Makefile	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/Makefile	2019-05-24 22:40:50 UTC (rev 3633)
@@ -4,14 +4,17 @@
 	@echo
 
 srcdeps:
-	mkdir -p org.crosswire.sword.cordova.SWORD/libs/ios/
-	cp ../../include/defs.h ../../include/flatapi.h org.crosswire.sword.cordova.SWORD/src/ios/
+	mkdir -p cordova-plugin-crosswire-sword/libs/ios/
+	cp ../../include/defs.h ../../include/flatapi.h cordova-plugin-crosswire-sword/src/ios/
 
 
 clean:
 	# these are from ../Android
-	rm -rf org.crosswire.sword.cordova.SWORD/libs/android/*
-	rm -rf org.crosswire.sword.cordova.SWORD/libs/ios/*
-	rm org.crosswire.sword.cordova.SWORD/src/android/AndroidMgr.java org.crosswire.sword.cordova.SWORD/src/android/InstallMgr.java org.crosswire.sword.cordova.SWORD/src/android/SWMgr.java org.crosswire.sword.cordova.SWORD/src/android/SWModule.java
-	rm org.crosswire.sword.cordova.SWORD/src/ios/defs.h org.crosswire.sword.cordova.SWORD/src/ios/flatapi.h
+	rm -rf cordova-plugin-crosswire-sword/libs/android/*
+	rm -rf cordova-plugin-crosswire-sword/libs/ios/*
+	rm cordova-plugin-crosswire-sword/src/android/AndroidMgr.java cordova-plugin-crosswire-sword/src/android/InstallMgr.java cordova-plugin-crosswire-sword/src/android/SWMgr.java cordova-plugin-crosswire-sword/src/android/SWModule.java
+	rm cordova-plugin-crosswire-sword/src/ios/defs.h cordova-plugin-crosswire-sword/src/ios/flatapi.h
 
+publish:
+	npm publish cordova-plugin-crosswire-sword/
+

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/LICENSE (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/LICENSE)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/LICENSE	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/LICENSE	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
\ No newline at end of file

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/README.md (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/README.md)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/README.md	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/README.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,22 @@
+<!---
+ license: 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.
+-->
+
+# org.apache.cordova.device
+
+Plugin documentation: [doc/index.md](doc/index.md)

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/RELEASENOTES.md (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/RELEASENOTES.md)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/RELEASENOTES.md	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/RELEASENOTES.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,57 @@
+<!--
+#
+# 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.
+#
+-->
+# Release Notes
+
+### 0.2.1 (Sept 5, 2013)
+* removed extraneous print statement
+* [CB-4432] copyright notice change
+
+### 0.2.3 (Sept 25, 2013)
+* CB-4889 bumping&resetting version
+* [windows8] commandProxy has moved
+* [BlackBerry10] removed uneeded permission tags in plugin.xml
+* CB-4889 renaming org.apache.cordova.core.device to org.apache.cordova.device
+* Rename CHANGELOG.md -> RELEASENOTES.md
+* updated to use commandProxy for ffos
+* add firefoxos support
+* [CB-4752] Incremented plugin version on dev branch. 
+
+### 0.2.4 (Oct 28, 2013)
+* CB-5128: added repo + issue tag in plugin.xml for device plugin
+* CB-5085 device.cordova returning wrong value
+* [CB-4915] Incremented plugin version on dev branch.
+
+### 0.2.5 (Dec 4, 2013)
+* CB-5316 Spell Cordova as a brand unless it's a command or script
+* [ubuntu] use cordova/exec/proxy
+* add ubuntu platform
+* Modify Device.platform logic to use amazon-fireos as the platform for Amazon Devices
+* 1. Added amazon-fireos platform. 2. Change to use cordova-amazon-fireos as the platform if user agent contains 'cordova-amazon-fireos'
+
+### 0.2.6 (Jan 02, 2014)
+* CB-5658 Add doc/index.md for Device plugin
+* CB-5504 Moving Telephony Logic out of Device
+
+### 0.2.7 (Jan 07, 2014)
+* CB-5737 Fix exception on close caused by left over telephony code from CB-5504
+
+### 0.2.8 (Feb 05, 2014)
+* Tizen support added

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/doc/index.md (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/doc/index.md)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/doc/index.md	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/doc/index.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,213 @@
+<!---
+    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.
+-->
+
+# org.apache.cordova.device
+
+This plugin defines a global `device` object, which describes the device's hardware and software.
+Although the object is in the global scope, it is not available until after the `deviceready` event.
+
+    document.addEventListener("deviceready", onDeviceReady, false);
+    function onDeviceReady() {
+        console.log(device.cordova);
+    }
+
+## Installation
+
+    cordova plugin add org.apache.cordova.device
+
+## Properties
+
+- device.cordova
+- device.model
+- device.name
+- device.platform
+- device.uuid
+- device.version
+
+## device.cordova
+
+Get the version of Cordova running on the device.
+
+### Supported Platforms
+
+- Amazon Fire OS
+- Android
+- BlackBerry 10
+- Firefox OS
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+## device.model
+
+The `device.model` returns the name of the device's model or
+product. The value is set by the device manufacturer and may be
+different across versions of the same product.
+
+### Supported Platforms
+
+- Android
+- BlackBerry 10
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+### Quick Example
+
+    // Android:    Nexus One       returns "Passion" (Nexus One code name)
+    //             Motorola Droid  returns "voles"
+    // BlackBerry: Torch 9800      returns "9800"
+    // iOS:     for the iPad Mini, returns iPad2,5; iPhone 5 is iPhone 5,1. See http://theiphonewiki.com/wiki/index.php?title=Models
+    //
+    var model = device.model;
+
+### Android Quirks
+
+- Gets the [product name](http://developer.android.com/reference/android/os/Build.html#PRODUCT) instead of the [model name](http://developer.android.com/reference/android/os/Build.html#MODEL), which is often the production code name. For example, the Nexus One returns `Passion`, and Motorola Droid returns `voles`.
+
+### Tizen Quirks
+
+- Returns the device model assigned by the vendor, for example, `TIZEN`
+
+### Windows Phone 7 and 8 Quirks
+
+- Returns the device model specified by the manufacturer. For example, the Samsung Focus returns `SGH-i917`.
+
+## device.name
+
+__WARNING__: `device.name` is deprecated as of version 2.3.0. Use `device.model` instead.
+
+## device.platform
+
+Get the device's operating system name.
+
+    var string = device.platform;
+
+### Supported Platforms
+
+- Android
+- BlackBerry 10
+- Firefox OS
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+### Quick Example
+
+    // Depending on the device, a few examples are:
+    //   - "Android"
+    //   - "BlackBerry 10"
+    //   - "iOS"
+    //   - "WinCE"
+    //   - "Tizen"
+    var devicePlatform = device.platform;
+
+### Windows Phone 7 Quirks
+
+Windows Phone 7 devices report the platform as `WinCE`.
+
+### Windows Phone 8 Quirks
+
+Windows Phone 8 devices report the platform as `Win32NT`.
+
+## device.uuid
+
+Get the device's Universally Unique Identifier ([UUID](http://en.wikipedia.org/wiki/Universally_Unique_Identifier)).
+
+    var string = device.uuid;
+
+### Description
+
+The details of how a UUID is generated are determined by the device manufacturer and are specific to the device's platform or model.
+
+### Supported Platforms
+
+- Android
+- BlackBerry 10
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+### Quick Example
+
+    // Android: Returns a random 64-bit integer (as a string, again!)
+    //          The integer is generated on the device's first boot
+    //
+    // BlackBerry: Returns the PIN number of the device
+    //             This is a nine-digit unique integer (as a string, though!)
+    //
+    // iPhone: (Paraphrased from the UIDevice Class documentation)
+    //         Returns a string of hash values created from multiple hardware identifies.
+    //         It is guaranteed to be unique for every device and can't be tied
+    //         to the user account.
+    // Windows Phone 7 : Returns a hash of device+current user,
+    // if the user is not defined, a guid is generated and will persist until the app is uninstalled
+    // Tizen: returns the device IMEI (International Mobile Equipment Identity or IMEI is a number
+    // unique to every GSM and UMTS mobile phone.
+    var deviceID = device.uuid;
+
+### iOS Quirk
+
+The `uuid` on iOS is not unique to a device, but varies for each
+application, for each installation.  It changes if you delete and
+re-install the app, and possibly also when you upgrade iOS, or even
+upgrade the app per version (apparent in iOS 5.1). The `uuid` is not
+a reliable value.
+
+### Windows Phone 7 and 8 Quirks
+
+The `uuid` for Windows Phone 7 requires the permission
+`ID_CAP_IDENTITY_DEVICE`.  Microsoft will likely deprecate this
+property soon.  If the capability is not available, the application
+generates a persistent guid that is maintained for the duration of the
+application's installation on the device.
+
+## device.version
+
+Get the operating system version.
+
+    var string = device.version;
+
+### Supported Platforms
+
+- Android 2.1+
+- BlackBerry 10
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+### Quick Example
+
+    // Android:    Froyo OS would return "2.2"
+    //             Eclair OS would return "2.1", "2.0.1", or "2.0"
+    //             Version can also return update level "2.1-update1"
+    //
+    // BlackBerry: Torch 9800 using OS 6.0 would return "6.0.0.600"
+    //
+    // iPhone:     iOS 3.2 returns "3.2"
+    //
+    // Windows Phone 7: returns current OS version number, ex. on Mango returns 7.10.7720
+    // Tizen: returns "TIZEN_20120425_2"
+    var deviceVersion = device.version;
+

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/package.json (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/package.json)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/package.json	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/package.json	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,29 @@
+{
+  "name": "cordova-plugin-crosswire-sword",
+  "version": "0.0.1",
+  "description": "The SWORD Project Plugin",
+  "cordova": {
+    "id": "cordova-plugin-crosswire-sword",
+    "platforms": [
+      "android",
+      "amazon-fireos",
+      "ios"
+    ]
+  },
+  "repository": {
+    "type": "svn",
+    "url": "https://crosswire.org/svn/sword"
+  },
+  "keywords": [
+    "cordova",
+    "crosswire",
+    "sword",
+    "Bible",
+    "ecosystem:cordova",
+    "cordova-android",
+    "cordova-ios",
+    "cordova-amazon-fireos"
+  ],
+  "author": "CrossWire Bible Society",
+  "license": "GNU 2.0"
+}

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/plugin.xml (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/plugin.xml)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/plugin.xml	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/plugin.xml	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
+    xmlns:rim="http://www.blackberry.com/ns/widgets"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    id="org.crosswire.sword.cordova.SWORD"
+    version="0.0.1">
+    <name>SWORD</name>
+    <description>The SWORD Project Plugin</description>
+    <license>GNU 2.0</license>
+    <keywords>cordova,sword,Bible</keywords>
+    <repo>https://crosswire.org/svn/sword</repo>
+    <issue>http://crosswire.org/tracker</issue>
+
+    <js-module src="www/SWORD.js" name="SWORD">
+        <clobbers target="SWORD" />
+    </js-module>
+
+    <!-- firefoxos
+    <platform name="firefoxos">
+        <config-file target="config.xml" parent="/*">
+            <feature name="Device">
+                <param name="firefoxos-package" value="Device" />
+            </feature>
+        </config-file>
+
+        <js-module src="src/firefoxos/DeviceProxy.js" name="DeviceProxy">
+            <runs />
+        </js-module>
+    </platform>
+ -->
+    <!-- tizen
+    <platform name="tizen">
+        <js-module src="src/tizen/DeviceProxy.js" name="DeviceProxy">
+            <runs />
+        </js-module>
+    </platform>
+ -->
+    <!-- android -->
+    <platform name="android">
+        <config-file target="res/xml/config.xml" parent="/*">
+            <feature name="SWORD" >
+                <param name="android-package" value="org.crosswire.sword.cordova.SWORD"/>
+            </feature>
+        </config-file>
+	<config-file target="AndroidManifest.xml" parent="/manifest">
+	    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+	</config-file>
+
+        <source-file src="src/android/SWORD.java" target-dir="src/org/crosswire/sword/cordova" />
+        <source-file src="src/android/SWMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/AndroidMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/SWModule.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/InstallMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="libs/android/arm64-v8a/libsword.so" target-dir="libs/arm64-v8a" />
+        <source-file src="libs/android/armeabi-v7a/libsword.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="libs/android/x86/libsword.so" target-dir="libs/x86" />
+        <source-file src="libs/android/x86_64/libsword.so" target-dir="libs/x86_64" />
+
+<!-- no longer needed with latest ndk
+        <source-file src="libs/android/arm64-v8a/libc++_shared.so" target-dir="libs/arm64-v8a" />
+        <source-file src="libs/android/armeabi-v7a/libc++_shared.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="libs/android/x86/libc++_shared.so" target-dir="libs/x86" />
+        <source-file src="libs/android/x86_64/libc++_shared.so" target-dir="libs/x86_64" />
+-->
+<!--
+        <source-file src="libs/android/arm64-v8a/libstlport_shared.so" target-dir="libs/arm64-v8a" />
+        <source-file src="libs/android/armeabi-v7a/libstlport_shared.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="libs/android/x86/libstlport_shared.so" target-dir="libs/x86" />
+        <source-file src="libs/android/x86_64/libstlport_shared.so" target-dir="libs/x86_64" />
+-->
+<!-- I think these are old names
+        <source-file src="libs/android/armeabi/libsword.so" target-dir="libs/armeabi" />
+        <source-file src="libs/android/mips64/libsword.so" target-dir="libs/mips64" />
+        <source-file src="libs/android/mips/libsword.so" target-dir="libs/mips" />
+-->
+    </platform>
+
+    <!-- amazon-fireos -->
+    <platform name="amazon-fireos">
+        <config-file target="res/xml/config.xml" parent="/*">
+            <feature name="SWORD" >
+                <param name="android-package" value="org.crosswire.sword.cordova"/>
+            </feature>
+        </config-file>
+
+        <source-file src="src/android/SWORD.java" target-dir="src/org/crosswire/sword/cordova" />
+        <source-file src="src/android/SWMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/AndroidMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/SWModule.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="src/android/InstallMgr.java" target-dir="src/org/crosswire/android/sword" />
+        <source-file src="libs/android/armeabi/libsword.so" target-dir="libs/armeabi" />
+        <source-file src="libs/android/arm64-v8a/libsword.so" target-dir="libs/arm64-v8a" />
+        <source-file src="libs/android/x86/libsword.so" target-dir="libs/x86" />
+        <source-file src="libs/android/mips64/libsword.so" target-dir="libs/mips64" />
+        <source-file src="libs/android/mips/libsword.so" target-dir="libs/mips" />
+        <source-file src="libs/android/armeabi-v7a/libsword.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="libs/android/x86_64/libsword.so" target-dir="libs/x86_64" />
+    </platform>
+    
+    <!-- ubuntu
+    <platform name="ubuntu">
+        <header-file src="src/ubuntu/device.h" />
+        <source-file src="src/ubuntu/device.cpp" />
+        <js-module src="src/ubuntu/device.js" name="DeviceProxy">
+            <merges target="device" />
+        </js-module>
+    </platform>
+ -->
+    <!-- ios -->
+	<platform name="ios">
+		<config-file target="config.xml" parent="/*">
+			<feature name="SWORD">
+				<param name="ios-package" value="SWORD" />
+			</feature>
+		</config-file>
+		<header-file src="src/ios/flatapi.h" />
+		<header-file src="src/ios/defs.h" />
+		<header-file src="src/ios/SWORD-Bridging-Header.h" />
+		<source-file src="src/ios/SWORD.swift" />
+		<source-file src="libs/ios/libSWORD.a" framework="true" />
+		<source-file src="libs/ios/libcurl.a" framework="true" />
+		<framework src="libstdc++.dylib" />
+		<framework src="libcurl.dylib" />
+
+		<dependency id="cordova-plugin-add-swift-support" />
+
+<!--	<source-file src="lib/ios/libSWORD.a" framework="true" /> -->
+	</platform>
+
+    <!-- blackberry10
+    <platform name="blackberry10">
+        <source-file src="src/blackberry10/index.js" target-dir="Device" />
+        <config-file target="www/config.xml" parent="/widget">
+            <feature name="Device" value="Device"/>
+        </config-file>
+        <config-file target="www/config.xml" parent="/widget/rim:permissions">
+            <rim:permit>read_device_identifying_information</rim:permit>
+        </config-file>
+    </platform>
+ -->
+    <!-- wp7
+    <platform name="wp7">
+        <config-file target="config.xml" parent="/*">
+            <feature name="Device">
+                <param name="wp-package" value="Device"/>
+            </feature>
+        </config-file>
+
+        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
+            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
+        </config-file>
+
+        <source-file src="src/wp/Device.cs" />
+    </platform>
+ -->
+    <!-- wp8
+    <platform name="wp8">
+        <config-file target="config.xml" parent="/*">
+            <feature name="Device">
+                <param name="wp-package" value="Device"/>
+            </feature>
+        </config-file>
+
+        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
+            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
+        </config-file>
+
+        <source-file src="src/wp/Device.cs" />
+    </platform>
+ -->
+    <!-- windows8
+    <platform name="windows8">
+        <js-module src="src/windows8/DeviceProxy.js" name="DeviceProxy">
+            <merges target="" />
+        </js-module>
+    </platform>
+ -->
+</plugin>

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/android/SWORD.java (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/android/SWORD.java)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/android/SWORD.java	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/android/SWORD.java	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,712 @@
+/*
+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.
+*/
+package org.crosswire.sword.cordova;
+
+import java.util.TimeZone;
+import java.util.Vector;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Arrays;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.apache.cordova.CordovaWebView;
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.apache.cordova.CordovaInterface;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.crosswire.android.sword.SWMgr;
+import org.crosswire.android.sword.AndroidMgr;
+import org.crosswire.android.sword.SWModule;
+import org.crosswire.android.sword.InstallMgr;
+
+import android.provider.Settings;
+import android.util.Log;
+import android.content.Intent;
+import android.app.Activity;
+
+public class SWORD extends CordovaPlugin {
+	public static final String TAG = "SWORD";
+	public static SWMgr mgr = null;
+	public static InstallMgr installMgr = null;
+	private CallbackContext installReporterContext = null;
+	private CallbackContext searchReporterContext = null;
+	private CallbackContext renderChapterContext = null;
+	private CallbackContext sendContext = null;
+
+	/**
+	* Constructor.
+	*/
+	public SWORD() {
+	}
+
+	/**
+	* Sets the context of the Command. This can then be used to do things like
+	* get file paths associated with the Activity.
+	*
+	* @param cordova The context of the main Activity.
+	* @param webView The CordovaWebView Cordova is running in.
+	*/
+	public void initialize(CordovaInterface cordova, CordovaWebView webView) {
+		super.initialize(cordova, webView);
+		mgr = new AndroidMgr(cordova.getActivity().getApplication());
+		installMgr = new InstallMgr();
+		installReporterContext = null;
+		searchReporterContext = null;
+		renderChapterContext = null;
+	}
+
+	/**
+	* Executes the request and returns PluginResult.
+	*
+	* @param action            The action to execute.
+	* @param args              JSONArry of arguments for the plugin.
+	* @param callbackContext   The callback id used when calling back into JavaScript.
+	* @return                  True if the action was valid, false if not.
+	*/
+	public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
+		if (action.equals("initSWORD")) {
+			JSONObject r = new JSONObject();
+			r.put("version", mgr.version());
+			callbackContext.success(r);
+		}
+		else if (action.equals("echo")) {
+			echo(callbackContext, args.getString(0));
+		}
+		else if (action.equals("InstallMgr_setUserDisclaimerConfirmed")) {
+			installMgr.setUserDisclaimerConfirmed();
+			callbackContext.success();
+		}
+		else if (action.equals("InstallMgr_syncConfig")) {
+			cordova.getThreadPool().execute(new Runnable() {
+				@Override
+				public void run() {
+					installMgr.syncConfig();
+					installMgr.reInit();
+					callbackContext.success();
+				}
+			});
+		}
+		else if (action.equals("InstallMgr_getRemoteSources")) {
+			JSONArray r = new JSONArray();
+			String sources[] = installMgr.getRemoteSources();
+			for (String s : sources) {
+				r.put(s);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("InstallMgr_refreshRemoteSource")) {
+			final String repo = args.getString(0);
+			cordova.getThreadPool().execute(new Runnable() {
+				@Override
+				public void run() {
+					installMgr.refreshRemoteSource(repo);
+					callbackContext.success();
+				}
+			});
+		}
+		else if (action.equals("InstallMgr_getRemoteModInfoList")) {
+			JSONArray r = new JSONArray();
+			for (SWMgr.ModInfo mi : installMgr.getRemoteModInfoList(args.getString(0))) {
+				JSONObject m = new JSONObject();
+				m.put("name", mi.name);
+				m.put("description", mi.description);
+				m.put("category", mi.category);
+				m.put("language", mi.language);
+				m.put("version", mi.version);
+				m.put("delta", mi.delta);
+				m.put("cipherKey", mi.cipherKey);
+				m.put("features", new JSONArray(Arrays.asList(mi.features)));
+				r.put(m);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("InstallMgr_remoteInstallModule")) {
+			this.installReporterContext = callbackContext;
+			final String repo = args.getString(0);
+			final String modName = args.getString(1);
+			cordova.getThreadPool().execute(new Runnable() {
+			    @Override
+			    public void run() {
+
+				installMgr.remoteInstallModule(repo, modName, new InstallMgr.InstallProgressReporter() {
+					public void update(long totalBytes, long completedBytes) {
+	/*
+	// callback({ status : preStatus|update|complete, totalBytes : n, completedBytes : n, message : displayable });
+	*/
+						try {
+
+							JSONObject m = new JSONObject();
+							m.put("status", "update");
+							m.put("totalBytes", totalBytes);
+							m.put("completedBytes", completedBytes);
+							if (installReporterContext != null) {
+								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+								result.setKeepCallback(true);
+								installReporterContext.sendPluginResult(result);
+							}
+						}
+						catch (Exception e) { e.printStackTrace(); }
+					}
+					public void preStatus(long totalBytes, long completedBytes, String message) {
+						try {
+							JSONObject m = new JSONObject();
+							m.put("status", ("Complete".equals(message)) ? "complete" : "preStatus");
+							m.put("totalBytes", totalBytes);
+							m.put("completedBytes", completedBytes);
+							m.put("message", message);
+							if (installReporterContext != null) {
+								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+								result.setKeepCallback(!"Complete".equals(message));
+								installReporterContext.sendPluginResult(result);
+							}
+							if ("Complete".equals(message)) {
+								// let's be sure we see our new module
+								mgr.reInit();
+								// and clear out context
+								installReporterContext = null;
+							}
+						}
+						catch (Exception e) { e.printStackTrace(); }
+					}
+				});
+
+			    }
+			});
+
+			PluginResult result = new PluginResult(PluginResult.Status.OK);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else if (action.equals("InstallMgr_uninstallModule")) {
+			installMgr.uninstallModule(args.getString(0));
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_getExtraConfigSections")) {
+			JSONArray r = new JSONArray();
+			for (String s : mgr.getExtraConfigSections()) {
+				r.put(s);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWMgr_getExtraConfigKeys")) {
+			JSONArray r = new JSONArray();
+			for (String s : mgr.getExtraConfigKeys(args.getString(0))) {
+				r.put(s);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWMgr_getExtraConfigValue")) {
+			callbackContext.success(mgr.getExtraConfigValue(args.getString(0), args.getString(1)));
+		}
+		else if (action.equals("SWMgr_setExtraConfigValue")) {
+			mgr.setExtraConfigValue(args.getString(0), args.getString(1), args.getString(2));
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_addExtraConfig")) {
+			JSONArray r = new JSONArray();
+			for (String s : mgr.addExtraConfig(args.getString(0))) {
+				r.put(s);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWMgr_getModInfoList")) {
+			JSONArray r = new JSONArray();
+			for (SWMgr.ModInfo mi : mgr.getModInfoList()) {
+				JSONObject m = new JSONObject();
+				m.put("name", mi.name);
+				m.put("description", mi.description);
+				m.put("category", mi.category);
+				m.put("language", mi.language);
+				m.put("version", mi.version);
+				m.put("delta", mi.delta);
+				m.put("cipherKey", mi.cipherKey);
+				m.put("features", new JSONArray(Arrays.asList(mi.features)));
+				r.put(m);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWMgr_getModuleByName")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			// didn't find module is not an error
+			if (mod == null) { callbackContext.success(); return true; }
+
+			JSONObject m = new JSONObject();
+			m.put("name", mod.getName());
+			m.put("description", mod.getDescription());
+			m.put("category", mod.getCategory());
+			m.put("direction", mod.getConfigEntry("Direction"));
+			m.put("language", mod.getConfigEntry("Lang"));
+			m.put("font", mod.getConfigEntry("Font"));
+			m.put("shortCopyright", mod.getConfigEntry("ShortCopyright"));
+			m.put("shortPromo", mod.getConfigEntry("ShortPromo"));
+			m.put("cipherKey", mod.getConfigEntry("CipherKey"));
+			callbackContext.success(m);
+		}
+		else if (action.equals("SWModule_setKeyText")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			mod.setKeyText(args.getString(1));
+			callbackContext.success();
+		}
+		else if (action.equals("SWModule_getKeyText")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success(mod.getKeyText());
+		}
+		else if (action.equals("SWModule_search")) {
+			this.searchReporterContext = callbackContext;
+			final SWModule mod = mgr.getModuleByName(args.getString(0));
+			final String expression = args.getString(1);
+			final int searchType = args.getInt(2);
+			final long flags = args.getLong(3);
+			final String scope = JSONObject.NULL.equals(args.getString(4)) || "null".equals(args.getString(4)) ? null : args.getString(4);
+			cordova.getThreadPool().execute(new Runnable() {
+			    @Override
+			    public void run() {
+
+				SWModule.SearchHit[] results = mod.search(expression, searchType, flags, scope, new SWModule.SearchProgressReporter() {
+					public void progressReport(int percent) {
+						try {
+							JSONObject m = new JSONObject();
+							m.put("status", "update");
+							m.put("percent", percent);
+							if (searchReporterContext != null) {
+								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+								result.setKeepCallback(true);
+								searchReporterContext.sendPluginResult(result);
+							}
+						}
+						catch (Exception e) { e.printStackTrace(); }
+					}
+				});
+				try {
+					JSONObject m = new JSONObject();
+					m.put("status", "complete");
+					m.put("percent", 100);
+					JSONArray r = new JSONArray();
+					for (SWModule.SearchHit s : results) {
+						JSONObject re = new JSONObject();
+						re.put("key", s.key);
+						re.put("score", s.score);
+						r.put(re);
+					}
+					m.put("results", r);
+					if (searchReporterContext != null) {
+						PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+						result.setKeepCallback(false);
+						searchReporterContext.sendPluginResult(result);
+					}
+				}
+				catch (Exception e) { e.printStackTrace(); }
+				searchReporterContext = null;
+			    }
+			});
+
+			PluginResult result = new PluginResult(PluginResult.Status.OK);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else if (action.equals("SWModule_getRenderChapter")) {
+			this.renderChapterContext = callbackContext;
+
+			final SWModule masterMod = mgr.getModuleByName(args.getString(0));
+			final SWModule mod = mgr.getModuleByName(args.getString(1));
+			if (masterMod == null) { callbackContext.error("couldn't find master module: " + args.getString(0)); return true; }
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(1)); return true; }
+
+			cordova.getThreadPool().execute(new Runnable() {
+			    @Override
+			    public void run() {
+
+				JSONArray r = new JSONArray();
+				try {
+					r = getRenderChapter(masterMod, mod);
+				} catch (JSONException e) { e.printStackTrace(); }
+				PluginResult result = new PluginResult(PluginResult.Status.OK, r);
+				result.setKeepCallback(false);
+				if (renderChapterContext != null) {
+					renderChapterContext.sendPluginResult(result);
+					renderChapterContext = null;
+				}
+			    }
+			});
+
+			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else if (action.equals("SWMgr_startBibleSync")) {
+			final CallbackContext bibleSyncListener = callbackContext;
+			final String appName = args.getString(0);
+			final String userName = args.getString(1);
+			final String passphrase = args.getString(2);
+
+			cordova.getThreadPool().execute(new Runnable() {
+			    @Override
+			    public void run() {
+				mgr.startBibleSync(appName, userName, passphrase, new SWMgr.BibleSyncListener() {
+					public void navReceived(String message) {
+						try {
+							JSONObject m = new JSONObject();
+							m.put("cmd", "nav");
+							m.put("osisRef", message);
+							PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+							result.setKeepCallback(true);
+							bibleSyncListener.sendPluginResult(result);
+						}
+						catch (Exception e) { e.printStackTrace(); }
+					}
+					public void chatReceived(String user, String message) {
+						try {
+							JSONObject m = new JSONObject();
+							m.put("cmd", "chat");
+							m.put("user", user);
+							m.put("message", message);
+							PluginResult result = new PluginResult(PluginResult.Status.OK, m);
+							result.setKeepCallback(true);
+							bibleSyncListener.sendPluginResult(result);
+						}
+						catch (Exception e) { e.printStackTrace(); }
+					}
+				});
+			    }
+			});
+
+			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else if (action.equals("SWMgr_stopBibleSync")) {
+			mgr.stopBibleSync();
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_setJavascript")) {
+			boolean val = args.getBoolean(0);
+			mgr.setJavascript(val);
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_sendBibleSyncMessage")) {
+			String osisRef = args.getString(0);
+			mgr.sendBibleSyncMessage(osisRef);
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_getAvailableLocales")) {
+			JSONArray r = new JSONArray();
+			for (String s : mgr.getAvailableLocales()) {
+				r.put(s);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWMgr_setDefaultLocale")) {
+			String val = args.getString(0);
+			mgr.setDefaultLocale(val);
+			callbackContext.success();
+		}
+		else if (action.equals("SWMgr_translate")) {
+			String text = args.getString(0);
+			String locale = args.getString(1);
+			String translated = mgr.translate(text, locale);
+			callbackContext.success(translated);
+		}
+		else if (action.equals("SWModule_getRenderText")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success(mod.getRenderText());
+		}
+		else if (action.equals("SWModule_sendText")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			this.sendContext = callbackContext;
+			sendVerse(mod, new String[] { mod.getKeyText() }, cordova, this);
+			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else if (action.equals("SWModule_getRenderHeader")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success(mod.getRenderHeader());
+		}
+		else if (action.equals("SWModule_getKeyChildren")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			JSONArray r = new JSONArray();
+			for (String k : mod.getKeyChildren()) {
+				r.put(k);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWModule_getConfigEntry")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success(mod.getConfigEntry(args.getString(1)));
+		}
+		else if (action.equals("SWModule_getEntryAttribute")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			JSONArray r = new JSONArray();
+			for (String k : mod.getEntryAttribute(args.getString(1), args.getString(2), args.getString(3), args.getBoolean(4))) {
+				r.put(k);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("SWModule_popError")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success((int)mod.error());
+		}
+		else if (action.equals("SWModule_next")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			mod.next();
+			callbackContext.success();
+		}
+		else if (action.equals("SWModule_previous")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			mod.previous();
+			callbackContext.success();
+		}
+		else if (action.equals("SWModule_begin")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			mod.begin();
+			callbackContext.success();
+		}
+		else if (action.equals("SWModule_getVerseKey")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			callbackContext.success(getVerseKey(mod.getKeyChildren()));
+		}
+		else if (action.equals("SWModule_getBookNames")) {
+			SWModule mod = mgr.getModuleByName(args.getString(0));
+			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
+			JSONArray r = new JSONArray();
+			for (String b : getBookNames(mod)) {
+				r.put(b);
+			}
+			callbackContext.success(r);
+		}
+		else if (action.equals("HTTPUtils_makeRequest")) {
+			final CallbackContext makeRequestContext = callbackContext;
+
+			final String url      = args.getString(0);
+			final String postData = args.getString(1);
+			final int method      = args.getInt(2);
+Log.d(TAG, "makeRequest(url: " + url + ", postData: " + postData + ", method: " + method);
+
+			cordova.getThreadPool().execute(new Runnable() {
+				@Override
+				public void run() {
+					String response = makeRequest(url, postData, method, null);
+					PluginResult result = new PluginResult(PluginResult.Status.OK, response);
+					result.setKeepCallback(false);
+					makeRequestContext.sendPluginResult(result);
+				}
+			});
+
+			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
+			result.setKeepCallback(true);
+			callbackContext.sendPluginResult(result);
+		}
+		else return false;
+
+		return true;
+	}
+
+	JSONObject getVerseKey(String keyChildren[]) throws JSONException {
+		JSONObject retVal = new JSONObject();
+		if (keyChildren != null && keyChildren.length > 9) {
+			retVal.put("testament",  Integer.parseInt(keyChildren[SWModule.VERSEKEY_TESTAMENT]));
+			retVal.put("book",       Integer.parseInt(keyChildren[SWModule.VERSEKEY_BOOK]));
+			retVal.put("chapter",    Integer.parseInt(keyChildren[SWModule.VERSEKEY_CHAPTER]));
+			retVal.put("verse",      Integer.parseInt(keyChildren[SWModule.VERSEKEY_VERSE]));
+			retVal.put("chapterMax", Integer.parseInt(keyChildren[SWModule.VERSEKEY_CHAPTERMAX]));
+			retVal.put("verseMax",   Integer.parseInt(keyChildren[SWModule.VERSEKEY_VERSEMAX]));
+			retVal.put("bookName",   keyChildren[SWModule.VERSEKEY_BOOKNAME]);
+			retVal.put("osisRef",    keyChildren[SWModule.VERSEKEY_OSISREF]);
+			retVal.put("shortText",  keyChildren[SWModule.VERSEKEY_SHORTTEXT]);
+			retVal.put("bookAbbrev", keyChildren[SWModule.VERSEKEY_BOOKABBREV]);
+		}
+		return retVal;
+	}
+
+	public JSONArray getRenderChapter(SWModule masterMod, SWModule mod) throws JSONException {
+		JSONArray r = new JSONArray();
+
+		// save our current keys so we can set our mods back when we're done
+		String saveMasterKey = masterMod.getKeyText();
+		String saveKey = mod.getKeyText();
+
+		String currentKey[]   = masterMod.getKeyChildren();
+
+		// assert we have a valid location
+		if (currentKey.length <= SWModule.VERSEKEY_BOOKABBREV || currentKey.length <= SWModule.VERSEKEY_CHAPTER) return r;
+
+		masterMod.setKeyText(currentKey[SWModule.VERSEKEY_BOOKABBREV]+"."+currentKey[SWModule.VERSEKEY_CHAPTER]+".1");
+
+		String [] verseKey = masterMod.getKeyChildren();
+		while (
+				   masterMod.error() == 0
+				&& currentKey[SWModule.VERSEKEY_BOOK].equals(verseKey[SWModule.VERSEKEY_BOOK])
+				&& currentKey[SWModule.VERSEKEY_CHAPTER].equals(verseKey[SWModule.VERSEKEY_CHAPTER])) {
+
+			mod.setKeyText(verseKey[SWModule.VERSEKEY_OSISREF]);
+			char error = mod.error();
+			JSONObject v = new JSONObject();
+			if (((int)error) == 0) {
+				v.put("verse", getVerseKey(mod.getKeyChildren()));
+				String preVerse = "";
+				for (String h : mod.getEntryAttribute("Heading", "Preverse", "", true)) {
+					preVerse += h;
+				}
+				v.put("preVerse", preVerse);
+				v.put("text", mod.getRenderText());
+			}
+			else {
+/* null removes entry
+				v.put("verse", null);
+				v.put("preVerse", null);
+				v.put("text", null);
+*/
+			}
+			r.put(v);
+			masterMod.next();
+			verseKey = masterMod.getKeyChildren();
+		}
+
+		masterMod.setKeyText(saveMasterKey);
+		mod.setKeyText(saveKey);
+
+		return r;
+	}
+
+
+	public Vector<String> getBookNames(SWModule mod) {
+		Vector<String> books = new Vector<String>();
+		for (mod.begin(); mod.error() == 0; mod.setKeyText("+book")) {
+			books.add(mod.getKeyChildren()[9]);
+		}
+		return books;
+	}
+
+	//--------------------------------------------------------------------------
+	// LOCAL METHODS
+	//--------------------------------------------------------------------------
+
+	public void echo(CallbackContext callbackContext, String message) {
+		if (message != null && message.length() > 0) {
+			callbackContext.success(message);
+		}
+		else {
+			callbackContext.error("expected 1 arg");
+		}
+	}
+
+	public static final int METHOD_GET  = 0;
+	public static final int METHOD_POST = 1;
+	public static final String METHODS_TEXT[] = { "GET", "POST" };
+
+	public static String makeRequest(String url, String postData, int method, Map<String, String> headers) {
+		HttpURLConnection connection = null;
+
+		Map<String, String> defaultHeaders = new HashMap<String, String>();
+		defaultHeaders.put("Accept", "*/*");
+//		defaultHeaders.put("Content-Type", "application/xml");
+	 	defaultHeaders.put("Content-Type", "application/x-www-form-urlencoded");
+		if (method != METHOD_GET && postData != null) defaultHeaders.put("Content-Length", Integer.toString(postData.length()));
+
+		try {
+			if (headers != null) defaultHeaders.putAll(headers);
+
+			if (method == METHOD_GET && postData != null && postData.length() > 0) {
+				// some sanity checks for appending GET params to URL
+				if (url.indexOf("?") < 0) if (!postData.startsWith("?")) url += "?";
+				else if (!url.endsWith("&") && !postData.startsWith("&")) url += "&";
+
+				url += postData;
+			}
+
+			connection = (HttpURLConnection) new URL(url).openConnection();
+			connection.setRequestMethod(METHODS_TEXT[method]);
+			for (String k : defaultHeaders.keySet()) {
+				connection.setRequestProperty(k, defaultHeaders.get(k));
+			}
+			if (method == METHOD_POST) {
+				connection.setDoOutput(true);
+				if (postData != null) {
+					DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
+					dos.writeBytes(postData);
+					dos.flush();
+					dos.close();
+				}
+			}
+			int responseCode = connection.getResponseCode();
+			BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+			StringBuilder response = new StringBuilder();
+			String line;
+			while ((line = br.readLine()) != null) {
+				response.append(line);
+			}
+			/* do something special if success code?
+			if (responseCode >= 200 && responseCode < 300) {
+			}
+			else throw new Exception("HTTP Response: " + responseCode);
+			*/
+			return response.toString();
+		}
+		catch (Exception e) { e.printStackTrace(); }
+		return null;
+	}
+	public static void sendVerse(final SWModule mod, final String verse[], final CordovaInterface cordova, final CordovaPlugin plugin) {
+		cordova.getThreadPool().execute(new Runnable() {
+			public void run() {
+				String subject = mod.getKeyChildren()[SWModule.VERSEKEY_SHORTTEXT] + " (" + mod.getName() + ")";
+				String message = mod.getStripText() + " --" +subject;
+				final Intent sendIntent = new Intent(Intent.ACTION_SEND);
+				sendIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+
+				sendIntent.setType("text/plain");
+
+				sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
+				sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, message);
+
+				cordova.startActivityForResult(plugin, Intent.createChooser(sendIntent, null), 1);
+			}
+		});
+	}
+
+	public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+		switch (requestCode) {
+		case 1: 
+			sendContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, resultCode == Activity.RESULT_OK));
+		}
+		super.onActivityResult(requestCode, resultCode, intent);
+	}
+
+}

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/blackberry10/index.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10/index.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/blackberry10/index.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/blackberry10/index.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,69 @@
+/*
+ *
+ * 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 getModelName () {
+    var modelName = window.qnx.webplatform.device.modelName;
+    //Pre 10.2 (meaning Z10 or Q10)
+    if (typeof modelName === "undefined") {
+        if (window.screen.height === 720 && window.screen.width === 720) {
+            if ( window.matchMedia("(-blackberry-display-technology: -blackberry-display-oled)").matches) {
+                modelName = "Q10";
+            } else {
+                modelName = "Q5";
+            }
+        } else if ((window.screen.height === 1280 && window.screen.width === 768) ||
+                   (window.screen.height === 768 && window.screen.width === 1280)) {
+            modelName = "Z10";
+        } else {
+            modelName = window.qnx.webplatform.deviceName;
+        }
+    }
+
+    return modelName;
+}
+
+function getUUID () {
+    var uuid = "";
+    try {
+        //Must surround by try catch because this will throw if the app is missing permissions
+        uuid = window.qnx.webplatform.device.devicePin;
+    } catch (e) {
+        //DO Nothing
+    }
+    return uuid;
+}
+
+module.exports = {
+    getDeviceInfo: function (success, fail, args, env) {
+        var result = new PluginResult(args, env),
+            modelName = getModelName(),
+            uuid = getUUID(),
+            info = {
+                platform: "blackberry10",
+                version: window.qnx.webplatform.device.scmBundle,
+                model: modelName,
+                uuid: uuid,
+                cordova: "dev"
+            };
+
+        result.ok(info);
+    }
+};

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/firefoxos/DeviceProxy.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos/DeviceProxy.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/firefoxos/DeviceProxy.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/firefoxos/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,39 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+var firefoxos = require('cordova/platform');
+var cordova = require('cordova');
+
+module.exports = {
+    getDeviceInfo: function(success, error) {
+        setTimeout(function () {
+            success({
+                cordova: firefoxos.cordovaVersion,
+                platform: 'firefoxos',
+                model: null,
+                version: null,
+                uuid: null
+            });
+        }, 0);
+    }
+};
+
+require("cordova/firefoxos/commandProxy").add("Device", module.exports);

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.h (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.h)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.h	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,30 @@
+/*
+ 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.
+ */
+
+#import <UIKit/UIKit.h>
+#import <Cordova/CDVPlugin.h>
+
+ at interface CDVDevice : CDVPlugin
+{}
+
++ (NSString*)cordovaVersion;
+
+- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command;
+
+ at end

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.m (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.m)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.m	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/CDVDevice.m	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,90 @@
+/*
+ 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.
+ */
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#import <Cordova/CDV.h>
+#import "CDVDevice.h"
+
+ at implementation UIDevice (ModelVersion)
+
+- (NSString*)modelVersion
+{
+    size_t size;
+
+    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
+    char* machine = malloc(size);
+    sysctlbyname("hw.machine", machine, &size, NULL, 0);
+    NSString* platform = [NSString stringWithUTF8String:machine];
+    free(machine);
+
+    return platform;
+}
+
+ at end
+
+ at interface CDVDevice () {}
+ at end
+
+ at implementation CDVDevice
+
+- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command
+{
+    NSDictionary* deviceProperties = [self deviceProperties];
+    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:deviceProperties];
+
+    /* Settings.plist
+     * Read the optional Settings.plist file and push these user-defined settings down into the web application.
+     * This can be useful for supplying build-time configuration variables down to the app to change its behavior,
+     * such as specifying Full / Lite version, or localization (English vs German, for instance).
+     */
+    // TODO: turn this into an iOS only plugin
+    NSDictionary* temp = [CDVViewController getBundlePlist:@"Settings"];
+
+    if ([temp respondsToSelector:@selector(JSONString)]) {
+        NSLog(@"Deprecation warning: window.Setting will be removed Aug 2013. Refer to https://issues.apache.org/jira/browse/CB-2433");
+        NSString* js = [NSString stringWithFormat:@"window.Settings = %@;", [temp JSONString]];
+        [self.commandDelegate evalJs:js];
+    }
+
+    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+}
+
+- (NSDictionary*)deviceProperties
+{
+    UIDevice* device = [UIDevice currentDevice];
+    NSMutableDictionary* devProps = [NSMutableDictionary dictionaryWithCapacity:4];
+
+    [devProps setObject:[device modelVersion] forKey:@"model"];
+    [devProps setObject:@"iOS" forKey:@"platform"];
+    [devProps setObject:[device systemVersion] forKey:@"version"];
+    [devProps setObject:[device uniqueAppInstanceIdentifier] forKey:@"uuid"];
+    [devProps setObject:[[self class] cordovaVersion] forKey:@"cordova"];
+
+    NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps];
+    return devReturn;
+}
+
++ (NSString*)cordovaVersion
+{
+    return CDV_VERSION;
+}
+
+ at end

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD-Bridging-Header.h (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD-Bridging-Header.h)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD-Bridging-Header.h	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD-Bridging-Header.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1 @@
+#import "flatapi.h"

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD.swift)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,878 @@
+import MessageUI
+
+var mySWORDPlugin:SWORD? = nil
+
+ at objc(SWORD) class SWORD : CDVPlugin, MFMessageComposeViewControllerDelegate {
+	var mgr = 0;
+	var installMgr = 0
+	var disclaimerConfirmed = false;
+    
+	@objc(initSWORD:)
+	func initSWORD(command: CDVInvokedUrlCommand) {
+		mgr = 0
+		installMgr = 0
+		disclaimerConfirmed = false
+		mySWORDPlugin = nil
+		VERSEKEY_BOOKABBREV = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKABBREV);
+		VERSEKEY_BOOK = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOK);
+		VERSEKEY_CHAPTER = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPTER);
+		VERSEKEY_VERSE = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSE);
+		VERSEKEY_TESTAMENT = Int(org_crosswire_sword_SWModule_VERSEKEY_TESTAMENT);
+		VERSEKEY_OSISREF = Int(org_crosswire_sword_SWModule_VERSEKEY_OSISREF);
+		VERSEKEY_CHAPMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPMAX);
+		VERSEKEY_VERSEMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSEMAX);
+		VERSEKEY_BOOKNAME = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKNAME);
+		VERSEKEY_SHORTTEXT = Int(org_crosswire_sword_SWModule_VERSEKEY_SHORTTEXT);
+
+		initMgr()
+
+		let libswordVersion = String(cString: org_crosswire_sword_SWMgr_version(mgr))
+		debugPrint("libswordVersion: " + libswordVersion)
+        let info = [
+            "version": libswordVersion
+        ] as [AnyHashable : Any]
+		self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: info), callbackId: command.callbackId)
+	}
+
+
+	func myToast(message: String) {
+		let toastController: UIAlertController = UIAlertController(title: "", message: message, preferredStyle: .alert)
+		self.viewController?.present(toastController, animated: true, completion: nil)
+		DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
+			toastController.dismiss(animated: true, completion: nil)
+		}
+	}
+
+
+	func initMgr() {
+		if (mgr == 0) {
+			let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+			mgr = org_crosswire_sword_SWMgr_newWithPath(baseDir)
+debugPrint("initMgr, mgr: " + String(describing: mgr))
+		}
+	}
+
+
+	func reinitMgr() {
+		if (mgr != 0) {
+			org_crosswire_sword_SWMgr_delete(mgr)
+		}
+		mgr = 0
+		initMgr()
+	}
+
+    
+    func reinitInstall() {
+        if (installMgr != 0) {
+            org_crosswire_sword_InstallMgr_delete(installMgr)
+        }
+        installMgr = 0
+        initInstall()
+    }
+    
+    func logError(message: String) {
+        org_crosswire_sword_SWlog_logError(message)
+    }
+    func logDebug(message: String) {
+        org_crosswire_sword_SWlog_logDebug(message)
+    }
+    func logWarning(message: String) {
+        org_crosswire_sword_SWlog_logWarning(message)
+    }
+    func logInformation(message: String) {
+        org_crosswire_sword_SWlog_logInformation(message)
+    }
+    func logTimedInformation(message: String) {
+        org_crosswire_sword_SWlog_logTimedInformation(message)
+    }
+
+    
+    func initInstall() {
+    
+        if (installMgr == 0) {
+            logDebug(message: "initInstall: installMgr is null");
+            let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+            installMgr = org_crosswire_sword_InstallMgr_new(baseDir, { (message: Optional<UnsafePointer<Int8>>, totalBytes: u_long, completedBytes: u_long) in
+                let msg = String(cString: message!)
+                if (msg == "update") {
+                    let response = [
+                        "status": "update",
+                        "totalBytes": totalBytes,
+                        "completedBytes": completedBytes
+                        ] as [String : Any]
+                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
+                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
+                        result?.setKeepCallbackAs(true)
+                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
+                    }
+                }
+                else {
+                    let response = [
+                        "status": "preStatus",
+                        "totalBytes": totalBytes,
+                        "completedBytes": completedBytes,
+                        "message": msg
+                        ] as [String : Any]
+                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
+                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
+                        result?.setKeepCallbackAs(true)
+                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
+                    }
+                }
+            })
+            if (disclaimerConfirmed) {
+                org_crosswire_sword_InstallMgr_setUserDisclaimerConfirmed(installMgr)
+            }
+            logDebug(message: "initInstall: instantiated InstallMgr with baseDir: \(baseDir)");
+        }
+    }
+
+	@objc(SWMgr_getModuleByName:)
+	func SWMgr_getModuleByName(command: CDVInvokedUrlCommand) {
+
+		initMgr();
+
+		let modName = command.arguments[0] as? String ?? ""
+        let module = org_crosswire_sword_SWMgr_getModuleByName(mgr, modName)
+
+        if (module == 0) {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK), callbackId: command.callbackId)
+            return
+        }
+        
+        let name = org_crosswire_sword_SWModule_getName(module)
+        let description = org_crosswire_sword_SWModule_getDescription(module)
+        let category = org_crosswire_sword_SWModule_getCategory(module)
+
+        var response = [
+            "name": name == nil ? "" : String(cString: name!),
+            "description": description == nil ? "" : String(cString: description!),
+            "category": category == nil ? "" : String(cString: category!)
+        ]
+        let language = org_crosswire_sword_SWModule_getConfigEntry(module, "Lang")
+        response["language"] =  language == nil ? "" : String(cString: language!)
+        let direction = org_crosswire_sword_SWModule_getConfigEntry(module, "Direction")
+        response["direction"] =  direction == nil ? "" : String(cString: direction!)
+        let font = org_crosswire_sword_SWModule_getConfigEntry(module, "Font")
+        response["font"] =  font == nil ? "" : String(cString: font!)
+        let shortCopyright = org_crosswire_sword_SWModule_getConfigEntry(module, "ShortCopyright")
+        response["shortCopyright"] =  shortCopyright == nil ? "" : String(cString: shortCopyright!)
+        let cipherKey = org_crosswire_sword_SWModule_getConfigEntry(module, "CipherKey")
+        response["cipherKey"] =  cipherKey == nil ? "" : String(cString: cipherKey!)
+        let shortPromo = org_crosswire_sword_SWModule_getConfigEntry(module, "ShortPromo")
+        response["shortPromo"] = shortPromo == nil ? "" : String(cString: shortPromo!)
+
+
+		self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response), callbackId: command.callbackId)
+	}
+
+
+
+    @objc(SWMgr_addExtraConfig:)
+    func SWMgr_addExtraConfig(command: CDVInvokedUrlCommand) {
+        let blob = command.arguments[0] as? String ?? ""
+        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+        let confPath = baseDir + "/extraConfig.conf";
+        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_augmentConfig(confPath, blob))
+	self.reinitMgr()
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(SWMgr_setExtraConfigValue:)
+    func SWMgr_setExtraConfigValue(command: CDVInvokedUrlCommand) {
+        let section = command.arguments[0] as? String ?? ""
+        let key = command.arguments[1] as? String ?? ""
+        let val = command.arguments[2] as? String ?? ""
+        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+        let confPath = baseDir + "/extraConfig.conf";
+        org_crosswire_sword_SWConfig_setKeyValue(confPath, section, key, val)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_setExtraConfigValue"), callbackId: command.callbackId)
+    }
+
+    
+    @objc(SWMgr_getExtraConfigValue:)
+    func SWMgr_getExtraConfigValue(command: CDVInvokedUrlCommand) {
+        let section = command.arguments[0] as? String ?? ""
+        let key = command.arguments[1] as? String ?? ""
+        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+        let confPath = baseDir + "/extraConfig.conf";
+        let keyVal = org_crosswire_sword_SWConfig_getKeyValue(confPath, section, key)
+        let retVal = keyVal == nil ? nil : String(cString:keyVal!)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(SWMgr_getExtraConfigKeys:)
+    func SWMgr_getExtraConfigKeys(command: CDVInvokedUrlCommand) {
+        let section = command.arguments[0] as? String ?? ""
+        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+        let confPath = baseDir + "/extraConfig.conf";
+        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_getSectionKeys(confPath, section))
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+    }
+
+    
+	@objc(SWMgr_getExtraConfigSections:)
+	func SWMgr_getExtraConfigSections(command: CDVInvokedUrlCommand) {
+		let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
+		let confPath = baseDir + "/extraConfig.conf";
+        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_getSections(confPath))
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+  }
+    
+    
+    @objc(echo:)
+    func echo(command: CDVInvokedUrlCommand) {
+        let msg = command.arguments[0] as? String ?? ""
+        myToast(message: msg)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: msg), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(HTTPUtils_makeRequest:)
+    func HTTPUtils_makeRequest(command: CDVInvokedUrlCommand) {
+        var url = command.arguments[0] as? String ?? ""
+        let postData = command.arguments[1] as? String ?? ""
+        let method = command.arguments[2] as? Int ?? 1
+        
+        if method == 1 {
+            url += "?" + postData
+        }
+        var request = URLRequest(url: URL(string: url)!)
+        request.httpMethod = method == 1 ? "GET" : "POST"
+        if method == 2 {
+            request.httpBody = postData.data(using: .utf8)
+        }
+        let session = URLSession.shared
+        session.dataTask(with: request) {data, response, err in
+            let pluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: String(data: data!, encoding: String.Encoding.utf8))
+            pluginResult?.setKeepCallbackAs(false)
+            self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
+        }.resume()
+
+        let pluginResult = CDVPluginResult(status: CDVCommandStatus_NO_RESULT)
+        pluginResult?.setKeepCallbackAs(true)
+        self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
+  }
+    
+    
+    @objc(SWModule_getBookNames:)
+    func SWModule_getBookNames(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        var retVal = [String]()
+        org_crosswire_sword_SWModule_begin(mod)
+        while (org_crosswire_sword_SWModule_popError(mod) == 0) {
+            retVal.append(getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod))[VERSEKEY_BOOKABBREV])
+            org_crosswire_sword_SWModule_setKeyText(mod, "+book")
+        }
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(SWModule_getVerseKey:)
+    func SWModule_getVerseKey(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let module = getModule(command: command)
+        if (module != 0) {
+            let retVal = getVerseKey(keyChildren: getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(module)))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+
+
+    @objc(SWModule_begin:)
+    func SWModule_begin(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            org_crosswire_sword_SWModule_begin(mod)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_begin"), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+
+    
+    @objc(SWModule_previous:)
+    func SWModule_previous(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            org_crosswire_sword_SWModule_previous(mod)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_previous"), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_next:)
+    func SWModule_next(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            org_crosswire_sword_SWModule_next(mod)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_next"), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_popError:)
+    func SWModule_popError(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let error = Int(org_crosswire_sword_SWModule_popError(mod))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: error), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_getEntryAttribute:)
+    func SWModule_getEntryAttribute(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let retVal = getStringArray(buffer: org_crosswire_sword_SWModule_getEntryAttribute(mod, command.arguments[1] as? String ?? "", command.arguments[2] as? String ?? "", command.arguments[3] as? String ?? "", (command.arguments[4] as? Bool ?? false) ? 1 : 0))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_getConfigEntry:)
+    func SWModule_getConfigEntry(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let val = org_crosswire_sword_SWModule_getConfigEntry(mod, command.arguments[1] as? String ?? "")
+            let retVal = val == nil ? nil : String(cString: val!)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_getKeyChildren:)
+    func SWModule_getKeyChildren(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let retVal = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWModule_getRenderHeader:)
+    func SWModule_getRenderHeader(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let header = String(cString: org_crosswire_sword_SWModule_getRenderHeader(mod))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: header), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
+        self.webView.inputViewController?.dismiss(animated: true, completion: {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK), callbackId: self.callbackID)
+        })
+    }
+
+    func sendVerse(module: Int, keyText: String) {
+        if MFMessageComposeViewController.canSendText() {
+            let controller = MFMessageComposeViewController()
+            let verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(module))
+            let modName = String(cString: org_crosswire_sword_SWModule_getName(module))
+            let verseText = String(cString: org_crosswire_sword_SWModule_stripText(module))
+            
+            
+            controller.body = verseText + " --" + verseKey[VERSEKEY_SHORTTEXT] + " (" + modName + ")"
+            controller.recipients = [""]
+            controller.messageComposeDelegate = self
+            self.webView.inputViewController?.present(controller, animated: true, completion: nil)
+        }
+    }
+    @objc(SWModule_sendText:)
+    func SWModule_sendText(command: CDVInvokedUrlCommand) {
+        initMgr()
+// Switch this to use cordova social plugin
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            mySWORDPlugin = self
+            callbackID = command.callbackId
+            let keyText = String(cString: org_crosswire_sword_SWModule_getKeyText(mod))
+            sendVerse(module: mod, keyText: keyText)
+            let result = CDVPluginResult(status: CDVCommandStatus_NO_RESULT)
+            result?.setKeepCallbackAs(true)
+            self.commandDelegate!.send(result, callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+
+    @objc(SWModule_getRenderText:)
+    func SWModule_getRenderText(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let retVal = String(cString: org_crosswire_sword_SWModule_renderText(mod))
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(SWMgr_startBibleSync:)
+    func SWMgr_startBibleSync(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let appName = command.arguments[0] as? String ?? ""
+        let userName = command.arguments[1] as? String ?? ""
+        let passphrase = command.arguments[2] as? String ?? ""
+            bibleSyncCallbackID = command.callbackId
+            DispatchQueue.global().async {
+                mySWORDPlugin = self
+                org_crosswire_sword_SWMgr_startBibleSync(self.mgr, appName, userName, passphrase, { (cmd : Int8, str1: Optional<UnsafePointer<Int8>>, str2: Optional<UnsafePointer<Int8>>) in
+                    let response1 = String(cString: str1!)
+                    let response2 = String(cString: str2!)
+                    if (mySWORDPlugin != nil && mySWORDPlugin!.bibleSyncCallbackID != "") {
+			if (cmd == CChar("N")) {
+				var retVal = [String:Any]()
+				retVal["cmd"]     = "nav";
+				retVal["osisRef"] = response1;
+				let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal)
+				result?.setKeepCallbackAs(true)
+				mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.bibleSyncCallbackID)
+			}
+			else if (cmd == CChar("C")	) {
+				var retVal = [String:Any]()
+				retVal["cmd"]     = "chat";
+				retVal["user"]    = response1;
+				retVal["message"] = response2;
+				let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal)
+				result?.setKeepCallbackAs(true)
+				mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.bibleSyncCallbackID)
+			}
+                    }
+                });
+                
+                self.bibleSyncCallbackID = ""
+                
+                let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_startBibleSync finished")
+                result?.setKeepCallbackAs(false)
+                self.commandDelegate!.send(result, callbackId: command.callbackId)
+            }
+            
+            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_startBibleSync")
+            result?.setKeepCallbackAs(true)
+            self.commandDelegate!.send(result, callbackId: command.callbackId)
+    }
+    
+    @objc(SWMgr_stopBibleSync:)
+    func SWMgr_stopBibleSync(command: CDVInvokedUrlCommand) {
+        initMgr()
+        org_crosswire_sword_SWMgr_stopBibleSync(mgr)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_stopBibleSync"), callbackId: command.callbackId)
+    }
+    
+    @objc(SWMgr_sendBibleSyncMessage:)
+    func SWMgr_sendBibleSyncMessage(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let osisRef = command.arguments[1] as? String ?? ""
+        org_crosswire_sword_SWMgr_sendBibleSyncMessage(mgr, osisRef)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_sendBibleSyncMessage"), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(SWModule_getRenderChapter:)
+    func SWModule_getRenderChapter(command: CDVInvokedUrlCommand) {
+        initMgr()
+        
+//        DispatchQueue.global().async {
+            self.initMgr()
+            let masterMod = self.getModule(command: command, nameArgNumber: 0)
+            let mod = self.getModule(command: command, nameArgNumber: 1)
+            if (masterMod != 0 && mod != 0) {
+                let r = self.renderChapter(masterMod: masterMod, mod: mod)
+                self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: r), callbackId: command.callbackId)
+            }
+//        }
+/*
+        var pluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_getRenderChapter")
+        pluginResult?.setKeepCallbackAs(true)
+        self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
+*/
+    }
+
+    var VERSEKEY_BOOK = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOK);
+    var VERSEKEY_CHAPTER = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPTER);
+    var VERSEKEY_VERSE = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSE);
+    var VERSEKEY_TESTAMENT = Int(org_crosswire_sword_SWModule_VERSEKEY_TESTAMENT);
+    var VERSEKEY_OSISREF = Int(org_crosswire_sword_SWModule_VERSEKEY_OSISREF);
+    var VERSEKEY_CHAPMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPMAX);
+    var VERSEKEY_VERSEMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSEMAX);
+    var VERSEKEY_BOOKNAME = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKNAME);
+    var VERSEKEY_SHORTTEXT = Int(org_crosswire_sword_SWModule_VERSEKEY_SHORTTEXT);
+    var VERSEKEY_BOOKABBREV = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKABBREV);
+
+    func renderChapter(masterMod: Int, mod: Int) -> [[String: Any]] {
+        let saveMasterKey = String(cString: org_crosswire_sword_SWModule_getKeyText(masterMod))
+        let saveKey = String(cString: org_crosswire_sword_SWModule_getKeyText(mod))
+        var r = [[String: Any]]()
+        var currentKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
+        let book = currentKey[VERSEKEY_BOOKABBREV]
+        let chapter = currentKey[VERSEKEY_CHAPTER]
+        org_crosswire_sword_SWModule_setKeyText(masterMod, book + "." + chapter + ".1")
+        var verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
+        while (org_crosswire_sword_SWModule_popError(masterMod) == 0
+            && currentKey[VERSEKEY_BOOK] == verseKey[VERSEKEY_BOOK]
+            && currentKey[VERSEKEY_CHAPTER] == verseKey[VERSEKEY_CHAPTER]
+            ) {
+                org_crosswire_sword_SWModule_setKeyText(mod, verseKey[VERSEKEY_OSISREF])
+                let error = org_crosswire_sword_SWModule_popError(mod)
+                var v = [String:Any]()
+                if (error == 0) {
+                    v["verse"] = getVerseKey(keyChildren: getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod)))
+                    var preVerse = ""
+                    for i in getStringArray(buffer: org_crosswire_sword_SWModule_getEntryAttribute(mod, "Heading", "Preverse", "", 1)) {
+                        preVerse += i
+                    }
+                    v["preVerse"] = preVerse
+                    v["text"] = String(cString: org_crosswire_sword_SWModule_renderText(mod))
+                }
+                else {
+                    
+                }
+                r.append(v)
+                org_crosswire_sword_SWModule_next(masterMod)
+                verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
+        }
+        org_crosswire_sword_SWModule_setKeyText(masterMod, saveMasterKey)
+        org_crosswire_sword_SWModule_setKeyText(mod, saveKey)
+        
+        return r
+        
+    }
+    
+    func getVerseKey(keyChildren:[String]) -> [String:Any] {
+        var retVal = [String:Any]()
+        if (keyChildren.count > 9) {
+            retVal["testament"]   = Int(keyChildren[VERSEKEY_TESTAMENT]);
+            retVal["book"]        = Int(keyChildren[VERSEKEY_BOOK]);
+            retVal["chapter"]     = Int(keyChildren[VERSEKEY_CHAPTER]);
+            retVal["verse"]       = Int(keyChildren[VERSEKEY_VERSE]);
+            retVal["chapterMax"]  = Int(keyChildren[VERSEKEY_CHAPMAX]);
+            retVal["verseMax"]    = Int(keyChildren[VERSEKEY_VERSEMAX]);
+            retVal["bookName"]    = keyChildren[VERSEKEY_BOOKNAME];
+            retVal["osisRef"]     = keyChildren[VERSEKEY_OSISREF];
+            retVal["shortText"]   = keyChildren[VERSEKEY_SHORTTEXT];
+            retVal["bookAbbrev"]  = keyChildren[VERSEKEY_BOOKABBREV];
+        }
+        return retVal;
+    }
+
+    
+    @objc(SWModule_search:)
+    func SWModule_search(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let mod = getModule(command: command)
+        if (mod != 0) {
+            let expression = command.arguments[1] as? String ?? ""
+            let searchType = command.arguments[2] as? Int32 ?? 0
+            let flags = command.arguments[3] as? Int ?? 0
+            let scope = command.arguments.count < 5 ? nil : command.arguments[4] as? String ?? nil
+            callbackID = command.callbackId
+            DispatchQueue.global().async {
+                mySWORDPlugin = self
+                let buffer = org_crosswire_sword_SWModule_search(mod, expression, searchType, flags, scope, { (percent: Int32) in
+                    let response = [
+                        "status": "update",
+                        "percent": percent
+                        ] as [String : Any]
+                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
+                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
+                        result?.setKeepCallbackAs(true)
+                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
+                    }
+                });
+                
+                self.callbackID = ""
+                var response = [
+                    "status": "complete",
+                    "percent": 100
+                ] as [String : Any]
+
+                //UnsafeMutablePointer<UnsafePointer<Int8>?>!) -> [String] {
+                var b = buffer
+                var count = 0
+                while let i = b?.pointee {
+                    if i.key == nil {
+                        break
+                    }
+                    count = count + 1
+                    b = b?.advanced(by: 1)
+                }
+                let searchResults = UnsafeBufferPointer<org_crosswire_sword_SearchHit>(start: buffer, count: count);
+                var results = [[String:Any]]()
+                for i in searchResults {
+                    let sr = [
+                        "key": String(cString: i.key),
+                        "score": Int(i.score)
+                    ] as [String : Any]
+                    results.append(sr)
+                }
+                response["results"] = results
+                
+                let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
+                result?.setKeepCallbackAs(false)
+                self.commandDelegate!.send(result, callbackId: command.callbackId)
+            }
+            
+            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_search")
+            result?.setKeepCallbackAs(true)
+            self.commandDelegate!.send(result, callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    func getModule(command: CDVInvokedUrlCommand, nameArgNumber: Int = 0) -> Int {
+        initMgr()
+        let modName = command.arguments[nameArgNumber] as? String ?? ""
+        let module = org_crosswire_sword_SWMgr_getModuleByName(mgr, modName)
+        if (module == 0) {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: "couldn't find module \(modName)"), callbackId: command.callbackId)
+        }
+        return module
+    }
+    
+    
+    @objc(SWModule_getKeyText:)
+    func SWModule_getKeyText(command: CDVInvokedUrlCommand) {
+        let module = getModule(command: command)
+        if (module != 0) {
+            let keyText = org_crosswire_sword_SWModule_getKeyText(module)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: keyText == nil ? "" : String(cString: keyText!)), callbackId: command.callbackId)
+        }
+    }
+    
+    
+
+    @objc(SWModule_setKeyText:)
+    func SWModule_setKeyText(command: CDVInvokedUrlCommand) {
+        let module = getModule(command: command)
+        let keyText = command.arguments[1] as? String ?? ""
+        if (module != 0) {
+            org_crosswire_sword_SWModule_setKeyText(module, keyText)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_setKeyText"), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(InstallMgr_uninstallModule:)
+    func InstallMgr_uninstallModule(command: CDVInvokedUrlCommand) {
+        initInstall()
+        initMgr()
+        let retVal = org_crosswire_sword_InstallMgr_uninstallModule(installMgr, mgr, command.arguments[0] as? String ?? "")
+        if (retVal == 0) {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
+        }
+        else {
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: retVal), callbackId: command.callbackId)
+        }
+    }
+    
+    var callbackID:String = ""
+    var bibleSyncCallbackID:String = ""
+    @objc(InstallMgr_remoteInstallModule:)
+    func InstallMgr_remoteInstallModule(command: CDVInvokedUrlCommand) {
+        initInstall()
+        initMgr()
+        let repo = command.arguments[0] as? String ?? ""
+        let modName = command.arguments[1] as? String ?? ""
+        callbackID = command.callbackId
+        DispatchQueue.global().async {
+            mySWORDPlugin = self
+            org_crosswire_sword_InstallMgr_remoteInstallModule(self.installMgr, self.mgr, repo, modName)
+            
+            self.reinitMgr()
+            self.callbackID = ""
+            let response = [
+                "status": "complete",
+                "totalBytes": 0,
+                "completedBytes": 0,
+                "message": "Complete"
+                ] as [String : Any]
+            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
+            result?.setKeepCallbackAs(false)
+            self.commandDelegate!.send(result, callbackId: command.callbackId)
+        }
+
+        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_remoteInstallModule")
+        result?.setKeepCallbackAs(true)
+        self.commandDelegate!.send(result, callbackId: command.callbackId)
+    }
+
+    
+    @objc(InstallMgr_getRemoteModInfoList:)
+    func InstallMgr_getRemoteModInfoList(command: CDVInvokedUrlCommand) {
+        initInstall()
+        initMgr()
+        let buffer = org_crosswire_sword_InstallMgr_getRemoteModInfoList(installMgr, mgr, command.arguments[0] as? String ?? "")
+        var count = 0
+        var b = buffer
+        while let i = b?.pointee {
+            if (i.name == nil) {
+                break
+            }
+            count = count + 1
+            b = b?.advanced(by: 1)
+        }
+        let modInfoList = Array(UnsafeBufferPointer<org_crosswire_sword_ModInfo>(start: buffer, count: count));
+        var mods = [[AnyHashable : Any]]()
+        for i in modInfoList {
+            let modInfo = [
+                "name": String(cString: i.name),
+                "description": String(cString: i.description),
+                "category": String(cString: i.category),
+                "language": String(cString: i.language),
+                "delta": String(cString: i.delta),
+                "cipherKey": i.cipherKey == nil ? nil : String(cString: i.cipherKey),
+                "version": String(cString: i.version),
+                "features": getStringArray(buffer: i.features)
+                ] as [AnyHashable : Any]
+            mods.append(modInfo)
+        }
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: mods), callbackId: command.callbackId)
+    }
+    
+    
+    @objc(InstallMgr_refreshRemoteSource:)
+    func InstallMgr_refreshRemoteSource(command: CDVInvokedUrlCommand) {
+        initInstall()
+        DispatchQueue.global().async {
+            mySWORDPlugin = self
+            self.callbackID = ""
+            org_crosswire_sword_InstallMgr_refreshRemoteSource(self.installMgr, command.arguments[0] as? String ?? "")
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_refreshRemoteSource"), callbackId: command.callbackId)
+        }
+    }
+
+    
+    func getStringArray(buffer: UnsafeMutablePointer<UnsafePointer<Int8>?>!) -> [String] {
+        var sources = [String]()
+        var b = buffer
+        while let i = b?.pointee {
+            sources.append(String(cString: i))
+            b = b?.advanced(by: 1)
+        }
+        return sources
+    }
+    
+    
+    @objc(InstallMgr_getRemoteSources:)
+    func InstallMgr_getRemoteSources(command: CDVInvokedUrlCommand) {
+        initInstall()
+        let sources = getStringArray(buffer: org_crosswire_sword_InstallMgr_getRemoteSources(installMgr))
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: sources), callbackId: command.callbackId)
+    }
+
+    
+    @objc(InstallMgr_syncConfig:)
+        func InstallMgr_syncConfig(command: CDVInvokedUrlCommand) {
+
+        initInstall()
+        DispatchQueue.global().async {
+            self.callbackID = ""
+            mySWORDPlugin = self
+            org_crosswire_sword_InstallMgr_syncConfig(self.installMgr)
+            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_syncConfig"), callbackId: command.callbackId)
+        }
+    }
+    
+    
+    @objc(InstallMgr_setUserDisclaimerConfirmed:)
+    func InstallMgr_setUserDisclaimerConfirmed(command: CDVInvokedUrlCommand) {
+        initInstall()
+        org_crosswire_sword_InstallMgr_setUserDisclaimerConfirmed(installMgr)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_setUserDisclaimerConfirmed"), callbackId: command.callbackId)
+    }
+    
+
+    @objc(SWMgr_setJavascript:)
+    func SWMgr_setJavascript(command: CDVInvokedUrlCommand) {
+        initMgr()
+        org_crosswire_sword_SWMgr_setJavascript(mgr, command.arguments[0] as? Bool ?? true ? 1 : 0)
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_setJavascript"), callbackId: command.callbackId)
+    }
+    
+    @objc(SWMgr_getModInfoList:)
+    func SWMgr_getModInfoList(command: CDVInvokedUrlCommand) {
+        initMgr()
+        let buffer = org_crosswire_sword_SWMgr_getModInfoList(mgr)
+        var b = buffer
+        var count = 0
+        while let i = b?.pointee {
+            if i.name == nil {
+                break
+            }
+            b = b?.advanced(by: 1)
+            count = count + 1
+        }
+        let modInfoList = Array(UnsafeBufferPointer<org_crosswire_sword_ModInfo>(start: buffer, count: count));
+        
+        var mods = [[AnyHashable : Any]]()
+        for i in modInfoList {
+            var modInfo = [
+                "name": String(cString: i.name),
+                "description": String(cString: i.description),
+                "category": String(cString: i.category),
+                "language": String(cString: i.language),
+                "delta": i.delta == nil ? "" : String(cString: i.delta),
+                "version": i.version == nil ? "" : String(cString: i.version),
+                "features": getStringArray(buffer: i.features)
+            ] as [AnyHashable : Any]
+
+            if (i.cipherKey != nil) {
+                modInfo["cipherKey"] = String(cString: i.cipherKey)
+            }
+            mods.append(modInfo)
+
+        }
+        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: mods), callbackId: command.callbackId)
+    }
+/*
+SWMgr_startBibleSync
+SWMgr_stopBibleSync		
+SWMgr_sendBibleSyncMessage		
+*/
+}

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/tizen/DeviceProxy.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/tizen/DeviceProxy.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/tizen/DeviceProxy.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/tizen/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,39 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+var tizen = require('cordova/platform');
+var cordova = require('cordova');
+
+module.exports = {
+    getDeviceInfo: function(success, error) {
+        setTimeout(function () {
+            success({
+                cordova: tizen.cordovaVersion,
+                platform: 'tizen',
+                model: null,
+                version: null,
+                uuid: null
+            });
+        }, 0);
+    }
+};
+
+require("cordova/tizen/commandProxy").add("Device", module.exports);

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.cpp (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.cpp)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.cpp	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.cpp	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,64 @@
+/*
+ *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
+ *
+ *  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.
+ */
+
+#include <QDeviceInfo>
+#include <QtSystemInfo>
+
+#include"device.h"
+
+#define CORDOVA "3.0.0"
+
+Device::Device(Cordova *cordova) : CPlugin(cordova) {
+}
+
+static QString getOSName() {
+#ifdef Q_OS_SYMBIAN
+    QString platform = "Symbian";
+#endif
+#ifdef Q_OS_WIN
+    QString platform = "Windows";
+#endif
+#ifdef Q_OS_WINCE
+    QString platform = "Windows CE";
+#endif
+#ifdef Q_OS_LINUX
+    QString platform = "Linux";
+#endif
+    return platform;
+}
+
+void Device::getInfo(int scId, int ecId) {
+    Q_UNUSED(ecId)
+
+    QDeviceInfo systemDeviceInfo;
+    QDeviceInfo systemInfo;
+
+    QString platform = getOSName();
+
+    QString uuid = systemDeviceInfo.uniqueDeviceID();
+    if (uuid.isEmpty()) {
+        QString deviceDescription = systemInfo.imei(0) + ";" + systemInfo.manufacturer() + ";" + systemInfo.model() + ";" + systemInfo.productName() + ";" + platform;
+        QString user = qgetenv("USER");
+        if (user.isEmpty()) {
+            user = qgetenv("USERNAME");
+            if (user.isEmpty())
+                user = QDir::homePath();
+        }
+        uuid = QString(QCryptographicHash::hash((deviceDescription + ";" + user).toUtf8(), QCryptographicHash::Md5).toHex());
+    }
+
+    this->cb(scId, systemDeviceInfo.model(), CORDOVA, platform, uuid, systemInfo.version(QDeviceInfo::Os));
+}

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.h (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.h)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.h	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,47 @@
+/*
+ *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
+ *
+ *  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.
+ */
+
+#ifndef DEVICE_H_FDSAFAS
+#define DEVICE_H_FDSAFAS
+
+#include <QtCore>
+
+#include <cplugin.h>
+
+class Device: public CPlugin {
+    Q_OBJECT
+public:
+    explicit Device(Cordova *cordova);
+
+    virtual const QString fullName() override {
+        return Device::fullID();
+    }
+
+    virtual const QString shortName() override {
+        return "Device";
+    }
+
+    static const QString fullID() {
+        return "com.cordova.Device";
+    }
+
+signals:
+
+public slots:
+    void getInfo(int scId, int ecId);
+};
+
+#endif

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ubuntu/device.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,34 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+var cordova = require('cordova');
+var exec = require('cordova/exec');
+
+module.exports = {
+    getInfo:function(win,fail,args) {
+        Cordova.exec(function (model, cordova, platform, uuid, version) {
+            win({name: name, model: model, cordova: cordova,
+                 platform: platform, uuid: uuid, version: version});
+        }, null, "com.cordova.Device", "getInfo", []);
+    }
+};
+
+require("cordova/exec/proxy").add("Device", module.exports);

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/windows8/DeviceProxy.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/windows8/DeviceProxy.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/windows8/DeviceProxy.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/windows8/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,50 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+
+var cordova = require('cordova');
+var utils = require('cordova/utils');
+
+module.exports = {
+
+    getDeviceInfo:function(win,fail,args) {
+
+        // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId
+        var deviceId;
+
+        var localSettings = Windows.Storage.ApplicationData.current.localSettings;
+
+        if (localSettings.values.deviceId) {
+            deviceId = localSettings.values.deviceId;
+        }
+        else {
+            deviceId = localSettings.values.deviceId = utils.createUUID();
+        }
+
+        setTimeout(function () {
+            win({ platform: "windows8", version: "8", uuid: deviceId, cordova: '0.0.0', model: window.clientInformation.platform });
+        }, 0);
+    }
+
+};
+
+require("cordova/windows8/commandProxy").add("Device", module.exports);
+

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/wp/Device.cs (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/wp/Device.cs)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/wp/Device.cs	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/wp/Device.cs	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,135 @@
+/*  
+	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.
+*/
+
+using System;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Ink;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+using Microsoft.Phone.Info;
+using System.IO.IsolatedStorage;
+using System.Windows.Resources;
+using System.IO;
+using System.Diagnostics;
+
+namespace WPCordovaClassLib.Cordova.Commands
+{
+    public class Device : BaseCommand
+    {
+        public void getDeviceInfo(string notused)
+        {
+
+            string res = String.Format("\"name\":\"{0}\",\"cordova\":\"{1}\",\"platform\":\"{2}\",\"uuid\":\"{3}\",\"version\":\"{4}\",\"model\":\"{5}\"",
+                                        this.name,
+                                        this.cordova,
+                                        this.platform,
+                                        this.uuid,
+                                        this.version,
+                                        this.model);
+
+
+
+            res = "{" + res + "}";
+            //Debug.WriteLine("Result::" + res);
+            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, res));
+        }
+
+        public string model
+        {
+            get
+            {
+                return DeviceStatus.DeviceName;
+                //return String.Format("{0},{1},{2}", DeviceStatus.DeviceManufacturer, DeviceStatus.DeviceHardwareVersion, DeviceStatus.DeviceFirmwareVersion); 
+            }
+        }
+
+        public string name
+        {
+            get
+            {
+                return DeviceStatus.DeviceName;
+                
+            }
+        }
+
+        public string cordova
+        {
+            get
+            {
+                // TODO: should be able to dynamically read the Cordova version from somewhere...
+                return "3.0.0";
+            }
+        }
+
+        public string platform
+        {
+            get
+            {
+                return Environment.OSVersion.Platform.ToString();
+            }
+        }
+
+        public string uuid
+        {
+            get
+            {
+                string returnVal = "";
+                object id;
+                UserExtendedProperties.TryGetValue("ANID", out id);
+
+                if (id != null)
+                {
+                    returnVal = id.ToString().Substring(2, 32);
+                }
+                else
+                {
+                    returnVal = "???unknown???";
+
+                    using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
+                    {
+                        try
+                        {
+                            IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream("DeviceID.txt", FileMode.Open, FileAccess.Read, appStorage);
+
+                            using (StreamReader reader = new StreamReader(fileStream))
+                            {
+                                returnVal = reader.ReadLine();
+                            }
+                        }
+                        catch (Exception /*ex*/)
+                        {
+
+                        }
+                    }
+                }
+
+                return returnVal;
+            }
+        }
+
+        public string version
+        {
+            get
+            {
+                return Environment.OSVersion.Version.ToString();
+            }
+        }
+
+    }
+}

Copied: trunk/bindings/cordova/cordova-plugin-crosswire-sword/www/SWORD.js (from rev 3632, trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/www/SWORD.js)
===================================================================
--- trunk/bindings/cordova/cordova-plugin-crosswire-sword/www/SWORD.js	                        (rev 0)
+++ trunk/bindings/cordova/cordova-plugin-crosswire-sword/www/SWORD.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -0,0 +1,445 @@
+var	argscheck = require('cordova/argscheck'),
+	channel   = require('cordova/channel'),
+	utils     = require('cordova/utils'),
+	exec      = require('cordova/exec'),
+	cordova   = require('cordova');
+
+channel.createSticky('onSWORDReady');
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onSWORDReady');
+
+
+function InstallMgr() {
+}
+
+InstallMgr.prototype.setUserDisclaimerConfirmed = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_setUserDisclaimerConfirmed", []
+	);
+	return retVal;
+}
+
+InstallMgr.prototype.syncConfig = function(callback, progressNotify) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_syncConfig", [progressNotify]
+	);
+	return retVal;
+}
+
+
+InstallMgr.prototype.getRemoteSources = function(callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_getRemoteSources", []
+	);
+	return retVal;
+}
+
+
+InstallMgr.prototype.refreshRemoteSource = function(sourceName, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_refreshRemoteSource", [sourceName]
+	);
+	return retVal;
+}
+
+InstallMgr.prototype.getRemoteModInfoList = function(sourceName, callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_getRemoteModInfoList", [sourceName]
+	);
+	return retVal;
+}
+
+// callback({ status : preStatus|update|complete, totalBytes : n, completedBytes : n, message : displayable });
+InstallMgr.prototype.remoteInstallModule = function(sourceName, modName, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_remoteInstallModule", [sourceName, modName]
+	);
+	return retVal;
+}
+
+InstallMgr.prototype.uninstallModule = function(modName, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "InstallMgr_uninstallModule", [modName]
+	);
+	return retVal;
+}
+
+function SWModule(modInfo) {
+	this.name           = modInfo.name;
+	this.description    = modInfo.description;
+	this.category       = modInfo.category;
+	this.direction      = modInfo.direction;
+	this.language       = modInfo.language;
+	this.font           = modInfo.font;
+	this.shortCopyright = modInfo.shortCopyright;
+	this.shortPromo     = modInfo.shortPromo;
+}
+
+SWModule.prototype.SEARCHTYPE_REGEX     =  1;
+SWModule.prototype.SEARCHTYPE_PHRASE    = -1;
+SWModule.prototype.SEARCHTYPE_MULTIWORD = -2;
+SWModule.prototype.SEARCHTYPE_ENTRYATTR = -3;
+SWModule.prototype.SEARCHTYPE_LUCENE    = -4;
+
+SWModule.prototype.SEARCHOPTION_ICASE   = 2;
+
+
+SWModule.prototype.setKeyText = function(keyText, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_setKeyText", [this.name, keyText]
+	);
+	return retVal;
+}
+
+SWModule.prototype.search = function(expression, searchType, flags, scope, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_search", [this.name, expression, searchType, flags, scope]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getKeyText = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getKeyText", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getRenderText = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getRenderText", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.shareVerse = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_sendText", [this.name]
+	);
+	return retVal;
+}
+
+/*
+ * masterMod - SWModule to use for traversing chapter; null if self
+ * 	useful for parallel display with alternate v11ns
+ *
+ * returns [ { verse : verseKey,  preVerse : 'text', text : 'text' }, ... }
+ */
+SWModule.prototype.getRenderChapter = function(masterMod, callback) {
+	var retVal = null;
+	if (!masterMod) masterMod = this;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getRenderChapter", [masterMod.name, this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getRenderHeader = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getRenderHeader", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getKeyChildren = function(callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getKeyChildren", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getVerseKey = function(callback) {
+	var retVal = {};
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getVerseKey", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getConfigEntry = function(key, callback) {
+	var retVal = '';
+	exec(callback?callback:function(m) { if (m) retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getConfigEntry", [this.name, key]
+	);
+	return retVal;
+}
+
+
+SWModule.prototype.popError = function(callback) {
+	var retVal = 0;
+	exec(callback?callback:function(m) { retVal = m; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_popError", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getEntryAttribute = function(level1Key, level2Key, level3Key, isFiltered, callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getEntryAttribute", [this.name, level1Key, level2Key, level3Key, isFiltered]
+	);
+	return retVal;
+}
+
+SWModule.prototype.next = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_next", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.previous = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_previous", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.begin = function(callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_begin", [this.name]
+	);
+	return retVal;
+}
+
+SWModule.prototype.getBookNames = function(callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWModule_getBookNames", [this.name]
+	);
+	return retVal;
+}
+
+function SWMgr() {
+}
+
+
+SWMgr.prototype.getModInfoList = function(callback) {
+	if (!this.hasOwnProperty('_lastModInfoList')) this._lastModInfoList = [];
+	exec(function(m) { if (m && m.length > 0) this._lastModInfoList = m; if (callback) callback(m); },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getModInfoList", []
+	);
+	return this._lastModInfoList;
+}
+
+SWMgr.prototype.getModuleByName = function(modName, callback) {
+	var mod = null;
+	exec(function(m) { if (m.name) mod = new SWModule(m); if (callback) callback(mod); },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getModuleByName", [modName]
+	);
+	return mod;
+}
+
+SWMgr.prototype.getExtraConfigSections = function(callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getExtraConfigSections", []
+	);
+	return retVal;
+}
+
+SWMgr.prototype.getExtraConfigKeys = function(section, callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getExtraConfigKeys", [section]
+	);
+	return retVal;
+}
+
+SWMgr.prototype.getExtraConfigValue = function(section, key, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getExtraConfigValue", [section, key]
+	);
+	return retVal;
+}
+
+SWMgr.prototype.setExtraConfigValue = function(section, key, value, callback) {
+	exec(callback?callback:function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_setExtraConfigValue", [section, key, value]
+	);
+}
+
+SWMgr.prototype.addExtraConfig = function(confBlob, callback) {
+	var retVal = null;
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_addExtraConfig", [confBlob]
+	);
+	return retVal;
+}
+
+SWMgr.prototype.startBibleSync = function(appName, userName, passphrase, callback) {
+	exec(callback,
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_startBibleSync", [appName, userName, passphrase]
+	);
+}
+
+SWMgr.prototype.stopBibleSync = function() {
+	exec(function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_stopBibleSync", []
+	);
+}
+
+SWMgr.prototype.sendBibleSyncMessage = function(osisRef, callback) {
+	exec(callback?callback:function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_sendBibleSyncMessage", [osisRef]
+	);
+}
+
+SWMgr.prototype.setJavascript = function(val, callback) {
+	exec(callback?callback:function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_setJavascript", [val]
+	);
+}
+
+SWMgr.prototype.getAvailableLocales = function(callback) {
+	var retVal = [];
+	exec(callback?callback:function(r) { retVal = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_getAvailableLocales", []
+	);
+	return retVal;
+}
+
+SWMgr.prototype.setDefaultLocale = function(val, callback) {
+	exec(callback?callback:function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_setDefaultLocale", [val]
+	);
+}
+
+SWMgr.prototype.translate = function(text, locale, callback) {
+	// support overloaded (text, callback)
+	if (!callback && locale) { callback = locale; locale = null; }
+	exec(callback?callback:function() {},
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "SWMgr_translate", [text, locale]
+	);
+}
+
+
+function HTTPUtils() {}
+
+HTTPUtils.prototype.METHOD_GET  =  0;
+HTTPUtils.prototype.METHOD_POST =  1;
+
+HTTPUtils.prototype.makeRequest = function(url, postData, callback, method) {
+	var result = null;
+	if (!method) method = this.METHOD_POST;
+	exec(callback?callback:function(r) { if (r && r.length > 0) result = r; },
+		function(err) { utils.alert('[ERROR] problem: ' + err); },
+		"SWORD", "HTTPUtils_makeRequest", [url, postData, method]
+	);
+	return result;
+}
+
+
+
+/*
+	public native String      getPrefixPath();
+	public native String      getConfigPath();
+	public native void        setGlobalOption(String option, String value);
+	public native String      getGlobalOption(String option);
+	public native String      getGlobalOptionTip(String option);
+	public native String      filterText(String filterName, String text);
+	public native String[]    getGlobalOptions();
+	public native String[]    getGlobalOptionValues(String option);
+	public native void        setCipherKey(String modName, String key);
+	public native void        setJavascript(boolean val);
+*/
+
+
+/**
+ * This is the SWORD namespace and access to singleton SWMgr, InstallMgr, and HTTPUtils.
+ * @constructor
+ */
+function SWORD() {
+
+	var me = this;
+
+	this.available = false;
+	this.version = null;
+
+	this.installMgr = new InstallMgr();
+	this.mgr        = new SWMgr();
+	this.httpUtils  = new HTTPUtils();
+
+	channel.onCordovaReady.subscribe(function() {
+		me.init(function(info) {
+			me.available = true;
+			me.version = info.version;
+			channel.onSWORDReady.fire();
+		},function(e) {
+			me.available = false;
+			utils.alert("[ERROR] Error initializing SWORD: " + e);
+		});
+	});
+}
+
+
+SWORD.prototype.CATEGORY_BIBLES       = "Biblical Texts";
+SWORD.prototype.CATEGORY_COMMENTARIES = "Commentaries";
+SWORD.prototype.CATEGORY_LEXDICTS     = "Lexicons / Dictionaries";
+SWORD.prototype.CATEGORY_GENBOOKS     = "Generic Books";
+SWORD.prototype.CATEGORY_DAILYDEVOS   = "Daily Devotional";
+
+
+SWORD.prototype.init = function(successCallback, errorCallback) {
+	exec(successCallback, errorCallback, "SWORD", "initSWORD", []);
+};
+
+
+module.exports = new SWORD();
+
+

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/LICENSE
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/LICENSE	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/LICENSE	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   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.
\ No newline at end of file

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/README.md
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/README.md	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/README.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,22 +0,0 @@
-<!---
- license: 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.
--->
-
-# org.apache.cordova.device
-
-Plugin documentation: [doc/index.md](doc/index.md)

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/RELEASENOTES.md
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/RELEASENOTES.md	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/RELEASENOTES.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,57 +0,0 @@
-<!--
-#
-# 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.
-#
--->
-# Release Notes
-
-### 0.2.1 (Sept 5, 2013)
-* removed extraneous print statement
-* [CB-4432] copyright notice change
-
-### 0.2.3 (Sept 25, 2013)
-* CB-4889 bumping&resetting version
-* [windows8] commandProxy has moved
-* [BlackBerry10] removed uneeded permission tags in plugin.xml
-* CB-4889 renaming org.apache.cordova.core.device to org.apache.cordova.device
-* Rename CHANGELOG.md -> RELEASENOTES.md
-* updated to use commandProxy for ffos
-* add firefoxos support
-* [CB-4752] Incremented plugin version on dev branch. 
-
-### 0.2.4 (Oct 28, 2013)
-* CB-5128: added repo + issue tag in plugin.xml for device plugin
-* CB-5085 device.cordova returning wrong value
-* [CB-4915] Incremented plugin version on dev branch.
-
-### 0.2.5 (Dec 4, 2013)
-* CB-5316 Spell Cordova as a brand unless it's a command or script
-* [ubuntu] use cordova/exec/proxy
-* add ubuntu platform
-* Modify Device.platform logic to use amazon-fireos as the platform for Amazon Devices
-* 1. Added amazon-fireos platform. 2. Change to use cordova-amazon-fireos as the platform if user agent contains 'cordova-amazon-fireos'
-
-### 0.2.6 (Jan 02, 2014)
-* CB-5658 Add doc/index.md for Device plugin
-* CB-5504 Moving Telephony Logic out of Device
-
-### 0.2.7 (Jan 07, 2014)
-* CB-5737 Fix exception on close caused by left over telephony code from CB-5504
-
-### 0.2.8 (Feb 05, 2014)
-* Tizen support added

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/doc/index.md
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/doc/index.md	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/doc/index.md	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,213 +0,0 @@
-<!---
-    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.
--->
-
-# org.apache.cordova.device
-
-This plugin defines a global `device` object, which describes the device's hardware and software.
-Although the object is in the global scope, it is not available until after the `deviceready` event.
-
-    document.addEventListener("deviceready", onDeviceReady, false);
-    function onDeviceReady() {
-        console.log(device.cordova);
-    }
-
-## Installation
-
-    cordova plugin add org.apache.cordova.device
-
-## Properties
-
-- device.cordova
-- device.model
-- device.name
-- device.platform
-- device.uuid
-- device.version
-
-## device.cordova
-
-Get the version of Cordova running on the device.
-
-### Supported Platforms
-
-- Amazon Fire OS
-- Android
-- BlackBerry 10
-- Firefox OS
-- iOS
-- Tizen
-- Windows Phone 7 and 8
-- Windows 8
-
-## device.model
-
-The `device.model` returns the name of the device's model or
-product. The value is set by the device manufacturer and may be
-different across versions of the same product.
-
-### Supported Platforms
-
-- Android
-- BlackBerry 10
-- iOS
-- Tizen
-- Windows Phone 7 and 8
-- Windows 8
-
-### Quick Example
-
-    // Android:    Nexus One       returns "Passion" (Nexus One code name)
-    //             Motorola Droid  returns "voles"
-    // BlackBerry: Torch 9800      returns "9800"
-    // iOS:     for the iPad Mini, returns iPad2,5; iPhone 5 is iPhone 5,1. See http://theiphonewiki.com/wiki/index.php?title=Models
-    //
-    var model = device.model;
-
-### Android Quirks
-
-- Gets the [product name](http://developer.android.com/reference/android/os/Build.html#PRODUCT) instead of the [model name](http://developer.android.com/reference/android/os/Build.html#MODEL), which is often the production code name. For example, the Nexus One returns `Passion`, and Motorola Droid returns `voles`.
-
-### Tizen Quirks
-
-- Returns the device model assigned by the vendor, for example, `TIZEN`
-
-### Windows Phone 7 and 8 Quirks
-
-- Returns the device model specified by the manufacturer. For example, the Samsung Focus returns `SGH-i917`.
-
-## device.name
-
-__WARNING__: `device.name` is deprecated as of version 2.3.0. Use `device.model` instead.
-
-## device.platform
-
-Get the device's operating system name.
-
-    var string = device.platform;
-
-### Supported Platforms
-
-- Android
-- BlackBerry 10
-- Firefox OS
-- iOS
-- Tizen
-- Windows Phone 7 and 8
-- Windows 8
-
-### Quick Example
-
-    // Depending on the device, a few examples are:
-    //   - "Android"
-    //   - "BlackBerry 10"
-    //   - "iOS"
-    //   - "WinCE"
-    //   - "Tizen"
-    var devicePlatform = device.platform;
-
-### Windows Phone 7 Quirks
-
-Windows Phone 7 devices report the platform as `WinCE`.
-
-### Windows Phone 8 Quirks
-
-Windows Phone 8 devices report the platform as `Win32NT`.
-
-## device.uuid
-
-Get the device's Universally Unique Identifier ([UUID](http://en.wikipedia.org/wiki/Universally_Unique_Identifier)).
-
-    var string = device.uuid;
-
-### Description
-
-The details of how a UUID is generated are determined by the device manufacturer and are specific to the device's platform or model.
-
-### Supported Platforms
-
-- Android
-- BlackBerry 10
-- iOS
-- Tizen
-- Windows Phone 7 and 8
-- Windows 8
-
-### Quick Example
-
-    // Android: Returns a random 64-bit integer (as a string, again!)
-    //          The integer is generated on the device's first boot
-    //
-    // BlackBerry: Returns the PIN number of the device
-    //             This is a nine-digit unique integer (as a string, though!)
-    //
-    // iPhone: (Paraphrased from the UIDevice Class documentation)
-    //         Returns a string of hash values created from multiple hardware identifies.
-    //         It is guaranteed to be unique for every device and can't be tied
-    //         to the user account.
-    // Windows Phone 7 : Returns a hash of device+current user,
-    // if the user is not defined, a guid is generated and will persist until the app is uninstalled
-    // Tizen: returns the device IMEI (International Mobile Equipment Identity or IMEI is a number
-    // unique to every GSM and UMTS mobile phone.
-    var deviceID = device.uuid;
-
-### iOS Quirk
-
-The `uuid` on iOS is not unique to a device, but varies for each
-application, for each installation.  It changes if you delete and
-re-install the app, and possibly also when you upgrade iOS, or even
-upgrade the app per version (apparent in iOS 5.1). The `uuid` is not
-a reliable value.
-
-### Windows Phone 7 and 8 Quirks
-
-The `uuid` for Windows Phone 7 requires the permission
-`ID_CAP_IDENTITY_DEVICE`.  Microsoft will likely deprecate this
-property soon.  If the capability is not available, the application
-generates a persistent guid that is maintained for the duration of the
-application's installation on the device.
-
-## device.version
-
-Get the operating system version.
-
-    var string = device.version;
-
-### Supported Platforms
-
-- Android 2.1+
-- BlackBerry 10
-- iOS
-- Tizen
-- Windows Phone 7 and 8
-- Windows 8
-
-### Quick Example
-
-    // Android:    Froyo OS would return "2.2"
-    //             Eclair OS would return "2.1", "2.0.1", or "2.0"
-    //             Version can also return update level "2.1-update1"
-    //
-    // BlackBerry: Torch 9800 using OS 6.0 would return "6.0.0.600"
-    //
-    // iPhone:     iOS 3.2 returns "3.2"
-    //
-    // Windows Phone 7: returns current OS version number, ex. on Mango returns 7.10.7720
-    // Tizen: returns "TIZEN_20120425_2"
-    var deviceVersion = device.version;
-

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/package.json
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/package.json	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/package.json	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,28 +0,0 @@
-{
-  "name": "SWORD",
-  "version": "0.0.1",
-  "description": "The SWORD Project Plugin",
-  "cordova": {
-    "id": "org.crosswire.sword.cordova.SWORD",
-    "platforms": [
-      "android",
-      "amazon-fireos",
-      "ios"
-    ]
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://crosswire.org/svn/sword"
-  },
-  "keywords": [
-    "cordova",
-    "sword",
-    "Bible",
-    "ecosystem:cordova",
-    "cordova-android",
-    "cordova-ios",
-    "cordova-amazon-fireos"
-  ],
-  "author": "CrossWire Bible Society",
-  "license": "GNU 2.0"
-}

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/plugin.xml
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/plugin.xml	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/plugin.xml	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
-    xmlns:rim="http://www.blackberry.com/ns/widgets"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    id="org.crosswire.sword.cordova.SWORD"
-    version="0.0.1">
-    <name>SWORD</name>
-    <description>The SWORD Project Plugin</description>
-    <license>GNU 2.0</license>
-    <keywords>cordova,sword,Bible</keywords>
-    <repo>https://crosswire.org/svn/sword</repo>
-    <issue>http://crosswire.org/tracker</issue>
-
-    <js-module src="www/SWORD.js" name="SWORD">
-        <clobbers target="SWORD" />
-    </js-module>
-
-    <!-- firefoxos
-    <platform name="firefoxos">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="firefoxos-package" value="Device" />
-            </feature>
-        </config-file>
-
-        <js-module src="src/firefoxos/DeviceProxy.js" name="DeviceProxy">
-            <runs />
-        </js-module>
-    </platform>
- -->
-    <!-- tizen
-    <platform name="tizen">
-        <js-module src="src/tizen/DeviceProxy.js" name="DeviceProxy">
-            <runs />
-        </js-module>
-    </platform>
- -->
-    <!-- android -->
-    <platform name="android">
-        <config-file target="res/xml/config.xml" parent="/*">
-            <feature name="SWORD" >
-                <param name="android-package" value="org.crosswire.sword.cordova.SWORD"/>
-            </feature>
-        </config-file>
-	<config-file target="AndroidManifest.xml" parent="/manifest">
-	    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-	</config-file>
-
-        <source-file src="src/android/SWORD.java" target-dir="src/org/crosswire/sword/cordova" />
-        <source-file src="src/android/SWMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/AndroidMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/SWModule.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/InstallMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="libs/android/arm64-v8a/libsword.so" target-dir="libs/arm64-v8a" />
-        <source-file src="libs/android/armeabi-v7a/libsword.so" target-dir="libs/armeabi-v7a" />
-        <source-file src="libs/android/x86/libsword.so" target-dir="libs/x86" />
-        <source-file src="libs/android/x86_64/libsword.so" target-dir="libs/x86_64" />
-
-<!-- no longer needed with latest ndk
-        <source-file src="libs/android/arm64-v8a/libc++_shared.so" target-dir="libs/arm64-v8a" />
-        <source-file src="libs/android/armeabi-v7a/libc++_shared.so" target-dir="libs/armeabi-v7a" />
-        <source-file src="libs/android/x86/libc++_shared.so" target-dir="libs/x86" />
-        <source-file src="libs/android/x86_64/libc++_shared.so" target-dir="libs/x86_64" />
--->
-<!--
-        <source-file src="libs/android/arm64-v8a/libstlport_shared.so" target-dir="libs/arm64-v8a" />
-        <source-file src="libs/android/armeabi-v7a/libstlport_shared.so" target-dir="libs/armeabi-v7a" />
-        <source-file src="libs/android/x86/libstlport_shared.so" target-dir="libs/x86" />
-        <source-file src="libs/android/x86_64/libstlport_shared.so" target-dir="libs/x86_64" />
--->
-<!-- I think these are old names
-        <source-file src="libs/android/armeabi/libsword.so" target-dir="libs/armeabi" />
-        <source-file src="libs/android/mips64/libsword.so" target-dir="libs/mips64" />
-        <source-file src="libs/android/mips/libsword.so" target-dir="libs/mips" />
--->
-    </platform>
-
-    <!-- amazon-fireos -->
-    <platform name="amazon-fireos">
-        <config-file target="res/xml/config.xml" parent="/*">
-            <feature name="SWORD" >
-                <param name="android-package" value="org.crosswire.sword.cordova"/>
-            </feature>
-        </config-file>
-
-        <source-file src="src/android/SWORD.java" target-dir="src/org/crosswire/sword/cordova" />
-        <source-file src="src/android/SWMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/AndroidMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/SWModule.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="src/android/InstallMgr.java" target-dir="src/org/crosswire/android/sword" />
-        <source-file src="libs/android/armeabi/libsword.so" target-dir="libs/armeabi" />
-        <source-file src="libs/android/arm64-v8a/libsword.so" target-dir="libs/arm64-v8a" />
-        <source-file src="libs/android/x86/libsword.so" target-dir="libs/x86" />
-        <source-file src="libs/android/mips64/libsword.so" target-dir="libs/mips64" />
-        <source-file src="libs/android/mips/libsword.so" target-dir="libs/mips" />
-        <source-file src="libs/android/armeabi-v7a/libsword.so" target-dir="libs/armeabi-v7a" />
-        <source-file src="libs/android/x86_64/libsword.so" target-dir="libs/x86_64" />
-    </platform>
-    
-    <!-- ubuntu
-    <platform name="ubuntu">
-        <header-file src="src/ubuntu/device.h" />
-        <source-file src="src/ubuntu/device.cpp" />
-        <js-module src="src/ubuntu/device.js" name="DeviceProxy">
-            <merges target="device" />
-        </js-module>
-    </platform>
- -->
-    <!-- ios -->
-	<platform name="ios">
-		<config-file target="config.xml" parent="/*">
-			<feature name="SWORD">
-				<param name="ios-package" value="SWORD" />
-			</feature>
-		</config-file>
-		<header-file src="src/ios/flatapi.h" />
-		<header-file src="src/ios/defs.h" />
-		<header-file src="src/ios/SWORD-Bridging-Header.h" />
-		<source-file src="src/ios/SWORD.swift" />
-		<source-file src="libs/ios/libSWORD.a" framework="true" />
-		<source-file src="libs/ios/libcurl.a" framework="true" />
-		<framework src="libstdc++.dylib" />
-		<framework src="libcurl.dylib" />
-
-		<dependency id="cordova-plugin-add-swift-support" />
-
-<!--	<source-file src="lib/ios/libSWORD.a" framework="true" /> -->
-	</platform>
-
-    <!-- blackberry10
-    <platform name="blackberry10">
-        <source-file src="src/blackberry10/index.js" target-dir="Device" />
-        <config-file target="www/config.xml" parent="/widget">
-            <feature name="Device" value="Device"/>
-        </config-file>
-        <config-file target="www/config.xml" parent="/widget/rim:permissions">
-            <rim:permit>read_device_identifying_information</rim:permit>
-        </config-file>
-    </platform>
- -->
-    <!-- wp7
-    <platform name="wp7">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="wp-package" value="Device"/>
-            </feature>
-        </config-file>
-
-        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
-            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
-        </config-file>
-
-        <source-file src="src/wp/Device.cs" />
-    </platform>
- -->
-    <!-- wp8
-    <platform name="wp8">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="wp-package" value="Device"/>
-            </feature>
-        </config-file>
-
-        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
-            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
-        </config-file>
-
-        <source-file src="src/wp/Device.cs" />
-    </platform>
- -->
-    <!-- windows8
-    <platform name="windows8">
-        <js-module src="src/windows8/DeviceProxy.js" name="DeviceProxy">
-            <merges target="" />
-        </js-module>
-    </platform>
- -->
-</plugin>

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/android/SWORD.java
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/android/SWORD.java	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/android/SWORD.java	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,712 +0,0 @@
-/*
-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.
-*/
-package org.crosswire.sword.cordova;
-
-import java.util.TimeZone;
-import java.util.Vector;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Arrays;
-
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.CallbackContext;
-import org.apache.cordova.CordovaPlugin;
-import org.apache.cordova.PluginResult;
-import org.apache.cordova.CordovaInterface;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import org.crosswire.android.sword.SWMgr;
-import org.crosswire.android.sword.AndroidMgr;
-import org.crosswire.android.sword.SWModule;
-import org.crosswire.android.sword.InstallMgr;
-
-import android.provider.Settings;
-import android.util.Log;
-import android.content.Intent;
-import android.app.Activity;
-
-public class SWORD extends CordovaPlugin {
-	public static final String TAG = "SWORD";
-	public static SWMgr mgr = null;
-	public static InstallMgr installMgr = null;
-	private CallbackContext installReporterContext = null;
-	private CallbackContext searchReporterContext = null;
-	private CallbackContext renderChapterContext = null;
-	private CallbackContext sendContext = null;
-
-	/**
-	* Constructor.
-	*/
-	public SWORD() {
-	}
-
-	/**
-	* Sets the context of the Command. This can then be used to do things like
-	* get file paths associated with the Activity.
-	*
-	* @param cordova The context of the main Activity.
-	* @param webView The CordovaWebView Cordova is running in.
-	*/
-	public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-		super.initialize(cordova, webView);
-		mgr = new AndroidMgr(cordova.getActivity().getApplication());
-		installMgr = new InstallMgr();
-		installReporterContext = null;
-		searchReporterContext = null;
-		renderChapterContext = null;
-	}
-
-	/**
-	* Executes the request and returns PluginResult.
-	*
-	* @param action            The action to execute.
-	* @param args              JSONArry of arguments for the plugin.
-	* @param callbackContext   The callback id used when calling back into JavaScript.
-	* @return                  True if the action was valid, false if not.
-	*/
-	public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
-		if (action.equals("initSWORD")) {
-			JSONObject r = new JSONObject();
-			r.put("version", mgr.version());
-			callbackContext.success(r);
-		}
-		else if (action.equals("echo")) {
-			echo(callbackContext, args.getString(0));
-		}
-		else if (action.equals("InstallMgr_setUserDisclaimerConfirmed")) {
-			installMgr.setUserDisclaimerConfirmed();
-			callbackContext.success();
-		}
-		else if (action.equals("InstallMgr_syncConfig")) {
-			cordova.getThreadPool().execute(new Runnable() {
-				@Override
-				public void run() {
-					installMgr.syncConfig();
-					installMgr.reInit();
-					callbackContext.success();
-				}
-			});
-		}
-		else if (action.equals("InstallMgr_getRemoteSources")) {
-			JSONArray r = new JSONArray();
-			String sources[] = installMgr.getRemoteSources();
-			for (String s : sources) {
-				r.put(s);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("InstallMgr_refreshRemoteSource")) {
-			final String repo = args.getString(0);
-			cordova.getThreadPool().execute(new Runnable() {
-				@Override
-				public void run() {
-					installMgr.refreshRemoteSource(repo);
-					callbackContext.success();
-				}
-			});
-		}
-		else if (action.equals("InstallMgr_getRemoteModInfoList")) {
-			JSONArray r = new JSONArray();
-			for (SWMgr.ModInfo mi : installMgr.getRemoteModInfoList(args.getString(0))) {
-				JSONObject m = new JSONObject();
-				m.put("name", mi.name);
-				m.put("description", mi.description);
-				m.put("category", mi.category);
-				m.put("language", mi.language);
-				m.put("version", mi.version);
-				m.put("delta", mi.delta);
-				m.put("cipherKey", mi.cipherKey);
-				m.put("features", new JSONArray(Arrays.asList(mi.features)));
-				r.put(m);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("InstallMgr_remoteInstallModule")) {
-			this.installReporterContext = callbackContext;
-			final String repo = args.getString(0);
-			final String modName = args.getString(1);
-			cordova.getThreadPool().execute(new Runnable() {
-			    @Override
-			    public void run() {
-
-				installMgr.remoteInstallModule(repo, modName, new InstallMgr.InstallProgressReporter() {
-					public void update(long totalBytes, long completedBytes) {
-	/*
-	// callback({ status : preStatus|update|complete, totalBytes : n, completedBytes : n, message : displayable });
-	*/
-						try {
-
-							JSONObject m = new JSONObject();
-							m.put("status", "update");
-							m.put("totalBytes", totalBytes);
-							m.put("completedBytes", completedBytes);
-							if (installReporterContext != null) {
-								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-								result.setKeepCallback(true);
-								installReporterContext.sendPluginResult(result);
-							}
-						}
-						catch (Exception e) { e.printStackTrace(); }
-					}
-					public void preStatus(long totalBytes, long completedBytes, String message) {
-						try {
-							JSONObject m = new JSONObject();
-							m.put("status", ("Complete".equals(message)) ? "complete" : "preStatus");
-							m.put("totalBytes", totalBytes);
-							m.put("completedBytes", completedBytes);
-							m.put("message", message);
-							if (installReporterContext != null) {
-								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-								result.setKeepCallback(!"Complete".equals(message));
-								installReporterContext.sendPluginResult(result);
-							}
-							if ("Complete".equals(message)) {
-								// let's be sure we see our new module
-								mgr.reInit();
-								// and clear out context
-								installReporterContext = null;
-							}
-						}
-						catch (Exception e) { e.printStackTrace(); }
-					}
-				});
-
-			    }
-			});
-
-			PluginResult result = new PluginResult(PluginResult.Status.OK);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else if (action.equals("InstallMgr_uninstallModule")) {
-			installMgr.uninstallModule(args.getString(0));
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_getExtraConfigSections")) {
-			JSONArray r = new JSONArray();
-			for (String s : mgr.getExtraConfigSections()) {
-				r.put(s);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWMgr_getExtraConfigKeys")) {
-			JSONArray r = new JSONArray();
-			for (String s : mgr.getExtraConfigKeys(args.getString(0))) {
-				r.put(s);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWMgr_getExtraConfigValue")) {
-			callbackContext.success(mgr.getExtraConfigValue(args.getString(0), args.getString(1)));
-		}
-		else if (action.equals("SWMgr_setExtraConfigValue")) {
-			mgr.setExtraConfigValue(args.getString(0), args.getString(1), args.getString(2));
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_addExtraConfig")) {
-			JSONArray r = new JSONArray();
-			for (String s : mgr.addExtraConfig(args.getString(0))) {
-				r.put(s);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWMgr_getModInfoList")) {
-			JSONArray r = new JSONArray();
-			for (SWMgr.ModInfo mi : mgr.getModInfoList()) {
-				JSONObject m = new JSONObject();
-				m.put("name", mi.name);
-				m.put("description", mi.description);
-				m.put("category", mi.category);
-				m.put("language", mi.language);
-				m.put("version", mi.version);
-				m.put("delta", mi.delta);
-				m.put("cipherKey", mi.cipherKey);
-				m.put("features", new JSONArray(Arrays.asList(mi.features)));
-				r.put(m);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWMgr_getModuleByName")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			// didn't find module is not an error
-			if (mod == null) { callbackContext.success(); return true; }
-
-			JSONObject m = new JSONObject();
-			m.put("name", mod.getName());
-			m.put("description", mod.getDescription());
-			m.put("category", mod.getCategory());
-			m.put("direction", mod.getConfigEntry("Direction"));
-			m.put("language", mod.getConfigEntry("Lang"));
-			m.put("font", mod.getConfigEntry("Font"));
-			m.put("shortCopyright", mod.getConfigEntry("ShortCopyright"));
-			m.put("shortPromo", mod.getConfigEntry("ShortPromo"));
-			m.put("cipherKey", mod.getConfigEntry("CipherKey"));
-			callbackContext.success(m);
-		}
-		else if (action.equals("SWModule_setKeyText")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			mod.setKeyText(args.getString(1));
-			callbackContext.success();
-		}
-		else if (action.equals("SWModule_getKeyText")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success(mod.getKeyText());
-		}
-		else if (action.equals("SWModule_search")) {
-			this.searchReporterContext = callbackContext;
-			final SWModule mod = mgr.getModuleByName(args.getString(0));
-			final String expression = args.getString(1);
-			final int searchType = args.getInt(2);
-			final long flags = args.getLong(3);
-			final String scope = JSONObject.NULL.equals(args.getString(4)) || "null".equals(args.getString(4)) ? null : args.getString(4);
-			cordova.getThreadPool().execute(new Runnable() {
-			    @Override
-			    public void run() {
-
-				SWModule.SearchHit[] results = mod.search(expression, searchType, flags, scope, new SWModule.SearchProgressReporter() {
-					public void progressReport(int percent) {
-						try {
-							JSONObject m = new JSONObject();
-							m.put("status", "update");
-							m.put("percent", percent);
-							if (searchReporterContext != null) {
-								PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-								result.setKeepCallback(true);
-								searchReporterContext.sendPluginResult(result);
-							}
-						}
-						catch (Exception e) { e.printStackTrace(); }
-					}
-				});
-				try {
-					JSONObject m = new JSONObject();
-					m.put("status", "complete");
-					m.put("percent", 100);
-					JSONArray r = new JSONArray();
-					for (SWModule.SearchHit s : results) {
-						JSONObject re = new JSONObject();
-						re.put("key", s.key);
-						re.put("score", s.score);
-						r.put(re);
-					}
-					m.put("results", r);
-					if (searchReporterContext != null) {
-						PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-						result.setKeepCallback(false);
-						searchReporterContext.sendPluginResult(result);
-					}
-				}
-				catch (Exception e) { e.printStackTrace(); }
-				searchReporterContext = null;
-			    }
-			});
-
-			PluginResult result = new PluginResult(PluginResult.Status.OK);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else if (action.equals("SWModule_getRenderChapter")) {
-			this.renderChapterContext = callbackContext;
-
-			final SWModule masterMod = mgr.getModuleByName(args.getString(0));
-			final SWModule mod = mgr.getModuleByName(args.getString(1));
-			if (masterMod == null) { callbackContext.error("couldn't find master module: " + args.getString(0)); return true; }
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(1)); return true; }
-
-			cordova.getThreadPool().execute(new Runnable() {
-			    @Override
-			    public void run() {
-
-				JSONArray r = new JSONArray();
-				try {
-					r = getRenderChapter(masterMod, mod);
-				} catch (JSONException e) { e.printStackTrace(); }
-				PluginResult result = new PluginResult(PluginResult.Status.OK, r);
-				result.setKeepCallback(false);
-				if (renderChapterContext != null) {
-					renderChapterContext.sendPluginResult(result);
-					renderChapterContext = null;
-				}
-			    }
-			});
-
-			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else if (action.equals("SWMgr_startBibleSync")) {
-			final CallbackContext bibleSyncListener = callbackContext;
-			final String appName = args.getString(0);
-			final String userName = args.getString(1);
-			final String passphrase = args.getString(2);
-
-			cordova.getThreadPool().execute(new Runnable() {
-			    @Override
-			    public void run() {
-				mgr.startBibleSync(appName, userName, passphrase, new SWMgr.BibleSyncListener() {
-					public void navReceived(String message) {
-						try {
-							JSONObject m = new JSONObject();
-							m.put("cmd", "nav");
-							m.put("osisRef", message);
-							PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-							result.setKeepCallback(true);
-							bibleSyncListener.sendPluginResult(result);
-						}
-						catch (Exception e) { e.printStackTrace(); }
-					}
-					public void chatReceived(String user, String message) {
-						try {
-							JSONObject m = new JSONObject();
-							m.put("cmd", "chat");
-							m.put("user", user);
-							m.put("message", message);
-							PluginResult result = new PluginResult(PluginResult.Status.OK, m);
-							result.setKeepCallback(true);
-							bibleSyncListener.sendPluginResult(result);
-						}
-						catch (Exception e) { e.printStackTrace(); }
-					}
-				});
-			    }
-			});
-
-			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else if (action.equals("SWMgr_stopBibleSync")) {
-			mgr.stopBibleSync();
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_setJavascript")) {
-			boolean val = args.getBoolean(0);
-			mgr.setJavascript(val);
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_sendBibleSyncMessage")) {
-			String osisRef = args.getString(0);
-			mgr.sendBibleSyncMessage(osisRef);
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_getAvailableLocales")) {
-			JSONArray r = new JSONArray();
-			for (String s : mgr.getAvailableLocales()) {
-				r.put(s);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWMgr_setDefaultLocale")) {
-			String val = args.getString(0);
-			mgr.setDefaultLocale(val);
-			callbackContext.success();
-		}
-		else if (action.equals("SWMgr_translate")) {
-			String text = args.getString(0);
-			String locale = args.getString(1);
-			String translated = mgr.translate(text, locale);
-			callbackContext.success(translated);
-		}
-		else if (action.equals("SWModule_getRenderText")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success(mod.getRenderText());
-		}
-		else if (action.equals("SWModule_sendText")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			this.sendContext = callbackContext;
-			sendVerse(mod, new String[] { mod.getKeyText() }, cordova, this);
-			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else if (action.equals("SWModule_getRenderHeader")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success(mod.getRenderHeader());
-		}
-		else if (action.equals("SWModule_getKeyChildren")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			JSONArray r = new JSONArray();
-			for (String k : mod.getKeyChildren()) {
-				r.put(k);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWModule_getConfigEntry")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success(mod.getConfigEntry(args.getString(1)));
-		}
-		else if (action.equals("SWModule_getEntryAttribute")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			JSONArray r = new JSONArray();
-			for (String k : mod.getEntryAttribute(args.getString(1), args.getString(2), args.getString(3), args.getBoolean(4))) {
-				r.put(k);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("SWModule_popError")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success((int)mod.error());
-		}
-		else if (action.equals("SWModule_next")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			mod.next();
-			callbackContext.success();
-		}
-		else if (action.equals("SWModule_previous")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			mod.previous();
-			callbackContext.success();
-		}
-		else if (action.equals("SWModule_begin")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			mod.begin();
-			callbackContext.success();
-		}
-		else if (action.equals("SWModule_getVerseKey")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			callbackContext.success(getVerseKey(mod.getKeyChildren()));
-		}
-		else if (action.equals("SWModule_getBookNames")) {
-			SWModule mod = mgr.getModuleByName(args.getString(0));
-			if (mod == null) { callbackContext.error("couldn't find module: " + args.getString(0)); return true; }
-			JSONArray r = new JSONArray();
-			for (String b : getBookNames(mod)) {
-				r.put(b);
-			}
-			callbackContext.success(r);
-		}
-		else if (action.equals("HTTPUtils_makeRequest")) {
-			final CallbackContext makeRequestContext = callbackContext;
-
-			final String url      = args.getString(0);
-			final String postData = args.getString(1);
-			final int method      = args.getInt(2);
-Log.d(TAG, "makeRequest(url: " + url + ", postData: " + postData + ", method: " + method);
-
-			cordova.getThreadPool().execute(new Runnable() {
-				@Override
-				public void run() {
-					String response = makeRequest(url, postData, method, null);
-					PluginResult result = new PluginResult(PluginResult.Status.OK, response);
-					result.setKeepCallback(false);
-					makeRequestContext.sendPluginResult(result);
-				}
-			});
-
-			PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
-			result.setKeepCallback(true);
-			callbackContext.sendPluginResult(result);
-		}
-		else return false;
-
-		return true;
-	}
-
-	JSONObject getVerseKey(String keyChildren[]) throws JSONException {
-		JSONObject retVal = new JSONObject();
-		if (keyChildren != null && keyChildren.length > 9) {
-			retVal.put("testament",  Integer.parseInt(keyChildren[SWModule.VERSEKEY_TESTAMENT]));
-			retVal.put("book",       Integer.parseInt(keyChildren[SWModule.VERSEKEY_BOOK]));
-			retVal.put("chapter",    Integer.parseInt(keyChildren[SWModule.VERSEKEY_CHAPTER]));
-			retVal.put("verse",      Integer.parseInt(keyChildren[SWModule.VERSEKEY_VERSE]));
-			retVal.put("chapterMax", Integer.parseInt(keyChildren[SWModule.VERSEKEY_CHAPTERMAX]));
-			retVal.put("verseMax",   Integer.parseInt(keyChildren[SWModule.VERSEKEY_VERSEMAX]));
-			retVal.put("bookName",   keyChildren[SWModule.VERSEKEY_BOOKNAME]);
-			retVal.put("osisRef",    keyChildren[SWModule.VERSEKEY_OSISREF]);
-			retVal.put("shortText",  keyChildren[SWModule.VERSEKEY_SHORTTEXT]);
-			retVal.put("bookAbbrev", keyChildren[SWModule.VERSEKEY_BOOKABBREV]);
-		}
-		return retVal;
-	}
-
-	public JSONArray getRenderChapter(SWModule masterMod, SWModule mod) throws JSONException {
-		JSONArray r = new JSONArray();
-
-		// save our current keys so we can set our mods back when we're done
-		String saveMasterKey = masterMod.getKeyText();
-		String saveKey = mod.getKeyText();
-
-		String currentKey[]   = masterMod.getKeyChildren();
-
-		// assert we have a valid location
-		if (currentKey.length <= SWModule.VERSEKEY_BOOKABBREV || currentKey.length <= SWModule.VERSEKEY_CHAPTER) return r;
-
-		masterMod.setKeyText(currentKey[SWModule.VERSEKEY_BOOKABBREV]+"."+currentKey[SWModule.VERSEKEY_CHAPTER]+".1");
-
-		String [] verseKey = masterMod.getKeyChildren();
-		while (
-				   masterMod.error() == 0
-				&& currentKey[SWModule.VERSEKEY_BOOK].equals(verseKey[SWModule.VERSEKEY_BOOK])
-				&& currentKey[SWModule.VERSEKEY_CHAPTER].equals(verseKey[SWModule.VERSEKEY_CHAPTER])) {
-
-			mod.setKeyText(verseKey[SWModule.VERSEKEY_OSISREF]);
-			char error = mod.error();
-			JSONObject v = new JSONObject();
-			if (((int)error) == 0) {
-				v.put("verse", getVerseKey(mod.getKeyChildren()));
-				String preVerse = "";
-				for (String h : mod.getEntryAttribute("Heading", "Preverse", "", true)) {
-					preVerse += h;
-				}
-				v.put("preVerse", preVerse);
-				v.put("text", mod.getRenderText());
-			}
-			else {
-/* null removes entry
-				v.put("verse", null);
-				v.put("preVerse", null);
-				v.put("text", null);
-*/
-			}
-			r.put(v);
-			masterMod.next();
-			verseKey = masterMod.getKeyChildren();
-		}
-
-		masterMod.setKeyText(saveMasterKey);
-		mod.setKeyText(saveKey);
-
-		return r;
-	}
-
-
-	public Vector<String> getBookNames(SWModule mod) {
-		Vector<String> books = new Vector<String>();
-		for (mod.begin(); mod.error() == 0; mod.setKeyText("+book")) {
-			books.add(mod.getKeyChildren()[9]);
-		}
-		return books;
-	}
-
-	//--------------------------------------------------------------------------
-	// LOCAL METHODS
-	//--------------------------------------------------------------------------
-
-	public void echo(CallbackContext callbackContext, String message) {
-		if (message != null && message.length() > 0) {
-			callbackContext.success(message);
-		}
-		else {
-			callbackContext.error("expected 1 arg");
-		}
-	}
-
-	public static final int METHOD_GET  = 0;
-	public static final int METHOD_POST = 1;
-	public static final String METHODS_TEXT[] = { "GET", "POST" };
-
-	public static String makeRequest(String url, String postData, int method, Map<String, String> headers) {
-		HttpURLConnection connection = null;
-
-		Map<String, String> defaultHeaders = new HashMap<String, String>();
-		defaultHeaders.put("Accept", "*/*");
-//		defaultHeaders.put("Content-Type", "application/xml");
-	 	defaultHeaders.put("Content-Type", "application/x-www-form-urlencoded");
-		if (method != METHOD_GET && postData != null) defaultHeaders.put("Content-Length", Integer.toString(postData.length()));
-
-		try {
-			if (headers != null) defaultHeaders.putAll(headers);
-
-			if (method == METHOD_GET && postData != null && postData.length() > 0) {
-				// some sanity checks for appending GET params to URL
-				if (url.indexOf("?") < 0) if (!postData.startsWith("?")) url += "?";
-				else if (!url.endsWith("&") && !postData.startsWith("&")) url += "&";
-
-				url += postData;
-			}
-
-			connection = (HttpURLConnection) new URL(url).openConnection();
-			connection.setRequestMethod(METHODS_TEXT[method]);
-			for (String k : defaultHeaders.keySet()) {
-				connection.setRequestProperty(k, defaultHeaders.get(k));
-			}
-			if (method == METHOD_POST) {
-				connection.setDoOutput(true);
-				if (postData != null) {
-					DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
-					dos.writeBytes(postData);
-					dos.flush();
-					dos.close();
-				}
-			}
-			int responseCode = connection.getResponseCode();
-			BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
-			StringBuilder response = new StringBuilder();
-			String line;
-			while ((line = br.readLine()) != null) {
-				response.append(line);
-			}
-			/* do something special if success code?
-			if (responseCode >= 200 && responseCode < 300) {
-			}
-			else throw new Exception("HTTP Response: " + responseCode);
-			*/
-			return response.toString();
-		}
-		catch (Exception e) { e.printStackTrace(); }
-		return null;
-	}
-	public static void sendVerse(final SWModule mod, final String verse[], final CordovaInterface cordova, final CordovaPlugin plugin) {
-		cordova.getThreadPool().execute(new Runnable() {
-			public void run() {
-				String subject = mod.getKeyChildren()[SWModule.VERSEKEY_SHORTTEXT] + " (" + mod.getName() + ")";
-				String message = mod.getStripText() + " --" +subject;
-				final Intent sendIntent = new Intent(Intent.ACTION_SEND);
-				sendIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-
-				sendIntent.setType("text/plain");
-
-				sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
-				sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, message);
-
-				cordova.startActivityForResult(plugin, Intent.createChooser(sendIntent, null), 1);
-			}
-		});
-	}
-
-	public void onActivityResult(int requestCode, int resultCode, Intent intent) {
-		switch (requestCode) {
-		case 1: 
-			sendContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, resultCode == Activity.RESULT_OK));
-		}
-		super.onActivityResult(requestCode, resultCode, intent);
-	}
-
-}

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10/index.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10/index.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/blackberry10/index.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,69 +0,0 @@
-/*
- *
- * 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 getModelName () {
-    var modelName = window.qnx.webplatform.device.modelName;
-    //Pre 10.2 (meaning Z10 or Q10)
-    if (typeof modelName === "undefined") {
-        if (window.screen.height === 720 && window.screen.width === 720) {
-            if ( window.matchMedia("(-blackberry-display-technology: -blackberry-display-oled)").matches) {
-                modelName = "Q10";
-            } else {
-                modelName = "Q5";
-            }
-        } else if ((window.screen.height === 1280 && window.screen.width === 768) ||
-                   (window.screen.height === 768 && window.screen.width === 1280)) {
-            modelName = "Z10";
-        } else {
-            modelName = window.qnx.webplatform.deviceName;
-        }
-    }
-
-    return modelName;
-}
-
-function getUUID () {
-    var uuid = "";
-    try {
-        //Must surround by try catch because this will throw if the app is missing permissions
-        uuid = window.qnx.webplatform.device.devicePin;
-    } catch (e) {
-        //DO Nothing
-    }
-    return uuid;
-}
-
-module.exports = {
-    getDeviceInfo: function (success, fail, args, env) {
-        var result = new PluginResult(args, env),
-            modelName = getModelName(),
-            uuid = getUUID(),
-            info = {
-                platform: "blackberry10",
-                version: window.qnx.webplatform.device.scmBundle,
-                model: modelName,
-                uuid: uuid,
-                cordova: "dev"
-            };
-
-        result.ok(info);
-    }
-};

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos/DeviceProxy.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos/DeviceProxy.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/firefoxos/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,39 +0,0 @@
-/*
- *
- * 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.
- *
-*/
-
-var firefoxos = require('cordova/platform');
-var cordova = require('cordova');
-
-module.exports = {
-    getDeviceInfo: function(success, error) {
-        setTimeout(function () {
-            success({
-                cordova: firefoxos.cordovaVersion,
-                platform: 'firefoxos',
-                model: null,
-                version: null,
-                uuid: null
-            });
-        }, 0);
-    }
-};
-
-require("cordova/firefoxos/commandProxy").add("Device", module.exports);

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.h
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.h	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,30 +0,0 @@
-/*
- 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.
- */
-
-#import <UIKit/UIKit.h>
-#import <Cordova/CDVPlugin.h>
-
- at interface CDVDevice : CDVPlugin
-{}
-
-+ (NSString*)cordovaVersion;
-
-- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command;
-
- at end

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.m
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.m	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/CDVDevice.m	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,90 +0,0 @@
-/*
- 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.
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-
-#import <Cordova/CDV.h>
-#import "CDVDevice.h"
-
- at implementation UIDevice (ModelVersion)
-
-- (NSString*)modelVersion
-{
-    size_t size;
-
-    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
-    char* machine = malloc(size);
-    sysctlbyname("hw.machine", machine, &size, NULL, 0);
-    NSString* platform = [NSString stringWithUTF8String:machine];
-    free(machine);
-
-    return platform;
-}
-
- at end
-
- at interface CDVDevice () {}
- at end
-
- at implementation CDVDevice
-
-- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command
-{
-    NSDictionary* deviceProperties = [self deviceProperties];
-    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:deviceProperties];
-
-    /* Settings.plist
-     * Read the optional Settings.plist file and push these user-defined settings down into the web application.
-     * This can be useful for supplying build-time configuration variables down to the app to change its behavior,
-     * such as specifying Full / Lite version, or localization (English vs German, for instance).
-     */
-    // TODO: turn this into an iOS only plugin
-    NSDictionary* temp = [CDVViewController getBundlePlist:@"Settings"];
-
-    if ([temp respondsToSelector:@selector(JSONString)]) {
-        NSLog(@"Deprecation warning: window.Setting will be removed Aug 2013. Refer to https://issues.apache.org/jira/browse/CB-2433");
-        NSString* js = [NSString stringWithFormat:@"window.Settings = %@;", [temp JSONString]];
-        [self.commandDelegate evalJs:js];
-    }
-
-    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
-}
-
-- (NSDictionary*)deviceProperties
-{
-    UIDevice* device = [UIDevice currentDevice];
-    NSMutableDictionary* devProps = [NSMutableDictionary dictionaryWithCapacity:4];
-
-    [devProps setObject:[device modelVersion] forKey:@"model"];
-    [devProps setObject:@"iOS" forKey:@"platform"];
-    [devProps setObject:[device systemVersion] forKey:@"version"];
-    [devProps setObject:[device uniqueAppInstanceIdentifier] forKey:@"uuid"];
-    [devProps setObject:[[self class] cordovaVersion] forKey:@"cordova"];
-
-    NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps];
-    return devReturn;
-}
-
-+ (NSString*)cordovaVersion
-{
-    return CDV_VERSION;
-}
-
- at end

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD-Bridging-Header.h
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD-Bridging-Header.h	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD-Bridging-Header.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1 +0,0 @@
-#import "flatapi.h"

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD.swift
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD.swift	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ios/SWORD.swift	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,878 +0,0 @@
-import MessageUI
-
-var mySWORDPlugin:SWORD? = nil
-
- at objc(SWORD) class SWORD : CDVPlugin, MFMessageComposeViewControllerDelegate {
-	var mgr = 0;
-	var installMgr = 0
-	var disclaimerConfirmed = false;
-    
-	@objc(initSWORD:)
-	func initSWORD(command: CDVInvokedUrlCommand) {
-		mgr = 0
-		installMgr = 0
-		disclaimerConfirmed = false
-		mySWORDPlugin = nil
-		VERSEKEY_BOOKABBREV = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKABBREV);
-		VERSEKEY_BOOK = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOK);
-		VERSEKEY_CHAPTER = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPTER);
-		VERSEKEY_VERSE = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSE);
-		VERSEKEY_TESTAMENT = Int(org_crosswire_sword_SWModule_VERSEKEY_TESTAMENT);
-		VERSEKEY_OSISREF = Int(org_crosswire_sword_SWModule_VERSEKEY_OSISREF);
-		VERSEKEY_CHAPMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPMAX);
-		VERSEKEY_VERSEMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSEMAX);
-		VERSEKEY_BOOKNAME = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKNAME);
-		VERSEKEY_SHORTTEXT = Int(org_crosswire_sword_SWModule_VERSEKEY_SHORTTEXT);
-
-		initMgr()
-
-		let libswordVersion = String(cString: org_crosswire_sword_SWMgr_version(mgr))
-		debugPrint("libswordVersion: " + libswordVersion)
-        let info = [
-            "version": libswordVersion
-        ] as [AnyHashable : Any]
-		self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: info), callbackId: command.callbackId)
-	}
-
-
-	func myToast(message: String) {
-		let toastController: UIAlertController = UIAlertController(title: "", message: message, preferredStyle: .alert)
-		self.viewController?.present(toastController, animated: true, completion: nil)
-		DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
-			toastController.dismiss(animated: true, completion: nil)
-		}
-	}
-
-
-	func initMgr() {
-		if (mgr == 0) {
-			let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-			mgr = org_crosswire_sword_SWMgr_newWithPath(baseDir)
-debugPrint("initMgr, mgr: " + String(describing: mgr))
-		}
-	}
-
-
-	func reinitMgr() {
-		if (mgr != 0) {
-			org_crosswire_sword_SWMgr_delete(mgr)
-		}
-		mgr = 0
-		initMgr()
-	}
-
-    
-    func reinitInstall() {
-        if (installMgr != 0) {
-            org_crosswire_sword_InstallMgr_delete(installMgr)
-        }
-        installMgr = 0
-        initInstall()
-    }
-    
-    func logError(message: String) {
-        org_crosswire_sword_SWlog_logError(message)
-    }
-    func logDebug(message: String) {
-        org_crosswire_sword_SWlog_logDebug(message)
-    }
-    func logWarning(message: String) {
-        org_crosswire_sword_SWlog_logWarning(message)
-    }
-    func logInformation(message: String) {
-        org_crosswire_sword_SWlog_logInformation(message)
-    }
-    func logTimedInformation(message: String) {
-        org_crosswire_sword_SWlog_logTimedInformation(message)
-    }
-
-    
-    func initInstall() {
-    
-        if (installMgr == 0) {
-            logDebug(message: "initInstall: installMgr is null");
-            let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-            installMgr = org_crosswire_sword_InstallMgr_new(baseDir, { (message: Optional<UnsafePointer<Int8>>, totalBytes: u_long, completedBytes: u_long) in
-                let msg = String(cString: message!)
-                if (msg == "update") {
-                    let response = [
-                        "status": "update",
-                        "totalBytes": totalBytes,
-                        "completedBytes": completedBytes
-                        ] as [String : Any]
-                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
-                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
-                        result?.setKeepCallbackAs(true)
-                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
-                    }
-                }
-                else {
-                    let response = [
-                        "status": "preStatus",
-                        "totalBytes": totalBytes,
-                        "completedBytes": completedBytes,
-                        "message": msg
-                        ] as [String : Any]
-                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
-                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
-                        result?.setKeepCallbackAs(true)
-                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
-                    }
-                }
-            })
-            if (disclaimerConfirmed) {
-                org_crosswire_sword_InstallMgr_setUserDisclaimerConfirmed(installMgr)
-            }
-            logDebug(message: "initInstall: instantiated InstallMgr with baseDir: \(baseDir)");
-        }
-    }
-
-	@objc(SWMgr_getModuleByName:)
-	func SWMgr_getModuleByName(command: CDVInvokedUrlCommand) {
-
-		initMgr();
-
-		let modName = command.arguments[0] as? String ?? ""
-        let module = org_crosswire_sword_SWMgr_getModuleByName(mgr, modName)
-
-        if (module == 0) {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK), callbackId: command.callbackId)
-            return
-        }
-        
-        let name = org_crosswire_sword_SWModule_getName(module)
-        let description = org_crosswire_sword_SWModule_getDescription(module)
-        let category = org_crosswire_sword_SWModule_getCategory(module)
-
-        var response = [
-            "name": name == nil ? "" : String(cString: name!),
-            "description": description == nil ? "" : String(cString: description!),
-            "category": category == nil ? "" : String(cString: category!)
-        ]
-        let language = org_crosswire_sword_SWModule_getConfigEntry(module, "Lang")
-        response["language"] =  language == nil ? "" : String(cString: language!)
-        let direction = org_crosswire_sword_SWModule_getConfigEntry(module, "Direction")
-        response["direction"] =  direction == nil ? "" : String(cString: direction!)
-        let font = org_crosswire_sword_SWModule_getConfigEntry(module, "Font")
-        response["font"] =  font == nil ? "" : String(cString: font!)
-        let shortCopyright = org_crosswire_sword_SWModule_getConfigEntry(module, "ShortCopyright")
-        response["shortCopyright"] =  shortCopyright == nil ? "" : String(cString: shortCopyright!)
-        let cipherKey = org_crosswire_sword_SWModule_getConfigEntry(module, "CipherKey")
-        response["cipherKey"] =  cipherKey == nil ? "" : String(cString: cipherKey!)
-        let shortPromo = org_crosswire_sword_SWModule_getConfigEntry(module, "ShortPromo")
-        response["shortPromo"] = shortPromo == nil ? "" : String(cString: shortPromo!)
-
-
-		self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response), callbackId: command.callbackId)
-	}
-
-
-
-    @objc(SWMgr_addExtraConfig:)
-    func SWMgr_addExtraConfig(command: CDVInvokedUrlCommand) {
-        let blob = command.arguments[0] as? String ?? ""
-        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-        let confPath = baseDir + "/extraConfig.conf";
-        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_augmentConfig(confPath, blob))
-	self.reinitMgr()
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(SWMgr_setExtraConfigValue:)
-    func SWMgr_setExtraConfigValue(command: CDVInvokedUrlCommand) {
-        let section = command.arguments[0] as? String ?? ""
-        let key = command.arguments[1] as? String ?? ""
-        let val = command.arguments[2] as? String ?? ""
-        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-        let confPath = baseDir + "/extraConfig.conf";
-        org_crosswire_sword_SWConfig_setKeyValue(confPath, section, key, val)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_setExtraConfigValue"), callbackId: command.callbackId)
-    }
-
-    
-    @objc(SWMgr_getExtraConfigValue:)
-    func SWMgr_getExtraConfigValue(command: CDVInvokedUrlCommand) {
-        let section = command.arguments[0] as? String ?? ""
-        let key = command.arguments[1] as? String ?? ""
-        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-        let confPath = baseDir + "/extraConfig.conf";
-        let keyVal = org_crosswire_sword_SWConfig_getKeyValue(confPath, section, key)
-        let retVal = keyVal == nil ? nil : String(cString:keyVal!)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(SWMgr_getExtraConfigKeys:)
-    func SWMgr_getExtraConfigKeys(command: CDVInvokedUrlCommand) {
-        let section = command.arguments[0] as? String ?? ""
-        let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-        let confPath = baseDir + "/extraConfig.conf";
-        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_getSectionKeys(confPath, section))
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-    }
-
-    
-	@objc(SWMgr_getExtraConfigSections:)
-	func SWMgr_getExtraConfigSections(command: CDVInvokedUrlCommand) {
-		let baseDir = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path)! + "/sword";
-		let confPath = baseDir + "/extraConfig.conf";
-        let retVal = getStringArray(buffer: org_crosswire_sword_SWConfig_getSections(confPath))
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-  }
-    
-    
-    @objc(echo:)
-    func echo(command: CDVInvokedUrlCommand) {
-        let msg = command.arguments[0] as? String ?? ""
-        myToast(message: msg)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: msg), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(HTTPUtils_makeRequest:)
-    func HTTPUtils_makeRequest(command: CDVInvokedUrlCommand) {
-        var url = command.arguments[0] as? String ?? ""
-        let postData = command.arguments[1] as? String ?? ""
-        let method = command.arguments[2] as? Int ?? 1
-        
-        if method == 1 {
-            url += "?" + postData
-        }
-        var request = URLRequest(url: URL(string: url)!)
-        request.httpMethod = method == 1 ? "GET" : "POST"
-        if method == 2 {
-            request.httpBody = postData.data(using: .utf8)
-        }
-        let session = URLSession.shared
-        session.dataTask(with: request) {data, response, err in
-            let pluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: String(data: data!, encoding: String.Encoding.utf8))
-            pluginResult?.setKeepCallbackAs(false)
-            self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
-        }.resume()
-
-        let pluginResult = CDVPluginResult(status: CDVCommandStatus_NO_RESULT)
-        pluginResult?.setKeepCallbackAs(true)
-        self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
-  }
-    
-    
-    @objc(SWModule_getBookNames:)
-    func SWModule_getBookNames(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        var retVal = [String]()
-        org_crosswire_sword_SWModule_begin(mod)
-        while (org_crosswire_sword_SWModule_popError(mod) == 0) {
-            retVal.append(getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod))[VERSEKEY_BOOKABBREV])
-            org_crosswire_sword_SWModule_setKeyText(mod, "+book")
-        }
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(SWModule_getVerseKey:)
-    func SWModule_getVerseKey(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let module = getModule(command: command)
-        if (module != 0) {
-            let retVal = getVerseKey(keyChildren: getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(module)))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-
-
-    @objc(SWModule_begin:)
-    func SWModule_begin(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            org_crosswire_sword_SWModule_begin(mod)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_begin"), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-
-    
-    @objc(SWModule_previous:)
-    func SWModule_previous(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            org_crosswire_sword_SWModule_previous(mod)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_previous"), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_next:)
-    func SWModule_next(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            org_crosswire_sword_SWModule_next(mod)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_next"), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_popError:)
-    func SWModule_popError(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let error = Int(org_crosswire_sword_SWModule_popError(mod))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: error), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_getEntryAttribute:)
-    func SWModule_getEntryAttribute(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let retVal = getStringArray(buffer: org_crosswire_sword_SWModule_getEntryAttribute(mod, command.arguments[1] as? String ?? "", command.arguments[2] as? String ?? "", command.arguments[3] as? String ?? "", (command.arguments[4] as? Bool ?? false) ? 1 : 0))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_getConfigEntry:)
-    func SWModule_getConfigEntry(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let val = org_crosswire_sword_SWModule_getConfigEntry(mod, command.arguments[1] as? String ?? "")
-            let retVal = val == nil ? nil : String(cString: val!)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_getKeyChildren:)
-    func SWModule_getKeyChildren(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let retVal = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWModule_getRenderHeader:)
-    func SWModule_getRenderHeader(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let header = String(cString: org_crosswire_sword_SWModule_getRenderHeader(mod))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: header), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
-        self.webView.inputViewController?.dismiss(animated: true, completion: {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK), callbackId: self.callbackID)
-        })
-    }
-
-    func sendVerse(module: Int, keyText: String) {
-        if MFMessageComposeViewController.canSendText() {
-            let controller = MFMessageComposeViewController()
-            let verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(module))
-            let modName = String(cString: org_crosswire_sword_SWModule_getName(module))
-            let verseText = String(cString: org_crosswire_sword_SWModule_stripText(module))
-            
-            
-            controller.body = verseText + " --" + verseKey[VERSEKEY_SHORTTEXT] + " (" + modName + ")"
-            controller.recipients = [""]
-            controller.messageComposeDelegate = self
-            self.webView.inputViewController?.present(controller, animated: true, completion: nil)
-        }
-    }
-    @objc(SWModule_sendText:)
-    func SWModule_sendText(command: CDVInvokedUrlCommand) {
-        initMgr()
-// Switch this to use cordova social plugin
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            mySWORDPlugin = self
-            callbackID = command.callbackId
-            let keyText = String(cString: org_crosswire_sword_SWModule_getKeyText(mod))
-            sendVerse(module: mod, keyText: keyText)
-            let result = CDVPluginResult(status: CDVCommandStatus_NO_RESULT)
-            result?.setKeepCallbackAs(true)
-            self.commandDelegate!.send(result, callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-
-    @objc(SWModule_getRenderText:)
-    func SWModule_getRenderText(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let retVal = String(cString: org_crosswire_sword_SWModule_renderText(mod))
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(SWMgr_startBibleSync:)
-    func SWMgr_startBibleSync(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let appName = command.arguments[0] as? String ?? ""
-        let userName = command.arguments[1] as? String ?? ""
-        let passphrase = command.arguments[2] as? String ?? ""
-            bibleSyncCallbackID = command.callbackId
-            DispatchQueue.global().async {
-                mySWORDPlugin = self
-                org_crosswire_sword_SWMgr_startBibleSync(self.mgr, appName, userName, passphrase, { (cmd : Int8, str1: Optional<UnsafePointer<Int8>>, str2: Optional<UnsafePointer<Int8>>) in
-                    let response1 = String(cString: str1!)
-                    let response2 = String(cString: str2!)
-                    if (mySWORDPlugin != nil && mySWORDPlugin!.bibleSyncCallbackID != "") {
-			if (cmd == CChar("N")) {
-				var retVal = [String:Any]()
-				retVal["cmd"]     = "nav";
-				retVal["osisRef"] = response1;
-				let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal)
-				result?.setKeepCallbackAs(true)
-				mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.bibleSyncCallbackID)
-			}
-			else if (cmd == CChar("C")	) {
-				var retVal = [String:Any]()
-				retVal["cmd"]     = "chat";
-				retVal["user"]    = response1;
-				retVal["message"] = response2;
-				let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal)
-				result?.setKeepCallbackAs(true)
-				mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.bibleSyncCallbackID)
-			}
-                    }
-                });
-                
-                self.bibleSyncCallbackID = ""
-                
-                let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_startBibleSync finished")
-                result?.setKeepCallbackAs(false)
-                self.commandDelegate!.send(result, callbackId: command.callbackId)
-            }
-            
-            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_startBibleSync")
-            result?.setKeepCallbackAs(true)
-            self.commandDelegate!.send(result, callbackId: command.callbackId)
-    }
-    
-    @objc(SWMgr_stopBibleSync:)
-    func SWMgr_stopBibleSync(command: CDVInvokedUrlCommand) {
-        initMgr()
-        org_crosswire_sword_SWMgr_stopBibleSync(mgr)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_stopBibleSync"), callbackId: command.callbackId)
-    }
-    
-    @objc(SWMgr_sendBibleSyncMessage:)
-    func SWMgr_sendBibleSyncMessage(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let osisRef = command.arguments[1] as? String ?? ""
-        org_crosswire_sword_SWMgr_sendBibleSyncMessage(mgr, osisRef)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_sendBibleSyncMessage"), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(SWModule_getRenderChapter:)
-    func SWModule_getRenderChapter(command: CDVInvokedUrlCommand) {
-        initMgr()
-        
-//        DispatchQueue.global().async {
-            self.initMgr()
-            let masterMod = self.getModule(command: command, nameArgNumber: 0)
-            let mod = self.getModule(command: command, nameArgNumber: 1)
-            if (masterMod != 0 && mod != 0) {
-                let r = self.renderChapter(masterMod: masterMod, mod: mod)
-                self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: r), callbackId: command.callbackId)
-            }
-//        }
-/*
-        var pluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_getRenderChapter")
-        pluginResult?.setKeepCallbackAs(true)
-        self.commandDelegate!.send(pluginResult, callbackId: command.callbackId)
-*/
-    }
-
-    var VERSEKEY_BOOK = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOK);
-    var VERSEKEY_CHAPTER = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPTER);
-    var VERSEKEY_VERSE = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSE);
-    var VERSEKEY_TESTAMENT = Int(org_crosswire_sword_SWModule_VERSEKEY_TESTAMENT);
-    var VERSEKEY_OSISREF = Int(org_crosswire_sword_SWModule_VERSEKEY_OSISREF);
-    var VERSEKEY_CHAPMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_CHAPMAX);
-    var VERSEKEY_VERSEMAX = Int(org_crosswire_sword_SWModule_VERSEKEY_VERSEMAX);
-    var VERSEKEY_BOOKNAME = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKNAME);
-    var VERSEKEY_SHORTTEXT = Int(org_crosswire_sword_SWModule_VERSEKEY_SHORTTEXT);
-    var VERSEKEY_BOOKABBREV = Int(org_crosswire_sword_SWModule_VERSEKEY_BOOKABBREV);
-
-    func renderChapter(masterMod: Int, mod: Int) -> [[String: Any]] {
-        let saveMasterKey = String(cString: org_crosswire_sword_SWModule_getKeyText(masterMod))
-        let saveKey = String(cString: org_crosswire_sword_SWModule_getKeyText(mod))
-        var r = [[String: Any]]()
-        var currentKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
-        let book = currentKey[VERSEKEY_BOOKABBREV]
-        let chapter = currentKey[VERSEKEY_CHAPTER]
-        org_crosswire_sword_SWModule_setKeyText(masterMod, book + "." + chapter + ".1")
-        var verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
-        while (org_crosswire_sword_SWModule_popError(masterMod) == 0
-            && currentKey[VERSEKEY_BOOK] == verseKey[VERSEKEY_BOOK]
-            && currentKey[VERSEKEY_CHAPTER] == verseKey[VERSEKEY_CHAPTER]
-            ) {
-                org_crosswire_sword_SWModule_setKeyText(mod, verseKey[VERSEKEY_OSISREF])
-                let error = org_crosswire_sword_SWModule_popError(mod)
-                var v = [String:Any]()
-                if (error == 0) {
-                    v["verse"] = getVerseKey(keyChildren: getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(mod)))
-                    var preVerse = ""
-                    for i in getStringArray(buffer: org_crosswire_sword_SWModule_getEntryAttribute(mod, "Heading", "Preverse", "", 1)) {
-                        preVerse += i
-                    }
-                    v["preVerse"] = preVerse
-                    v["text"] = String(cString: org_crosswire_sword_SWModule_renderText(mod))
-                }
-                else {
-                    
-                }
-                r.append(v)
-                org_crosswire_sword_SWModule_next(masterMod)
-                verseKey = getStringArray(buffer: org_crosswire_sword_SWModule_getKeyChildren(masterMod))
-        }
-        org_crosswire_sword_SWModule_setKeyText(masterMod, saveMasterKey)
-        org_crosswire_sword_SWModule_setKeyText(mod, saveKey)
-        
-        return r
-        
-    }
-    
-    func getVerseKey(keyChildren:[String]) -> [String:Any] {
-        var retVal = [String:Any]()
-        if (keyChildren.count > 9) {
-            retVal["testament"]   = Int(keyChildren[VERSEKEY_TESTAMENT]);
-            retVal["book"]        = Int(keyChildren[VERSEKEY_BOOK]);
-            retVal["chapter"]     = Int(keyChildren[VERSEKEY_CHAPTER]);
-            retVal["verse"]       = Int(keyChildren[VERSEKEY_VERSE]);
-            retVal["chapterMax"]  = Int(keyChildren[VERSEKEY_CHAPMAX]);
-            retVal["verseMax"]    = Int(keyChildren[VERSEKEY_VERSEMAX]);
-            retVal["bookName"]    = keyChildren[VERSEKEY_BOOKNAME];
-            retVal["osisRef"]     = keyChildren[VERSEKEY_OSISREF];
-            retVal["shortText"]   = keyChildren[VERSEKEY_SHORTTEXT];
-            retVal["bookAbbrev"]  = keyChildren[VERSEKEY_BOOKABBREV];
-        }
-        return retVal;
-    }
-
-    
-    @objc(SWModule_search:)
-    func SWModule_search(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let mod = getModule(command: command)
-        if (mod != 0) {
-            let expression = command.arguments[1] as? String ?? ""
-            let searchType = command.arguments[2] as? Int32 ?? 0
-            let flags = command.arguments[3] as? Int ?? 0
-            let scope = command.arguments.count < 5 ? nil : command.arguments[4] as? String ?? nil
-            callbackID = command.callbackId
-            DispatchQueue.global().async {
-                mySWORDPlugin = self
-                let buffer = org_crosswire_sword_SWModule_search(mod, expression, searchType, flags, scope, { (percent: Int32) in
-                    let response = [
-                        "status": "update",
-                        "percent": percent
-                        ] as [String : Any]
-                    if (mySWORDPlugin != nil && mySWORDPlugin!.callbackID != "") {
-                        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
-                        result?.setKeepCallbackAs(true)
-                        mySWORDPlugin!.commandDelegate!.send(result, callbackId: mySWORDPlugin!.callbackID)
-                    }
-                });
-                
-                self.callbackID = ""
-                var response = [
-                    "status": "complete",
-                    "percent": 100
-                ] as [String : Any]
-
-                //UnsafeMutablePointer<UnsafePointer<Int8>?>!) -> [String] {
-                var b = buffer
-                var count = 0
-                while let i = b?.pointee {
-                    if i.key == nil {
-                        break
-                    }
-                    count = count + 1
-                    b = b?.advanced(by: 1)
-                }
-                let searchResults = UnsafeBufferPointer<org_crosswire_sword_SearchHit>(start: buffer, count: count);
-                var results = [[String:Any]]()
-                for i in searchResults {
-                    let sr = [
-                        "key": String(cString: i.key),
-                        "score": Int(i.score)
-                    ] as [String : Any]
-                    results.append(sr)
-                }
-                response["results"] = results
-                
-                let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
-                result?.setKeepCallbackAs(false)
-                self.commandDelegate!.send(result, callbackId: command.callbackId)
-            }
-            
-            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_search")
-            result?.setKeepCallbackAs(true)
-            self.commandDelegate!.send(result, callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    func getModule(command: CDVInvokedUrlCommand, nameArgNumber: Int = 0) -> Int {
-        initMgr()
-        let modName = command.arguments[nameArgNumber] as? String ?? ""
-        let module = org_crosswire_sword_SWMgr_getModuleByName(mgr, modName)
-        if (module == 0) {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: "couldn't find module \(modName)"), callbackId: command.callbackId)
-        }
-        return module
-    }
-    
-    
-    @objc(SWModule_getKeyText:)
-    func SWModule_getKeyText(command: CDVInvokedUrlCommand) {
-        let module = getModule(command: command)
-        if (module != 0) {
-            let keyText = org_crosswire_sword_SWModule_getKeyText(module)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: keyText == nil ? "" : String(cString: keyText!)), callbackId: command.callbackId)
-        }
-    }
-    
-    
-
-    @objc(SWModule_setKeyText:)
-    func SWModule_setKeyText(command: CDVInvokedUrlCommand) {
-        let module = getModule(command: command)
-        let keyText = command.arguments[1] as? String ?? ""
-        if (module != 0) {
-            org_crosswire_sword_SWModule_setKeyText(module, keyText)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWModule_setKeyText"), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(InstallMgr_uninstallModule:)
-    func InstallMgr_uninstallModule(command: CDVInvokedUrlCommand) {
-        initInstall()
-        initMgr()
-        let retVal = org_crosswire_sword_InstallMgr_uninstallModule(installMgr, mgr, command.arguments[0] as? String ?? "")
-        if (retVal == 0) {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: retVal), callbackId: command.callbackId)
-        }
-        else {
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: retVal), callbackId: command.callbackId)
-        }
-    }
-    
-    var callbackID:String = ""
-    var bibleSyncCallbackID:String = ""
-    @objc(InstallMgr_remoteInstallModule:)
-    func InstallMgr_remoteInstallModule(command: CDVInvokedUrlCommand) {
-        initInstall()
-        initMgr()
-        let repo = command.arguments[0] as? String ?? ""
-        let modName = command.arguments[1] as? String ?? ""
-        callbackID = command.callbackId
-        DispatchQueue.global().async {
-            mySWORDPlugin = self
-            org_crosswire_sword_InstallMgr_remoteInstallModule(self.installMgr, self.mgr, repo, modName)
-            
-            self.reinitMgr()
-            self.callbackID = ""
-            let response = [
-                "status": "complete",
-                "totalBytes": 0,
-                "completedBytes": 0,
-                "message": "Complete"
-                ] as [String : Any]
-            let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: response)
-            result?.setKeepCallbackAs(false)
-            self.commandDelegate!.send(result, callbackId: command.callbackId)
-        }
-
-        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_remoteInstallModule")
-        result?.setKeepCallbackAs(true)
-        self.commandDelegate!.send(result, callbackId: command.callbackId)
-    }
-
-    
-    @objc(InstallMgr_getRemoteModInfoList:)
-    func InstallMgr_getRemoteModInfoList(command: CDVInvokedUrlCommand) {
-        initInstall()
-        initMgr()
-        let buffer = org_crosswire_sword_InstallMgr_getRemoteModInfoList(installMgr, mgr, command.arguments[0] as? String ?? "")
-        var count = 0
-        var b = buffer
-        while let i = b?.pointee {
-            if (i.name == nil) {
-                break
-            }
-            count = count + 1
-            b = b?.advanced(by: 1)
-        }
-        let modInfoList = Array(UnsafeBufferPointer<org_crosswire_sword_ModInfo>(start: buffer, count: count));
-        var mods = [[AnyHashable : Any]]()
-        for i in modInfoList {
-            let modInfo = [
-                "name": String(cString: i.name),
-                "description": String(cString: i.description),
-                "category": String(cString: i.category),
-                "language": String(cString: i.language),
-                "delta": String(cString: i.delta),
-                "cipherKey": i.cipherKey == nil ? nil : String(cString: i.cipherKey),
-                "version": String(cString: i.version),
-                "features": getStringArray(buffer: i.features)
-                ] as [AnyHashable : Any]
-            mods.append(modInfo)
-        }
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: mods), callbackId: command.callbackId)
-    }
-    
-    
-    @objc(InstallMgr_refreshRemoteSource:)
-    func InstallMgr_refreshRemoteSource(command: CDVInvokedUrlCommand) {
-        initInstall()
-        DispatchQueue.global().async {
-            mySWORDPlugin = self
-            self.callbackID = ""
-            org_crosswire_sword_InstallMgr_refreshRemoteSource(self.installMgr, command.arguments[0] as? String ?? "")
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_refreshRemoteSource"), callbackId: command.callbackId)
-        }
-    }
-
-    
-    func getStringArray(buffer: UnsafeMutablePointer<UnsafePointer<Int8>?>!) -> [String] {
-        var sources = [String]()
-        var b = buffer
-        while let i = b?.pointee {
-            sources.append(String(cString: i))
-            b = b?.advanced(by: 1)
-        }
-        return sources
-    }
-    
-    
-    @objc(InstallMgr_getRemoteSources:)
-    func InstallMgr_getRemoteSources(command: CDVInvokedUrlCommand) {
-        initInstall()
-        let sources = getStringArray(buffer: org_crosswire_sword_InstallMgr_getRemoteSources(installMgr))
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: sources), callbackId: command.callbackId)
-    }
-
-    
-    @objc(InstallMgr_syncConfig:)
-        func InstallMgr_syncConfig(command: CDVInvokedUrlCommand) {
-
-        initInstall()
-        DispatchQueue.global().async {
-            self.callbackID = ""
-            mySWORDPlugin = self
-            org_crosswire_sword_InstallMgr_syncConfig(self.installMgr)
-            self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_syncConfig"), callbackId: command.callbackId)
-        }
-    }
-    
-    
-    @objc(InstallMgr_setUserDisclaimerConfirmed:)
-    func InstallMgr_setUserDisclaimerConfirmed(command: CDVInvokedUrlCommand) {
-        initInstall()
-        org_crosswire_sword_InstallMgr_setUserDisclaimerConfirmed(installMgr)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "InstallMgr_setUserDisclaimerConfirmed"), callbackId: command.callbackId)
-    }
-    
-
-    @objc(SWMgr_setJavascript:)
-    func SWMgr_setJavascript(command: CDVInvokedUrlCommand) {
-        initMgr()
-        org_crosswire_sword_SWMgr_setJavascript(mgr, command.arguments[0] as? Bool ?? true ? 1 : 0)
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "SWMgr_setJavascript"), callbackId: command.callbackId)
-    }
-    
-    @objc(SWMgr_getModInfoList:)
-    func SWMgr_getModInfoList(command: CDVInvokedUrlCommand) {
-        initMgr()
-        let buffer = org_crosswire_sword_SWMgr_getModInfoList(mgr)
-        var b = buffer
-        var count = 0
-        while let i = b?.pointee {
-            if i.name == nil {
-                break
-            }
-            b = b?.advanced(by: 1)
-            count = count + 1
-        }
-        let modInfoList = Array(UnsafeBufferPointer<org_crosswire_sword_ModInfo>(start: buffer, count: count));
-        
-        var mods = [[AnyHashable : Any]]()
-        for i in modInfoList {
-            var modInfo = [
-                "name": String(cString: i.name),
-                "description": String(cString: i.description),
-                "category": String(cString: i.category),
-                "language": String(cString: i.language),
-                "delta": i.delta == nil ? "" : String(cString: i.delta),
-                "version": i.version == nil ? "" : String(cString: i.version),
-                "features": getStringArray(buffer: i.features)
-            ] as [AnyHashable : Any]
-
-            if (i.cipherKey != nil) {
-                modInfo["cipherKey"] = String(cString: i.cipherKey)
-            }
-            mods.append(modInfo)
-
-        }
-        self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: mods), callbackId: command.callbackId)
-    }
-/*
-SWMgr_startBibleSync
-SWMgr_stopBibleSync		
-SWMgr_sendBibleSyncMessage		
-*/
-}

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/tizen/DeviceProxy.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/tizen/DeviceProxy.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/tizen/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,39 +0,0 @@
-/*
- *
- * 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.
- *
-*/
-
-var tizen = require('cordova/platform');
-var cordova = require('cordova');
-
-module.exports = {
-    getDeviceInfo: function(success, error) {
-        setTimeout(function () {
-            success({
-                cordova: tizen.cordovaVersion,
-                platform: 'tizen',
-                model: null,
-                version: null,
-                uuid: null
-            });
-        }, 0);
-    }
-};
-
-require("cordova/tizen/commandProxy").add("Device", module.exports);

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.cpp
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.cpp	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.cpp	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
- *
- *  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.
- */
-
-#include <QDeviceInfo>
-#include <QtSystemInfo>
-
-#include"device.h"
-
-#define CORDOVA "3.0.0"
-
-Device::Device(Cordova *cordova) : CPlugin(cordova) {
-}
-
-static QString getOSName() {
-#ifdef Q_OS_SYMBIAN
-    QString platform = "Symbian";
-#endif
-#ifdef Q_OS_WIN
-    QString platform = "Windows";
-#endif
-#ifdef Q_OS_WINCE
-    QString platform = "Windows CE";
-#endif
-#ifdef Q_OS_LINUX
-    QString platform = "Linux";
-#endif
-    return platform;
-}
-
-void Device::getInfo(int scId, int ecId) {
-    Q_UNUSED(ecId)
-
-    QDeviceInfo systemDeviceInfo;
-    QDeviceInfo systemInfo;
-
-    QString platform = getOSName();
-
-    QString uuid = systemDeviceInfo.uniqueDeviceID();
-    if (uuid.isEmpty()) {
-        QString deviceDescription = systemInfo.imei(0) + ";" + systemInfo.manufacturer() + ";" + systemInfo.model() + ";" + systemInfo.productName() + ";" + platform;
-        QString user = qgetenv("USER");
-        if (user.isEmpty()) {
-            user = qgetenv("USERNAME");
-            if (user.isEmpty())
-                user = QDir::homePath();
-        }
-        uuid = QString(QCryptographicHash::hash((deviceDescription + ";" + user).toUtf8(), QCryptographicHash::Md5).toHex());
-    }
-
-    this->cb(scId, systemDeviceInfo.model(), CORDOVA, platform, uuid, systemInfo.version(QDeviceInfo::Os));
-}

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.h
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.h	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.h	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
- *
- *  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.
- */
-
-#ifndef DEVICE_H_FDSAFAS
-#define DEVICE_H_FDSAFAS
-
-#include <QtCore>
-
-#include <cplugin.h>
-
-class Device: public CPlugin {
-    Q_OBJECT
-public:
-    explicit Device(Cordova *cordova);
-
-    virtual const QString fullName() override {
-        return Device::fullID();
-    }
-
-    virtual const QString shortName() override {
-        return "Device";
-    }
-
-    static const QString fullID() {
-        return "com.cordova.Device";
-    }
-
-signals:
-
-public slots:
-    void getInfo(int scId, int ecId);
-};
-
-#endif

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/ubuntu/device.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,34 +0,0 @@
-/*
- *
- * 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.
- *
-*/
-
-var cordova = require('cordova');
-var exec = require('cordova/exec');
-
-module.exports = {
-    getInfo:function(win,fail,args) {
-        Cordova.exec(function (model, cordova, platform, uuid, version) {
-            win({name: name, model: model, cordova: cordova,
-                 platform: platform, uuid: uuid, version: version});
-        }, null, "com.cordova.Device", "getInfo", []);
-    }
-};
-
-require("cordova/exec/proxy").add("Device", module.exports);

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/windows8/DeviceProxy.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/windows8/DeviceProxy.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/windows8/DeviceProxy.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,50 +0,0 @@
-/*
- *
- * 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.
- *
-*/
-
-
-var cordova = require('cordova');
-var utils = require('cordova/utils');
-
-module.exports = {
-
-    getDeviceInfo:function(win,fail,args) {
-
-        // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId
-        var deviceId;
-
-        var localSettings = Windows.Storage.ApplicationData.current.localSettings;
-
-        if (localSettings.values.deviceId) {
-            deviceId = localSettings.values.deviceId;
-        }
-        else {
-            deviceId = localSettings.values.deviceId = utils.createUUID();
-        }
-
-        setTimeout(function () {
-            win({ platform: "windows8", version: "8", uuid: deviceId, cordova: '0.0.0', model: window.clientInformation.platform });
-        }, 0);
-    }
-
-};
-
-require("cordova/windows8/commandProxy").add("Device", module.exports);
-

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/wp/Device.cs
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/wp/Device.cs	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/src/wp/Device.cs	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,135 +0,0 @@
-/*  
-	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.
-*/
-
-using System;
-using System.Net;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Documents;
-using System.Windows.Ink;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Animation;
-using System.Windows.Shapes;
-using Microsoft.Phone.Info;
-using System.IO.IsolatedStorage;
-using System.Windows.Resources;
-using System.IO;
-using System.Diagnostics;
-
-namespace WPCordovaClassLib.Cordova.Commands
-{
-    public class Device : BaseCommand
-    {
-        public void getDeviceInfo(string notused)
-        {
-
-            string res = String.Format("\"name\":\"{0}\",\"cordova\":\"{1}\",\"platform\":\"{2}\",\"uuid\":\"{3}\",\"version\":\"{4}\",\"model\":\"{5}\"",
-                                        this.name,
-                                        this.cordova,
-                                        this.platform,
-                                        this.uuid,
-                                        this.version,
-                                        this.model);
-
-
-
-            res = "{" + res + "}";
-            //Debug.WriteLine("Result::" + res);
-            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, res));
-        }
-
-        public string model
-        {
-            get
-            {
-                return DeviceStatus.DeviceName;
-                //return String.Format("{0},{1},{2}", DeviceStatus.DeviceManufacturer, DeviceStatus.DeviceHardwareVersion, DeviceStatus.DeviceFirmwareVersion); 
-            }
-        }
-
-        public string name
-        {
-            get
-            {
-                return DeviceStatus.DeviceName;
-                
-            }
-        }
-
-        public string cordova
-        {
-            get
-            {
-                // TODO: should be able to dynamically read the Cordova version from somewhere...
-                return "3.0.0";
-            }
-        }
-
-        public string platform
-        {
-            get
-            {
-                return Environment.OSVersion.Platform.ToString();
-            }
-        }
-
-        public string uuid
-        {
-            get
-            {
-                string returnVal = "";
-                object id;
-                UserExtendedProperties.TryGetValue("ANID", out id);
-
-                if (id != null)
-                {
-                    returnVal = id.ToString().Substring(2, 32);
-                }
-                else
-                {
-                    returnVal = "???unknown???";
-
-                    using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
-                    {
-                        try
-                        {
-                            IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream("DeviceID.txt", FileMode.Open, FileAccess.Read, appStorage);
-
-                            using (StreamReader reader = new StreamReader(fileStream))
-                            {
-                                returnVal = reader.ReadLine();
-                            }
-                        }
-                        catch (Exception /*ex*/)
-                        {
-
-                        }
-                    }
-                }
-
-                return returnVal;
-            }
-        }
-
-        public string version
-        {
-            get
-            {
-                return Environment.OSVersion.Version.ToString();
-            }
-        }
-
-    }
-}

Deleted: trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/www/SWORD.js
===================================================================
--- trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/www/SWORD.js	2019-05-21 00:57:40 UTC (rev 3632)
+++ trunk/bindings/cordova/org.crosswire.sword.cordova.SWORD/www/SWORD.js	2019-05-24 22:40:50 UTC (rev 3633)
@@ -1,445 +0,0 @@
-var	argscheck = require('cordova/argscheck'),
-	channel   = require('cordova/channel'),
-	utils     = require('cordova/utils'),
-	exec      = require('cordova/exec'),
-	cordova   = require('cordova');
-
-channel.createSticky('onSWORDReady');
-// Tell cordova channel to wait on the CordovaInfoReady event
-channel.waitForInitialization('onSWORDReady');
-
-
-function InstallMgr() {
-}
-
-InstallMgr.prototype.setUserDisclaimerConfirmed = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_setUserDisclaimerConfirmed", []
-	);
-	return retVal;
-}
-
-InstallMgr.prototype.syncConfig = function(callback, progressNotify) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_syncConfig", [progressNotify]
-	);
-	return retVal;
-}
-
-
-InstallMgr.prototype.getRemoteSources = function(callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_getRemoteSources", []
-	);
-	return retVal;
-}
-
-
-InstallMgr.prototype.refreshRemoteSource = function(sourceName, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_refreshRemoteSource", [sourceName]
-	);
-	return retVal;
-}
-
-InstallMgr.prototype.getRemoteModInfoList = function(sourceName, callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_getRemoteModInfoList", [sourceName]
-	);
-	return retVal;
-}
-
-// callback({ status : preStatus|update|complete, totalBytes : n, completedBytes : n, message : displayable });
-InstallMgr.prototype.remoteInstallModule = function(sourceName, modName, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_remoteInstallModule", [sourceName, modName]
-	);
-	return retVal;
-}
-
-InstallMgr.prototype.uninstallModule = function(modName, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "InstallMgr_uninstallModule", [modName]
-	);
-	return retVal;
-}
-
-function SWModule(modInfo) {
-	this.name           = modInfo.name;
-	this.description    = modInfo.description;
-	this.category       = modInfo.category;
-	this.direction      = modInfo.direction;
-	this.language       = modInfo.language;
-	this.font           = modInfo.font;
-	this.shortCopyright = modInfo.shortCopyright;
-	this.shortPromo     = modInfo.shortPromo;
-}
-
-SWModule.prototype.SEARCHTYPE_REGEX     =  1;
-SWModule.prototype.SEARCHTYPE_PHRASE    = -1;
-SWModule.prototype.SEARCHTYPE_MULTIWORD = -2;
-SWModule.prototype.SEARCHTYPE_ENTRYATTR = -3;
-SWModule.prototype.SEARCHTYPE_LUCENE    = -4;
-
-SWModule.prototype.SEARCHOPTION_ICASE   = 2;
-
-
-SWModule.prototype.setKeyText = function(keyText, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_setKeyText", [this.name, keyText]
-	);
-	return retVal;
-}
-
-SWModule.prototype.search = function(expression, searchType, flags, scope, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_search", [this.name, expression, searchType, flags, scope]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getKeyText = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getKeyText", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getRenderText = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getRenderText", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.shareVerse = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_sendText", [this.name]
-	);
-	return retVal;
-}
-
-/*
- * masterMod - SWModule to use for traversing chapter; null if self
- * 	useful for parallel display with alternate v11ns
- *
- * returns [ { verse : verseKey,  preVerse : 'text', text : 'text' }, ... }
- */
-SWModule.prototype.getRenderChapter = function(masterMod, callback) {
-	var retVal = null;
-	if (!masterMod) masterMod = this;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getRenderChapter", [masterMod.name, this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getRenderHeader = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getRenderHeader", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getKeyChildren = function(callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getKeyChildren", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getVerseKey = function(callback) {
-	var retVal = {};
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getVerseKey", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getConfigEntry = function(key, callback) {
-	var retVal = '';
-	exec(callback?callback:function(m) { if (m) retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getConfigEntry", [this.name, key]
-	);
-	return retVal;
-}
-
-
-SWModule.prototype.popError = function(callback) {
-	var retVal = 0;
-	exec(callback?callback:function(m) { retVal = m; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_popError", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getEntryAttribute = function(level1Key, level2Key, level3Key, isFiltered, callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getEntryAttribute", [this.name, level1Key, level2Key, level3Key, isFiltered]
-	);
-	return retVal;
-}
-
-SWModule.prototype.next = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_next", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.previous = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_previous", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.begin = function(callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_begin", [this.name]
-	);
-	return retVal;
-}
-
-SWModule.prototype.getBookNames = function(callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWModule_getBookNames", [this.name]
-	);
-	return retVal;
-}
-
-function SWMgr() {
-}
-
-
-SWMgr.prototype.getModInfoList = function(callback) {
-	if (!this.hasOwnProperty('_lastModInfoList')) this._lastModInfoList = [];
-	exec(function(m) { if (m && m.length > 0) this._lastModInfoList = m; if (callback) callback(m); },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getModInfoList", []
-	);
-	return this._lastModInfoList;
-}
-
-SWMgr.prototype.getModuleByName = function(modName, callback) {
-	var mod = null;
-	exec(function(m) { if (m.name) mod = new SWModule(m); if (callback) callback(mod); },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getModuleByName", [modName]
-	);
-	return mod;
-}
-
-SWMgr.prototype.getExtraConfigSections = function(callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getExtraConfigSections", []
-	);
-	return retVal;
-}
-
-SWMgr.prototype.getExtraConfigKeys = function(section, callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getExtraConfigKeys", [section]
-	);
-	return retVal;
-}
-
-SWMgr.prototype.getExtraConfigValue = function(section, key, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getExtraConfigValue", [section, key]
-	);
-	return retVal;
-}
-
-SWMgr.prototype.setExtraConfigValue = function(section, key, value, callback) {
-	exec(callback?callback:function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_setExtraConfigValue", [section, key, value]
-	);
-}
-
-SWMgr.prototype.addExtraConfig = function(confBlob, callback) {
-	var retVal = null;
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_addExtraConfig", [confBlob]
-	);
-	return retVal;
-}
-
-SWMgr.prototype.startBibleSync = function(appName, userName, passphrase, callback) {
-	exec(callback,
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_startBibleSync", [appName, userName, passphrase]
-	);
-}
-
-SWMgr.prototype.stopBibleSync = function() {
-	exec(function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_stopBibleSync", []
-	);
-}
-
-SWMgr.prototype.sendBibleSyncMessage = function(osisRef, callback) {
-	exec(callback?callback:function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_sendBibleSyncMessage", [osisRef]
-	);
-}
-
-SWMgr.prototype.setJavascript = function(val, callback) {
-	exec(callback?callback:function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_setJavascript", [val]
-	);
-}
-
-SWMgr.prototype.getAvailableLocales = function(callback) {
-	var retVal = [];
-	exec(callback?callback:function(r) { retVal = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_getAvailableLocales", []
-	);
-	return retVal;
-}
-
-SWMgr.prototype.setDefaultLocale = function(val, callback) {
-	exec(callback?callback:function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_setDefaultLocale", [val]
-	);
-}
-
-SWMgr.prototype.translate = function(text, locale, callback) {
-	// support overloaded (text, callback)
-	if (!callback && locale) { callback = locale; locale = null; }
-	exec(callback?callback:function() {},
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "SWMgr_translate", [text, locale]
-	);
-}
-
-
-function HTTPUtils() {}
-
-HTTPUtils.prototype.METHOD_GET  =  0;
-HTTPUtils.prototype.METHOD_POST =  1;
-
-HTTPUtils.prototype.makeRequest = function(url, postData, callback, method) {
-	var result = null;
-	if (!method) method = this.METHOD_POST;
-	exec(callback?callback:function(r) { if (r && r.length > 0) result = r; },
-		function(err) { utils.alert('[ERROR] problem: ' + err); },
-		"SWORD", "HTTPUtils_makeRequest", [url, postData, method]
-	);
-	return result;
-}
-
-
-
-/*
-	public native String      getPrefixPath();
-	public native String      getConfigPath();
-	public native void        setGlobalOption(String option, String value);
-	public native String      getGlobalOption(String option);
-	public native String      getGlobalOptionTip(String option);
-	public native String      filterText(String filterName, String text);
-	public native String[]    getGlobalOptions();
-	public native String[]    getGlobalOptionValues(String option);
-	public native void        setCipherKey(String modName, String key);
-	public native void        setJavascript(boolean val);
-*/
-
-
-/**
- * This is the SWORD namespace and access to singleton SWMgr, InstallMgr, and HTTPUtils.
- * @constructor
- */
-function SWORD() {
-
-	var me = this;
-
-	this.available = false;
-	this.version = null;
-
-	this.installMgr = new InstallMgr();
-	this.mgr        = new SWMgr();
-	this.httpUtils  = new HTTPUtils();
-
-	channel.onCordovaReady.subscribe(function() {
-		me.init(function(info) {
-			me.available = true;
-			me.version = info.version;
-			channel.onSWORDReady.fire();
-		},function(e) {
-			me.available = false;
-			utils.alert("[ERROR] Error initializing SWORD: " + e);
-		});
-	});
-}
-
-
-SWORD.prototype.CATEGORY_BIBLES       = "Biblical Texts";
-SWORD.prototype.CATEGORY_COMMENTARIES = "Commentaries";
-SWORD.prototype.CATEGORY_LEXDICTS     = "Lexicons / Dictionaries";
-SWORD.prototype.CATEGORY_GENBOOKS     = "Generic Books";
-SWORD.prototype.CATEGORY_DAILYDEVOS   = "Daily Devotional";
-
-
-SWORD.prototype.init = function(successCallback, errorCallback) {
-	exec(successCallback, errorCallback, "SWORD", "initSWORD", []);
-};
-
-
-module.exports = new SWORD();
-
-




More information about the sword-cvs mailing list