2012-09-20 02:08:52 +08:00
// commit 65b59c7e484a9e5227fa7b4de8e784a8466b2ef5
2012-04-13 07:37:27 +08:00
2012-09-20 02:08:52 +08:00
// File generated at :: Wed Sep 19 2012 13:58:04 GMT-0400 (EDT)
2012-04-10 08:11:13 +08:00
2012-02-18 07:28:35 +08:00
/ *
2012-03-25 02:09:57 +08:00
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 .
* /
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
; ( function ( ) {
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/scripts/require.js
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var require ,
define ;
( function ( ) {
var modules = { } ;
2012-09-19 01:15:24 +08:00
// Stack of moduleIds currently being built.
var requireStack = [ ] ;
// Map of module ID -> index into requireStack of modules currently being built.
var inProgressModules = { } ;
2012-02-18 07:28:35 +08:00
function build ( module ) {
var factory = module . factory ;
module . exports = { } ;
delete module . factory ;
factory ( require , module . exports , module ) ;
return module . exports ;
}
require = function ( id ) {
if ( ! modules [ id ] ) {
throw "module " + id + " not found" ;
2012-09-19 01:15:24 +08:00
} else if ( id in inProgressModules ) {
var cycle = requireStack . slice ( inProgressModules [ id ] ) . join ( '->' ) + '->' + id ;
throw "Cycle in require graph: " + cycle ;
2012-02-18 07:28:35 +08:00
}
2012-09-19 01:15:24 +08:00
if ( modules [ id ] . factory ) {
try {
inProgressModules [ id ] = requireStack . length ;
requireStack . push ( id ) ;
return build ( modules [ id ] ) ;
} finally {
delete inProgressModules [ id ] ;
requireStack . pop ( ) ;
}
}
return modules [ id ] . exports ;
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
define = function ( id , factory ) {
if ( modules [ id ] ) {
throw "module " + id + " already defined" ;
}
modules [ id ] = {
id : id ,
factory : factory
} ;
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
define . remove = function ( id ) {
delete modules [ id ] ;
} ;
} ) ( ) ;
//Export for use in node
if ( typeof module === "object" && typeof require === "function" ) {
module . exports . require = require ;
module . exports . define = define ;
}
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/cordova.js
define ( "cordova" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var channel = require ( 'cordova/channel' ) ;
2012-04-24 02:37:33 +08:00
/ * *
* Listen for DOMContentLoaded and notify our channel subscribers .
* /
document . addEventListener ( 'DOMContentLoaded' , function ( ) {
channel . onDOMContentLoaded . fire ( ) ;
} , false ) ;
2012-06-06 05:26:02 +08:00
if ( document . readyState == 'complete' || document . readyState == 'interactive' ) {
2012-04-24 02:37:33 +08:00
channel . onDOMContentLoaded . fire ( ) ;
}
2012-02-18 07:28:35 +08:00
/ * *
* Intercept calls to addEventListener + removeEventListener and handle deviceready ,
* resume , and pause events .
* /
var m _document _addEventListener = document . addEventListener ;
var m _document _removeEventListener = document . removeEventListener ;
var m _window _addEventListener = window . addEventListener ;
var m _window _removeEventListener = window . removeEventListener ;
/ * *
* Houses custom event handlers to intercept on document + window event listeners .
* /
var documentEventHandlers = { } ,
windowEventHandlers = { } ;
document . addEventListener = function ( evt , handler , capture ) {
var e = evt . toLowerCase ( ) ;
2012-05-11 07:43:08 +08:00
if ( typeof documentEventHandlers [ e ] != 'undefined' ) {
2012-09-19 01:15:24 +08:00
documentEventHandlers [ e ] . subscribe ( handler ) ;
2012-02-18 07:28:35 +08:00
} else {
2012-05-01 04:42:38 +08:00
m _document _addEventListener . call ( document , evt , handler , capture ) ;
2012-02-18 07:28:35 +08:00
}
} ;
window . addEventListener = function ( evt , handler , capture ) {
2012-05-01 04:42:38 +08:00
var e = evt . toLowerCase ( ) ;
if ( typeof windowEventHandlers [ e ] != 'undefined' ) {
windowEventHandlers [ e ] . subscribe ( handler ) ;
} else {
m _window _addEventListener . call ( window , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
2012-03-01 23:45:27 +08:00
document . removeEventListener = function ( evt , handler , capture ) {
2012-04-24 02:37:33 +08:00
var e = evt . toLowerCase ( ) ;
// If unsubcribing from an event that is handled by a plugin
2012-05-11 07:43:08 +08:00
if ( typeof documentEventHandlers [ e ] != "undefined" ) {
2012-04-24 02:37:33 +08:00
documentEventHandlers [ e ] . unsubscribe ( handler ) ;
} else {
m _document _removeEventListener . call ( document , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
window . removeEventListener = function ( evt , handler , capture ) {
2012-05-01 04:42:38 +08:00
var e = evt . toLowerCase ( ) ;
// If unsubcribing from an event that is handled by a plugin
if ( typeof windowEventHandlers [ e ] != "undefined" ) {
windowEventHandlers [ e ] . unsubscribe ( handler ) ;
} else {
m _window _removeEventListener . call ( window , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
function createEvent ( type , data ) {
2012-05-01 04:42:38 +08:00
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( type , false , false ) ;
if ( data ) {
for ( var i in data ) {
if ( data . hasOwnProperty ( i ) ) {
event [ i ] = data [ i ] ;
}
}
2012-02-18 07:28:35 +08:00
}
2012-05-01 04:42:38 +08:00
return event ;
2012-02-18 07:28:35 +08:00
}
2012-05-01 04:42:38 +08:00
if ( typeof window . console === "undefined" ) {
2012-04-24 02:37:33 +08:00
window . console = {
log : function ( ) { }
} ;
2012-04-10 08:11:13 +08:00
}
2012-02-18 07:28:35 +08:00
var cordova = {
2012-03-10 04:32:22 +08:00
define : define ,
require : require ,
2012-02-18 07:28:35 +08:00
/ * *
* Methods to add / remove your own addEventListener hijacking on document + window .
* /
2012-09-19 01:15:24 +08:00
addWindowEventHandler : function ( event ) {
return ( windowEventHandlers [ event ] = channel . create ( event ) ) ;
2012-02-18 07:28:35 +08:00
} ,
2012-09-19 01:15:24 +08:00
addStickyDocumentEventHandler : function ( event ) {
return ( documentEventHandlers [ event ] = channel . createSticky ( event ) ) ;
} ,
addDocumentEventHandler : function ( event ) {
return ( documentEventHandlers [ event ] = channel . create ( event ) ) ;
2012-02-18 07:28:35 +08:00
} ,
removeWindowEventHandler : function ( event ) {
2012-05-01 04:42:38 +08:00
delete windowEventHandlers [ event ] ;
2012-02-18 07:28:35 +08:00
} ,
removeDocumentEventHandler : function ( event ) {
2012-05-01 04:42:38 +08:00
delete documentEventHandlers [ event ] ;
2012-02-18 07:28:35 +08:00
} ,
2012-04-10 08:11:13 +08:00
/ * *
* Retreive original event handlers that were replaced by Cordova
*
* @ return object
* /
getOriginalHandlers : function ( ) {
return { 'document' : { 'addEventListener' : m _document _addEventListener , 'removeEventListener' : m _document _removeEventListener } ,
'window' : { 'addEventListener' : m _window _addEventListener , 'removeEventListener' : m _window _removeEventListener } } ;
} ,
2012-02-18 07:28:35 +08:00
/ * *
* Method to fire event from native code
2012-09-12 23:44:53 +08:00
* bNoDetach is required for events which cause an exception which needs to be caught in native code
2012-02-18 07:28:35 +08:00
* /
2012-09-12 23:44:53 +08:00
fireDocumentEvent : function ( type , data , bNoDetach ) {
2012-05-01 04:42:38 +08:00
var evt = createEvent ( type , data ) ;
if ( typeof documentEventHandlers [ type ] != 'undefined' ) {
2012-09-12 23:44:53 +08:00
if ( bNoDetach ) {
documentEventHandlers [ type ] . fire ( evt ) ;
}
else {
setTimeout ( function ( ) {
documentEventHandlers [ type ] . fire ( evt ) ;
} , 0 ) ;
}
2012-05-01 04:42:38 +08:00
} else {
document . dispatchEvent ( evt ) ;
}
2012-02-18 07:28:35 +08:00
} ,
fireWindowEvent : function ( type , data ) {
2012-05-01 04:42:38 +08:00
var evt = createEvent ( type , data ) ;
if ( typeof windowEventHandlers [ type ] != 'undefined' ) {
2012-06-22 02:12:30 +08:00
setTimeout ( function ( ) {
windowEventHandlers [ type ] . fire ( evt ) ;
} , 0 ) ;
2012-05-01 04:42:38 +08:00
} else {
window . dispatchEvent ( evt ) ;
}
2012-02-18 07:28:35 +08:00
} ,
2012-03-06 04:11:24 +08:00
// TODO: iOS only
// This queue holds the currently executing command and all pending
// commands executed with cordova.exec().
commandQueue : [ ] ,
// Indicates if we're currently in the middle of flushing the command
// queue on the native side.
commandQueueFlushing : false ,
// END TODO
2012-02-18 07:28:35 +08:00
/ * *
* Plugin callback mechanism .
* /
callbackId : 0 ,
callbacks : { } ,
callbackStatus : {
NO _RESULT : 0 ,
OK : 1 ,
CLASS _NOT _FOUND _EXCEPTION : 2 ,
ILLEGAL _ACCESS _EXCEPTION : 3 ,
INSTANTIATION _EXCEPTION : 4 ,
MALFORMED _URL _EXCEPTION : 5 ,
IO _EXCEPTION : 6 ,
INVALID _ACTION : 7 ,
JSON _EXCEPTION : 8 ,
ERROR : 9
} ,
/ * *
* Called by native code when returning successful result from an action .
* /
callbackSuccess : function ( callbackId , args ) {
2012-09-19 01:15:24 +08:00
try {
cordova . callbackFromNative ( callbackId , true , args . status , args . message , args . keepCallback ) ;
} catch ( e ) {
console . log ( "Error in error callback: " + callbackId + " = " + e ) ;
2012-02-18 07:28:35 +08:00
}
} ,
/ * *
* Called by native code when returning error result from an action .
* /
callbackError : function ( callbackId , args ) {
2012-09-19 01:15:24 +08:00
// TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
// Derive success from status.
try {
cordova . callbackFromNative ( callbackId , false , args . status , args . message , args . keepCallback ) ;
} catch ( e ) {
console . log ( "Error in error callback: " + callbackId + " = " + e ) ;
}
} ,
/ * *
* Called by native code when returning the result from an action .
* /
callbackFromNative : function ( callbackId , success , status , message , keepCallback ) {
var callback = cordova . callbacks [ callbackId ] ;
if ( callback ) {
if ( success && status == cordova . callbackStatus . OK ) {
callback . success && callback . success ( message ) ;
} else if ( ! success ) {
callback . fail && callback . fail ( message ) ;
2012-02-18 07:28:35 +08:00
}
// Clear callback if not expecting any more results
2012-09-19 01:15:24 +08:00
if ( ! keepCallback ) {
2012-02-18 07:28:35 +08:00
delete cordova . callbacks [ callbackId ] ;
}
}
2012-03-06 04:11:24 +08:00
} ,
addConstructor : function ( func ) {
2012-09-19 01:15:24 +08:00
channel . onCordovaReady . subscribe ( function ( ) {
2012-03-06 04:11:24 +08:00
try {
func ( ) ;
} catch ( e ) {
console . log ( "Failed to run constructor: " + e ) ;
}
} ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-05-11 07:43:08 +08:00
// Register pause, resume and deviceready channels as events on document.
channel . onPause = cordova . addDocumentEventHandler ( 'pause' ) ;
channel . onResume = cordova . addDocumentEventHandler ( 'resume' ) ;
2012-09-19 01:15:24 +08:00
channel . onDeviceReady = cordova . addStickyDocumentEventHandler ( 'deviceready' ) ;
2012-05-11 07:43:08 +08:00
2012-02-18 07:28:35 +08:00
module . exports = cordova ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/builder.js
define ( "cordova/builder" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-24 02:37:33 +08:00
var utils = require ( 'cordova/utils' ) ;
2012-03-25 02:09:57 +08:00
function each ( objects , func , context ) {
for ( var prop in objects ) {
if ( objects . hasOwnProperty ( prop ) ) {
func . apply ( context , [ objects [ prop ] , prop ] ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
}
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
function assignOrWrapInDeprecateGetter ( obj , key , value , message ) {
if ( message ) {
utils . defineGetter ( obj , key , function ( ) {
window . console && console . log ( message ) ;
return value ;
} ) ;
} else {
obj [ key ] = value ;
}
}
2012-03-25 02:09:57 +08:00
function include ( parent , objects , clobber , merge ) {
each ( objects , function ( obj , key ) {
try {
var result = obj . path ? require ( obj . path ) : { } ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
if ( clobber ) {
// Clobber if it doesn't exist.
if ( typeof parent [ key ] === 'undefined' ) {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
} else if ( typeof obj . path !== 'undefined' ) {
// If merging, merge properties onto parent, otherwise, clobber.
if ( merge ) {
recursiveMerge ( parent [ key ] , result ) ;
} else {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
}
}
result = parent [ key ] ;
} else {
// Overwrite if not currently defined.
if ( typeof parent [ key ] == 'undefined' ) {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
} else if ( merge && typeof obj . path !== 'undefined' ) {
// If merging, merge parent onto result
recursiveMerge ( result , parent [ key ] ) ;
parent [ key ] = result ;
} else {
// Set result to what already exists, so we can build children into it if they exist.
result = parent [ key ] ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
}
if ( obj . children ) {
include ( result , obj . children , clobber , merge ) ;
}
} catch ( e ) {
2012-03-29 04:47:45 +08:00
utils . alert ( 'Exception building cordova JS globals: ' + e + ' for key "' + key + '"' ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
} ) ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Merge properties from one object onto another recursively . Properties from
* the src object will overwrite existing target property .
*
* @ param target Object to merge properties into .
* @ param src Object to merge properties from .
* /
function recursiveMerge ( target , src ) {
for ( var prop in src ) {
if ( src . hasOwnProperty ( prop ) ) {
if ( typeof target . prototype !== 'undefined' && target . prototype . constructor === target ) {
// If the target object is a constructor override off prototype.
target . prototype [ prop ] = src [ prop ] ;
} else {
target [ prop ] = typeof src [ prop ] === 'object' ? recursiveMerge (
target [ prop ] , src [ prop ] ) : src [ prop ] ;
2012-02-18 07:28:35 +08:00
}
}
2012-03-25 02:09:57 +08:00
}
return target ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
module . exports = {
build : function ( objects ) {
return {
intoButDontClobber : function ( target ) {
include ( target , objects , false , false ) ;
} ,
intoAndClobber : function ( target ) {
include ( target , objects , true , false ) ;
} ,
intoAndMerge : function ( target ) {
include ( target , objects , true , true ) ;
}
} ;
}
} ;
2012-02-18 07:28:35 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/channel.js
define ( "cordova/channel" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-08-25 04:44:18 +08:00
var utils = require ( 'cordova/utils' ) ,
nextGuid = 1 ;
2012-05-01 04:42:38 +08:00
2012-03-25 02:09:57 +08:00
/ * *
2012-04-11 22:44:09 +08:00
* Custom pub - sub "channel" that can have functions subscribed to it
* This object is used to define and control firing of events for
2012-09-19 01:15:24 +08:00
* cordova initialization , as well as for custom events thereafter .
2012-04-11 22:44:09 +08:00
*
* The order of events during page load and Cordova startup is as follows :
*
2012-09-19 01:15:24 +08:00
* onDOMContentLoaded * Internal event that is received when the web page is loaded and parsed .
* onNativeReady * Internal event that indicates the Cordova native side is ready .
* onCordovaReady * Internal event fired when all Cordova JavaScript objects have been created .
* onCordovaInfoReady * Internal event fired when device properties are available .
* onCordovaConnectionReady * Internal event fired when the connection property has been set .
* onDeviceReady * User event fired to indicate that Cordova is ready
* onResume User event fired to indicate a start / resume lifecycle event
* onPause User event fired to indicate a pause lifecycle event
* onDestroy * Internal event fired when app is being destroyed ( User should use window . onunload event , not this one ) .
*
* The events marked with an * are sticky . Once they have fired , they will stay in the fired state .
* All listeners that subscribe after the event is fired will be executed right away .
2012-04-11 22:44:09 +08:00
*
* The only Cordova events that user code should register for are :
* deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript
* pause App has moved to background
* resume App has returned to foreground
*
* Listeners can be registered as :
* document . addEventListener ( "deviceready" , myDeviceReadyListener , false ) ;
* document . addEventListener ( "resume" , myResumeListener , false ) ;
* document . addEventListener ( "pause" , myPauseListener , false ) ;
*
* The DOM lifecycle events should be used for saving and restoring state
* window . onload
* window . onunload
*
* /
/ * *
* Channel
2012-03-25 02:09:57 +08:00
* @ constructor
* @ param type String the channel name
2012-09-19 01:15:24 +08:00
* /
var Channel = function ( type , sticky ) {
2012-05-01 04:42:38 +08:00
this . type = type ;
2012-09-19 01:15:24 +08:00
// Map of guid -> function.
2012-05-01 04:42:38 +08:00
this . handlers = { } ;
2012-09-19 01:15:24 +08:00
// 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
this . state = sticky ? 1 : 0 ;
// Used in sticky mode to remember args passed to fire().
this . fireArgs = null ;
// Used by onHasSubscribersChange to know if there are any listeners.
2012-05-01 04:42:38 +08:00
this . numHandlers = 0 ;
2012-09-19 01:15:24 +08:00
// Function that is called when the first listener is subscribed, or when
// the last listener is unsubscribed.
this . onHasSubscribersChange = null ;
2012-05-01 04:42:38 +08:00
} ,
2012-03-25 02:09:57 +08:00
channel = {
/ * *
* Calls the provided function only after all of the channels specified
2012-09-19 01:15:24 +08:00
* have been fired . All channels must be sticky channels .
2012-03-25 02:09:57 +08:00
* /
2012-09-19 01:15:24 +08:00
join : function ( h , c ) {
var len = c . length ,
i = len ,
f = function ( ) {
if ( ! ( -- i ) ) h ( ) ;
} ;
2012-03-25 02:09:57 +08:00
for ( var j = 0 ; j < len ; j ++ ) {
2012-09-19 01:15:24 +08:00
if ( c [ j ] . state == 0 ) {
throw Error ( 'Can only use join with sticky channels.' )
}
c [ j ] . subscribe ( f ) ;
2012-03-25 02:09:57 +08:00
}
2012-09-19 01:15:24 +08:00
if ( ! len ) h ( ) ;
2012-03-25 02:09:57 +08:00
} ,
2012-09-19 01:15:24 +08:00
create : function ( type ) {
return channel [ type ] = new Channel ( type , false ) ;
} ,
createSticky : function ( type ) {
return channel [ type ] = new Channel ( type , true ) ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* cordova Channels that must fire before "deviceready" is fired .
2012-04-24 02:37:33 +08:00
* /
2012-03-25 02:09:57 +08:00
deviceReadyChannelsArray : [ ] ,
deviceReadyChannelsMap : { } ,
2012-04-24 02:37:33 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Indicate that a feature needs to be initialized before it is ready to be used .
* This holds up Cordova ' s "deviceready" event until the feature has been initialized
* and Cordova . initComplete ( feature ) is called .
*
* @ param feature { String } The unique feature name
* /
waitForInitialization : function ( feature ) {
if ( feature ) {
2012-09-19 01:15:24 +08:00
var c = channel [ feature ] || this . createSticky ( feature ) ;
2012-03-25 02:09:57 +08:00
this . deviceReadyChannelsMap [ feature ] = c ;
this . deviceReadyChannelsArray . push ( c ) ;
}
} ,
/ * *
* Indicate that initialization code has completed and the feature is ready to be used .
*
* @ param feature { String } The unique feature name
* /
initializationComplete : function ( feature ) {
var c = this . deviceReadyChannelsMap [ feature ] ;
if ( c ) {
c . fire ( ) ;
2012-02-18 07:28:35 +08:00
}
}
2012-05-01 04:42:38 +08:00
} ;
function forceFunction ( f ) {
2012-09-19 01:15:24 +08:00
if ( typeof f != 'function' ) throw "Function required as first argument!" ;
2012-05-01 04:42:38 +08:00
}
2012-03-25 02:09:57 +08:00
/ * *
2012-04-24 02:37:33 +08:00
* Subscribes the given function to the channel . Any time that
2012-03-25 02:09:57 +08:00
* Channel . fire is called so too will the function .
* Optionally specify an execution context for the function
* and a guid that can be used to stop subscribing to the channel .
* Returns the guid .
* /
2012-09-19 01:15:24 +08:00
Channel . prototype . subscribe = function ( f , c ) {
2012-03-25 02:09:57 +08:00
// need a function to call
2012-05-01 04:42:38 +08:00
forceFunction ( f ) ;
2012-09-19 01:15:24 +08:00
if ( this . state == 2 ) {
f . apply ( c || this , this . fireArgs ) ;
return ;
}
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
var func = f ,
guid = f . observer _guid ;
2012-05-01 04:42:38 +08:00
if ( typeof c == "object" ) { func = utils . close ( c , f ) ; }
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
if ( ! guid ) {
2012-08-25 04:44:18 +08:00
// first time any channel has seen this subscriber
2012-09-19 01:15:24 +08:00
guid = '' + nextGuid ++ ;
2012-06-06 05:26:02 +08:00
}
2012-09-19 01:15:24 +08:00
func . observer _guid = guid ;
f . observer _guid = guid ;
2012-08-25 04:44:18 +08:00
// Don't add the same handler more than once.
2012-09-19 01:15:24 +08:00
if ( ! this . handlers [ guid ] ) {
this . handlers [ guid ] = func ;
2012-08-25 04:44:18 +08:00
this . numHandlers ++ ;
2012-09-19 01:15:24 +08:00
if ( this . numHandlers == 1 ) {
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
} ;
2012-04-24 02:37:33 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Unsubscribes the function with the given guid from the channel .
* /
2012-09-19 01:15:24 +08:00
Channel . prototype . unsubscribe = function ( f ) {
2012-03-25 02:09:57 +08:00
// need a function to unsubscribe
2012-09-19 01:15:24 +08:00
forceFunction ( f ) ;
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
var guid = f . observer _guid ,
handler = this . handlers [ guid ] ;
2012-05-11 06:50:02 +08:00
if ( handler ) {
2012-09-19 01:15:24 +08:00
delete this . handlers [ guid ] ;
2012-05-11 06:50:02 +08:00
this . numHandlers -- ;
2012-09-19 01:15:24 +08:00
if ( this . numHandlers == 0 ) {
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
}
2012-05-11 06:50:02 +08:00
}
2012-03-25 02:09:57 +08:00
} ;
2012-04-24 02:37:33 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Calls all functions subscribed to this channel .
* /
Channel . prototype . fire = function ( e ) {
2012-09-19 01:15:24 +08:00
var fail = false ,
fireArgs = Array . prototype . slice . call ( arguments ) ;
// Apply stickiness.
if ( this . state == 1 ) {
this . state = 2 ;
this . fireArgs = fireArgs ;
}
if ( this . numHandlers ) {
2012-08-25 04:44:18 +08:00
// Copy the values first so that it is safe to modify it from within
// callbacks.
var toCall = [ ] ;
2012-03-25 02:09:57 +08:00
for ( var item in this . handlers ) {
2012-08-25 04:44:18 +08:00
toCall . push ( this . handlers [ item ] ) ;
}
for ( var i = 0 ; i < toCall . length ; ++ i ) {
2012-09-19 01:15:24 +08:00
toCall [ i ] . apply ( this , fireArgs ) ;
}
if ( this . state == 2 && this . numHandlers ) {
this . numHandlers = 0 ;
this . handlers = { } ;
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
2012-03-25 02:09:57 +08:00
}
}
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-11 22:44:09 +08:00
// defining them here so they are ready super fast!
2012-03-25 02:09:57 +08:00
// DOM event that is received when the web page is loaded and parsed.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDOMContentLoaded' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate the Cordova native side is ready.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onNativeReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that device properties are available
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaInfoReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that the connection property has been set.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaConnectionReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that Cordova is ready
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDeviceReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate a resume lifecycle event
channel . create ( 'onResume' ) ;
// Event to indicate a pause lifecycle event
channel . create ( 'onPause' ) ;
// Event to indicate a destroy lifecycle event
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDestroy' ) ;
2012-03-25 02:09:57 +08:00
// Channels that must fire before "deviceready" is fired.
channel . waitForInitialization ( 'onCordovaReady' ) ;
channel . waitForInitialization ( 'onCordovaConnectionReady' ) ;
module . exports = channel ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/common.js
define ( "cordova/common" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
module . exports = {
objects : {
cordova : {
path : 'cordova' ,
children : {
exec : {
path : 'cordova/exec'
2012-05-25 00:31:11 +08:00
} ,
logger : {
path : 'cordova/plugin/logger'
2012-02-18 07:28:35 +08:00
}
}
} ,
2012-05-11 06:50:02 +08:00
Cordova : {
children : {
exec : {
path : 'cordova/exec'
}
}
} ,
2012-02-18 07:28:35 +08:00
navigator : {
children : {
notification : {
path : 'cordova/plugin/notification'
} ,
accelerometer : {
path : 'cordova/plugin/accelerometer'
} ,
battery : {
path : 'cordova/plugin/battery'
} ,
camera : {
path : 'cordova/plugin/Camera'
} ,
compass : {
path : 'cordova/plugin/compass'
} ,
2012-09-19 01:15:24 +08:00
connection : {
path : 'cordova/plugin/network'
} ,
2012-02-18 07:28:35 +08:00
contacts : {
path : 'cordova/plugin/contacts'
} ,
device : {
children : {
capture : {
path : 'cordova/plugin/capture'
}
}
} ,
geolocation : {
path : 'cordova/plugin/geolocation'
} ,
2012-09-20 02:08:52 +08:00
globalization : {
path : 'cordova/plugin/globalization'
} ,
2012-02-18 07:28:35 +08:00
network : {
children : {
connection : {
2012-09-19 01:15:24 +08:00
path : 'cordova/plugin/network' ,
deprecated : 'navigator.network.connection is deprecated. Use navigator.connection instead.'
2012-02-18 07:28:35 +08:00
}
}
2012-05-11 06:50:02 +08:00
} ,
splashscreen : {
path : 'cordova/plugin/splashscreen'
2012-02-18 07:28:35 +08:00
}
}
} ,
Acceleration : {
path : 'cordova/plugin/Acceleration'
} ,
Camera : {
path : 'cordova/plugin/CameraConstants'
} ,
2012-06-06 05:26:02 +08:00
CameraPopoverOptions : {
path : 'cordova/plugin/CameraPopoverOptions'
} ,
2012-02-18 07:28:35 +08:00
CaptureError : {
path : 'cordova/plugin/CaptureError'
} ,
CaptureAudioOptions : {
path : 'cordova/plugin/CaptureAudioOptions'
} ,
CaptureImageOptions : {
path : 'cordova/plugin/CaptureImageOptions'
} ,
CaptureVideoOptions : {
path : 'cordova/plugin/CaptureVideoOptions'
} ,
CompassHeading : {
path : 'cordova/plugin/CompassHeading'
} ,
CompassError : {
2012-03-06 04:11:24 +08:00
path : 'cordova/plugin/CompassError'
2012-02-18 07:28:35 +08:00
} ,
ConfigurationData : {
path : 'cordova/plugin/ConfigurationData'
} ,
Connection : {
path : 'cordova/plugin/Connection'
} ,
Contact : {
path : 'cordova/plugin/Contact'
} ,
ContactAddress : {
path : 'cordova/plugin/ContactAddress'
} ,
ContactError : {
path : 'cordova/plugin/ContactError'
} ,
ContactField : {
path : 'cordova/plugin/ContactField'
} ,
ContactFindOptions : {
path : 'cordova/plugin/ContactFindOptions'
} ,
ContactName : {
path : 'cordova/plugin/ContactName'
} ,
ContactOrganization : {
path : 'cordova/plugin/ContactOrganization'
} ,
Coordinates : {
path : 'cordova/plugin/Coordinates'
} ,
2012-07-13 04:37:08 +08:00
device : {
path : 'cordova/plugin/device'
} ,
2012-02-18 07:28:35 +08:00
DirectoryEntry : {
path : 'cordova/plugin/DirectoryEntry'
} ,
DirectoryReader : {
path : 'cordova/plugin/DirectoryReader'
} ,
Entry : {
path : 'cordova/plugin/Entry'
} ,
File : {
path : 'cordova/plugin/File'
} ,
FileEntry : {
path : 'cordova/plugin/FileEntry'
} ,
FileError : {
path : 'cordova/plugin/FileError'
} ,
FileReader : {
path : 'cordova/plugin/FileReader'
} ,
FileSystem : {
path : 'cordova/plugin/FileSystem'
} ,
FileTransfer : {
path : 'cordova/plugin/FileTransfer'
} ,
FileTransferError : {
path : 'cordova/plugin/FileTransferError'
} ,
FileUploadOptions : {
path : 'cordova/plugin/FileUploadOptions'
} ,
FileUploadResult : {
path : 'cordova/plugin/FileUploadResult'
} ,
FileWriter : {
path : 'cordova/plugin/FileWriter'
} ,
Flags : {
path : 'cordova/plugin/Flags'
} ,
2012-09-20 02:08:52 +08:00
GlobalizationError : {
path : 'cordova/plugin/GlobalizationError'
} ,
2012-02-18 07:28:35 +08:00
LocalFileSystem : {
path : 'cordova/plugin/LocalFileSystem'
} ,
Media : {
path : 'cordova/plugin/Media'
} ,
MediaError : {
path : 'cordova/plugin/MediaError'
} ,
MediaFile : {
path : 'cordova/plugin/MediaFile'
} ,
MediaFileData : {
path : 'cordova/plugin/MediaFileData'
} ,
Metadata : {
path : 'cordova/plugin/Metadata'
} ,
Position : {
path : 'cordova/plugin/Position'
} ,
PositionError : {
path : 'cordova/plugin/PositionError'
} ,
ProgressEvent : {
path : 'cordova/plugin/ProgressEvent'
} ,
requestFileSystem : {
path : 'cordova/plugin/requestFileSystem'
} ,
resolveLocalFileSystemURI : {
path : 'cordova/plugin/resolveLocalFileSystemURI'
}
}
} ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/exec.js
define ( "cordova/exec" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Execute a cordova command . It is up to the native side whether this action
* is synchronous or asynchronous . The native side can return :
* Synchronous : PluginResult object as a JSON string
* Asynchrounous : Empty string ""
* If async , the native side will cordova . callbackSuccess or cordova . callbackError ,
* depending upon the result of the action .
*
* @ param { Function } success The success callback
* @ param { Function } fail The fail callback
* @ param { String } service The name of the service to use
* @ param { String } action Action to be run in cordova
* @ param { String [ ] } [ args ] Zero or more arguments to pass to the method
* /
2012-08-22 21:50:40 +08:00
var cordova = require ( 'cordova' ) ,
callback = require ( 'cordova/plugin/android/callback' ) ,
polling = require ( 'cordova/plugin/android/polling' ) ,
2012-09-19 01:15:24 +08:00
nativeApiProvider = require ( 'cordova/plugin/android/nativeapiprovider' ) ,
2012-08-22 21:50:40 +08:00
jsToNativeBridgeMode ,
nativeToJsBridgeMode ,
jsToNativeModes = {
PROMPT : 0 ,
JS _OBJECT : 1 ,
2012-08-25 04:44:18 +08:00
// This mode is currently for benchmarking purposes only. It must be enabled
// on the native side through the ENABLE_LOCATION_CHANGE_EXEC_MODE
// constant within CordovaWebViewClient.java before it will work.
LOCATION _CHANGE : 2
2012-08-22 21:50:40 +08:00
} ,
nativeToJsModes = {
2012-09-19 01:15:24 +08:00
// Polls for messages using the JS->Native bridge.
2012-08-22 21:50:40 +08:00
POLLING : 0 ,
// Does an XHR to a local server, which will send back messages. This is
// broken on ICS when a proxy server is configured.
HANGING _GET : 1 ,
// For LOAD_URL to be viable, it would need to have a work-around for
// the bug where the soft-keyboard gets dismissed when a message is sent.
LOAD _URL : 2 ,
// For the ONLINE_EVENT to be viable, it would need to intercept all event
// listeners (both through addEventListener and window.ononline) as well
// as set the navigator property itself.
ONLINE _EVENT : 3 ,
// Uses reflection to access private APIs of the WebView that can send JS
// to be executed.
// Requires Android 3.2.4 or above.
PRIVATE _API : 4
} ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
function androidExec ( success , fail , service , action , args ) {
2012-08-25 04:44:18 +08:00
// Set default bridge modes if they have not already been set.
if ( jsToNativeBridgeMode === undefined ) {
androidExec . setJsToNativeBridgeMode ( jsToNativeModes . PROMPT ) ;
}
if ( nativeToJsBridgeMode === undefined ) {
if ( callback . isAvailable ( ) ) {
androidExec . setNativeToJsBridgeMode ( nativeToJsModes . HANGING _GET ) ;
} else {
androidExec . setNativeToJsBridgeMode ( nativeToJsModes . POLLING ) ;
}
}
2012-09-19 01:15:24 +08:00
var callbackId = service + cordova . callbackId ++ ,
argsJson = JSON . stringify ( args ) ;
if ( success || fail ) {
cordova . callbacks [ callbackId ] = { success : success , fail : fail } ;
}
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
if ( jsToNativeBridgeMode == jsToNativeModes . LOCATION _CHANGE ) {
window . location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson ;
} else {
var messages = nativeApiProvider . get ( ) . exec ( service , action , callbackId , argsJson ) ;
// Explicit cast to string is required on Android 2.1 to convert from
// a Java string to a JS string.
if ( messages ) {
messages = String ( messages ) ;
}
androidExec . processMessages ( messages ) ;
2012-08-22 21:50:40 +08:00
}
2012-09-01 04:44:53 +08:00
}
2012-08-22 21:50:40 +08:00
2012-09-19 01:15:24 +08:00
function hookOnlineApis ( ) {
function proxyEvent ( e ) {
cordova . fireWindowEvent ( e . type ) ;
}
// The network module takes care of firing online and offline events.
// It currently fires them only on document though, so we bridge them
// to window here (while first listening for exec()-releated online/offline
// events).
window . addEventListener ( 'online' , polling . pollOnce , false ) ;
window . addEventListener ( 'offline' , polling . pollOnce , false ) ;
cordova . addWindowEventHandler ( 'online' ) ;
cordova . addWindowEventHandler ( 'offline' ) ;
document . addEventListener ( 'online' , proxyEvent , false ) ;
document . addEventListener ( 'offline' , proxyEvent , false ) ;
2012-08-22 21:50:40 +08:00
}
2012-09-19 01:15:24 +08:00
hookOnlineApis ( ) ;
2012-08-22 21:50:40 +08:00
androidExec . jsToNativeModes = jsToNativeModes ;
androidExec . nativeToJsModes = nativeToJsModes ;
androidExec . setJsToNativeBridgeMode = function ( mode ) {
2012-09-19 01:15:24 +08:00
if ( mode == jsToNativeModes . JS _OBJECT && ! window . _cordovaNative ) {
console . log ( 'Falling back on PROMPT mode since _cordovaNative is missing.' ) ;
2012-08-22 21:50:40 +08:00
mode = jsToNativeModes . PROMPT ;
}
2012-09-19 01:15:24 +08:00
nativeApiProvider . setPreferPrompt ( mode == jsToNativeModes . PROMPT ) ;
2012-08-22 21:50:40 +08:00
jsToNativeBridgeMode = mode ;
} ;
androidExec . setNativeToJsBridgeMode = function ( mode ) {
if ( mode == nativeToJsBridgeMode ) {
return ;
}
if ( nativeToJsBridgeMode == nativeToJsModes . POLLING ) {
polling . stop ( ) ;
} else if ( nativeToJsBridgeMode == nativeToJsModes . HANGING _GET ) {
callback . stop ( ) ;
}
nativeToJsBridgeMode = mode ;
// Tell the native side to switch modes.
2012-09-19 01:15:24 +08:00
nativeApiProvider . get ( ) . setNativeToJsBridgeMode ( mode ) ;
2012-08-22 21:50:40 +08:00
if ( mode == nativeToJsModes . POLLING ) {
polling . start ( ) ;
} else if ( mode == nativeToJsModes . HANGING _GET ) {
callback . start ( ) ;
2012-09-19 01:15:24 +08:00
}
} ;
// Processes a single message, as encoded by NativeToJsMessageQueue.java.
function processMessage ( message ) {
try {
var firstChar = message . charAt ( 0 ) ;
if ( firstChar == 'J' ) {
eval ( message . slice ( 1 ) ) ;
} else if ( firstChar == 'S' || firstChar == 'F' ) {
var success = firstChar == 'S' ;
var keepCallback = message . charAt ( 1 ) == '1' ;
var spaceIdx = message . indexOf ( ' ' , 2 ) ;
var status = + message . slice ( 2 , spaceIdx ) ;
var nextSpaceIdx = message . indexOf ( ' ' , spaceIdx + 1 ) ;
var callbackId = message . slice ( spaceIdx + 1 , nextSpaceIdx ) ;
var payloadKind = message . charAt ( nextSpaceIdx + 1 ) ;
var payload ;
if ( payloadKind == 's' ) {
payload = message . slice ( nextSpaceIdx + 2 ) ;
} else if ( payloadKind == 't' ) {
payload = true ;
} else if ( payloadKind == 'f' ) {
payload = false ;
} else if ( payloadKind == 'n' ) {
payload = + message . slice ( nextSpaceIdx + 2 ) ;
} else {
payload = JSON . parse ( message . slice ( nextSpaceIdx + 1 ) ) ;
}
cordova . callbackFromNative ( callbackId , success , status , payload , keepCallback ) ;
} else {
console . log ( "processMessage failed: invalid message:" + message ) ;
}
} catch ( e ) {
console . log ( "processMessage failed: Message: " + message ) ;
console . log ( "processMessage failed: Error: " + e ) ;
console . log ( "processMessage failed: Stack: " + e . stack ) ;
}
}
// This is called from the NativeToJsMessageQueue.java.
androidExec . processMessages = function ( messages ) {
while ( messages ) {
if ( messages == '*' ) {
window . setTimeout ( polling . pollOnce , 0 ) ;
break ;
}
var spaceIdx = messages . indexOf ( ' ' ) ;
var msgLen = + messages . slice ( 0 , spaceIdx ) ;
var message = messages . substr ( spaceIdx + 1 , msgLen ) ;
messages = messages . slice ( spaceIdx + msgLen + 1 ) ;
processMessage ( message ) ;
2012-08-22 21:50:40 +08:00
}
} ;
module . exports = androidExec ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/platform.js
define ( "cordova/platform" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
module . exports = {
id : "android" ,
initialize : function ( ) {
var channel = require ( "cordova/channel" ) ,
cordova = require ( 'cordova' ) ,
exec = require ( 'cordova/exec' ) ;
// Inject a listener for the backbutton on the document.
2012-09-19 01:15:24 +08:00
var backButtonChannel = cordova . addDocumentEventHandler ( 'backbutton' ) ;
backButtonChannel . onHasSubscribersChange = function ( ) {
// If we just attached the first handler or detached the last handler,
// let native know we need to override the back button.
exec ( null , null , "App" , "overrideBackbutton" , [ this . numHandlers == 1 ] ) ;
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Add hardware MENU and SEARCH button handlers
cordova . addDocumentEventHandler ( 'menubutton' ) ;
cordova . addDocumentEventHandler ( 'searchbutton' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Figure out if we need to shim-in localStorage and WebSQL
// support from the native side.
var storage = require ( 'cordova/plugin/android/storage' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// First patch WebSQL if necessary
if ( typeof window . openDatabase == 'undefined' ) {
// Not defined, create an openDatabase function for all to use!
window . openDatabase = storage . openDatabase ;
} else {
// Defined, but some Android devices will throw a SECURITY_ERR -
// so we wrap the whole thing in a try-catch and shim in our own
// if the device has Android bug 16175.
var originalOpenDatabase = window . openDatabase ;
window . openDatabase = function ( name , version , desc , size ) {
var db = null ;
try {
db = originalOpenDatabase ( name , version , desc , size ) ;
2012-04-24 02:37:33 +08:00
}
2012-03-25 02:09:57 +08:00
catch ( ex ) {
2012-04-18 03:20:23 +08:00
if ( ex . code === 18 ) {
db = null ;
} else {
throw ex ;
}
2012-03-25 02:09:57 +08:00
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
if ( db === null ) {
return storage . openDatabase ( name , version , desc , size ) ;
}
else {
return db ;
}
2012-04-24 02:37:33 +08:00
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
// Patch localStorage if necessary
if ( typeof window . localStorage == 'undefined' || window . localStorage === null ) {
2012-06-06 05:26:02 +08:00
window . localStorage = new storage . CupcakeLocalStorage ( ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
// Let native code know we are all done on the JS side.
// Native code will then un-hide the WebView.
channel . join ( function ( ) {
2012-07-13 04:37:08 +08:00
exec ( null , null , "App" , "show" , [ ] ) ;
2012-03-25 02:09:57 +08:00
} , [ channel . onCordovaReady ] ) ;
} ,
objects : {
cordova : {
children : {
JSCallback : {
path : "cordova/plugin/android/callback"
} ,
JSCallbackPolling : {
path : "cordova/plugin/android/polling"
}
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
} ,
navigator : {
children : {
app : {
path : "cordova/plugin/android/app"
}
}
} ,
File : { // exists natively on Android WebView, override
path : "cordova/plugin/File"
} ,
FileReader : { // exists natively on Android WebView, override
path : "cordova/plugin/FileReader"
} ,
FileError : { //exists natively on Android WebView on Android 4.x
path : "cordova/plugin/FileError"
} ,
MediaError : { // exists natively on Android WebView on Android 4.x
path : "cordova/plugin/MediaError"
}
2012-03-29 04:47:45 +08:00
} ,
merges : {
2012-07-13 04:37:08 +08:00
device : {
path : 'cordova/plugin/android/device'
} ,
2012-03-29 04:47:45 +08:00
navigator : {
children : {
notification : {
path : 'cordova/plugin/android/notification'
}
}
}
2012-02-18 07:28:35 +08:00
}
} ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Acceleration.js
define ( "cordova/plugin/Acceleration" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-11 22:44:09 +08:00
var Acceleration = function ( x , y , z , timestamp ) {
2012-05-15 04:04:07 +08:00
this . x = x ;
this . y = y ;
this . z = z ;
this . timestamp = timestamp || ( new Date ( ) ) . getTime ( ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Acceleration ;
2012-05-15 04:04:07 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Camera.js
define ( "cordova/plugin/Camera" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
Camera = require ( 'cordova/plugin/CameraConstants' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
var cameraExport = { } ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Tack on the Camera Constants to the base camera plugin.
for ( var key in Camera ) {
cameraExport [ key ] = Camera [ key ] ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Gets a picture from source defined by "options.sourceType" , and returns the
* image as defined by the "options.destinationType" option .
2012-02-18 07:28:35 +08:00
2012-05-25 00:31:11 +08:00
* The defaults are sourceType = CAMERA and destinationType = FILE _URI .
2012-03-25 02:09:57 +08:00
*
* @ param { Function } successCallback
* @ param { Function } errorCallback
* @ param { Object } options
* /
cameraExport . getPicture = function ( successCallback , errorCallback , options ) {
// successCallback required
if ( typeof successCallback != "function" ) {
console . log ( "Camera Error: successCallback is not a function" ) ;
return ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// errorCallback optional
if ( errorCallback && ( typeof errorCallback != "function" ) ) {
console . log ( "Camera Error: errorCallback is not a function" ) ;
return ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
var quality = 50 ;
if ( options && typeof options . quality == "number" ) {
quality = options . quality ;
} else if ( options && typeof options . quality == "string" ) {
var qlity = parseInt ( options . quality , 10 ) ;
if ( isNaN ( qlity ) === false ) {
quality = qlity . valueOf ( ) ;
}
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
var destinationType = Camera . DestinationType . FILE _URI ;
if ( typeof options . destinationType == "number" ) {
destinationType = options . destinationType ;
}
2012-02-18 07:28:35 +08:00
2012-03-02 04:57:21 +08:00
var sourceType = Camera . PictureSourceType . CAMERA ;
if ( typeof options . sourceType == "number" ) {
sourceType = options . sourceType ;
}
var targetWidth = - 1 ;
if ( typeof options . targetWidth == "number" ) {
targetWidth = options . targetWidth ;
} else if ( typeof options . targetWidth == "string" ) {
var width = parseInt ( options . targetWidth , 10 ) ;
if ( isNaN ( width ) === false ) {
targetWidth = width . valueOf ( ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-02 04:57:21 +08:00
}
2012-02-18 07:28:35 +08:00
2012-03-02 04:57:21 +08:00
var targetHeight = - 1 ;
if ( typeof options . targetHeight == "number" ) {
targetHeight = options . targetHeight ;
} else if ( typeof options . targetHeight == "string" ) {
var height = parseInt ( options . targetHeight , 10 ) ;
if ( isNaN ( height ) === false ) {
targetHeight = height . valueOf ( ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-02 04:57:21 +08:00
}
2012-02-18 07:28:35 +08:00
2012-03-02 04:57:21 +08:00
var encodingType = Camera . EncodingType . JPEG ;
if ( typeof options . encodingType == "number" ) {
encodingType = options . encodingType ;
2012-02-18 07:28:35 +08:00
}
2012-04-24 02:37:33 +08:00
2012-04-04 01:09:31 +08:00
var mediaType = Camera . MediaType . PICTURE ;
if ( typeof options . mediaType == "number" ) {
mediaType = options . mediaType ;
}
2012-04-10 08:11:13 +08:00
var allowEdit = false ;
if ( typeof options . allowEdit == "boolean" ) {
2012-04-24 02:37:33 +08:00
allowEdit = options . allowEdit ;
2012-04-10 08:11:13 +08:00
} else if ( typeof options . allowEdit == "number" ) {
2012-04-24 02:37:33 +08:00
allowEdit = options . allowEdit <= 0 ? false : true ;
2012-04-10 08:11:13 +08:00
}
var correctOrientation = false ;
if ( typeof options . correctOrientation == "boolean" ) {
2012-04-24 02:37:33 +08:00
correctOrientation = options . correctOrientation ;
2012-04-10 08:11:13 +08:00
} else if ( typeof options . correctOrientation == "number" ) {
2012-04-24 02:37:33 +08:00
correctOrientation = options . correctOrientation <= 0 ? false : true ;
2012-04-10 08:11:13 +08:00
}
var saveToPhotoAlbum = false ;
2012-04-24 02:37:33 +08:00
if ( typeof options . saveToPhotoAlbum == "boolean" ) {
saveToPhotoAlbum = options . saveToPhotoAlbum ;
2012-04-10 08:11:13 +08:00
} else if ( typeof options . saveToPhotoAlbum == "number" ) {
2012-04-24 02:37:33 +08:00
saveToPhotoAlbum = options . saveToPhotoAlbum <= 0 ? false : true ;
2012-04-10 08:11:13 +08:00
}
2012-06-06 05:26:02 +08:00
var popoverOptions = null ;
if ( typeof options . popoverOptions == "object" ) {
popoverOptions = options . popoverOptions ;
}
2012-03-02 04:57:21 +08:00
2012-07-14 06:46:09 +08:00
var args = [ quality , destinationType , sourceType , targetWidth , targetHeight , encodingType ,
mediaType , allowEdit , correctOrientation , saveToPhotoAlbum , popoverOptions ] ;
exec ( successCallback , errorCallback , "Camera" , "takePicture" , args ) ;
2012-04-24 02:37:33 +08:00
} ;
2012-03-02 04:57:21 +08:00
2012-06-09 07:25:09 +08:00
cameraExport . cleanup = function ( successCallback , errorCallback ) {
exec ( successCallback , errorCallback , "Camera" , "cleanup" , [ ] ) ;
2012-06-22 02:12:30 +08:00
} ;
2012-06-09 07:25:09 +08:00
2012-03-02 04:57:21 +08:00
module . exports = cameraExport ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CameraConstants.js
define ( "cordova/plugin/CameraConstants" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
module . exports = {
DestinationType : {
DATA _URL : 0 , // Return base64 encoded string
FILE _URI : 1 // Return file uri (content://media/external/images/media/2 for Android)
} ,
EncodingType : {
JPEG : 0 , // Return JPEG encoded image
PNG : 1 // Return PNG encoded image
} ,
MediaType : {
PICTURE : 0 , // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
VIDEO : 1 , // allow selection of video only, ONLY RETURNS URL
ALLMEDIA : 2 // allow selection from all media types
} ,
PictureSourceType : {
PHOTOLIBRARY : 0 , // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
CAMERA : 1 , // Take picture from camera
SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android)
2012-06-06 05:26:02 +08:00
} ,
PopoverArrowDirection : {
ARROW _UP : 1 , // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
ARROW _DOWN : 2 ,
ARROW _LEFT : 4 ,
ARROW _RIGHT : 8 ,
ARROW _ANY : 15
2012-02-18 07:28:35 +08:00
}
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-06-06 05:26:02 +08:00
// file: lib/common/plugin/CameraPopoverOptions.js
define ( "cordova/plugin/CameraPopoverOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-06-06 05:26:02 +08:00
var Camera = require ( 'cordova/plugin/CameraConstants' ) ;
/ * *
* Encapsulates options for iOS Popover image picker
* /
var CameraPopoverOptions = function ( x , y , width , height , arrowDir ) {
// information of rectangle that popover should be anchored to
this . x = x || 0 ;
this . y = y || 32 ;
this . width = width || 320 ;
this . height = height || 480 ;
// The direction of the popover arrow
this . arrowDir = arrowDir || Camera . PopoverArrowDirection . ARROW _ANY ;
} ;
module . exports = CameraPopoverOptions ;
2012-09-19 01:15:24 +08:00
2012-06-06 05:26:02 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureAudioOptions.js
define ( "cordova/plugin/CaptureAudioOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Encapsulates all audio capture operation configuration options .
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
var CaptureAudioOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of sound clips user can record. Value must be equal or greater than 1.
this . limit = 1 ;
// Maximum duration of a single sound clip in seconds.
this . duration = 0 ;
// The selected audio mode. Must match with one of the elements in supportedAudioModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
2012-03-25 02:09:57 +08:00
module . exports = CaptureAudioOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureError.js
define ( "cordova/plugin/CaptureError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* The CaptureError interface encapsulates all errors in the Capture API .
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
var CaptureError = function ( c ) {
this . code = c || null ;
2012-02-18 07:28:35 +08:00
} ;
2012-04-24 02:37:33 +08:00
// Camera or microphone failed to capture image or sound.
2012-02-18 07:28:35 +08:00
CaptureError . CAPTURE _INTERNAL _ERR = 0 ;
// Camera application or audio capture application is currently serving other capture request.
CaptureError . CAPTURE _APPLICATION _BUSY = 1 ;
// Invalid use of the API (e.g. limit parameter has value less than one).
CaptureError . CAPTURE _INVALID _ARGUMENT = 2 ;
// User exited camera application or audio capture application before capturing anything.
CaptureError . CAPTURE _NO _MEDIA _FILES = 3 ;
// The requested capture operation is not supported.
CaptureError . CAPTURE _NOT _SUPPORTED = 20 ;
module . exports = CaptureError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureImageOptions.js
define ( "cordova/plugin/CaptureImageOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates all image capture operation configuration options .
* /
var CaptureImageOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of images user can take. Value must be equal or greater than 1.
this . limit = 1 ;
// The selected image mode. Must match with one of the elements in supportedImageModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CaptureImageOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureVideoOptions.js
define ( "cordova/plugin/CaptureVideoOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates all video capture operation configuration options .
* /
var CaptureVideoOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of videos user can record. Value must be equal or greater than 1.
this . limit = 1 ;
// Maximum duration of a single video clip in seconds.
this . duration = 0 ;
// The selected video mode. Must match with one of the elements in supportedVideoModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CaptureVideoOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CompassError.js
define ( "cordova/plugin/CompassError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-06 04:11:24 +08:00
/ * *
* CompassError .
* An error code assigned by an implementation when an error has occured
* @ constructor
* /
var CompassError = function ( err ) {
2012-03-10 04:32:22 +08:00
this . code = ( err !== undefined ? err : null ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-03-06 04:11:24 +08:00
CompassError . COMPASS _INTERNAL _ERR = 0 ;
CompassError . COMPASS _NOT _SUPPORTED = 20 ;
module . exports = CompassError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CompassHeading.js
define ( "cordova/plugin/CompassHeading" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-06 04:11:24 +08:00
var CompassHeading = function ( magneticHeading , trueHeading , headingAccuracy , timestamp ) {
2012-03-10 04:32:22 +08:00
this . magneticHeading = ( magneticHeading !== undefined ? magneticHeading : null ) ;
this . trueHeading = ( trueHeading !== undefined ? trueHeading : null ) ;
this . headingAccuracy = ( headingAccuracy !== undefined ? headingAccuracy : null ) ;
2012-04-10 08:11:13 +08:00
this . timestamp = ( timestamp !== undefined ? timestamp : new Date ( ) . getTime ( ) ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CompassHeading ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ConfigurationData.js
define ( "cordova/plugin/ConfigurationData" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates a set of parameters that the capture device supports .
* /
function ConfigurationData ( ) {
2012-04-24 02:37:33 +08:00
// The ASCII-encoded string in lower case representing the media type.
this . type = null ;
// The height attribute represents height of the image or video in pixels.
// In the case of a sound clip this attribute has value 0.
2012-02-18 07:28:35 +08:00
this . height = 0 ;
2012-04-24 02:37:33 +08:00
// The width attribute represents width of the image or video in pixels.
2012-02-18 07:28:35 +08:00
// In the case of a sound clip this attribute has value 0
this . width = 0 ;
}
module . exports = ConfigurationData ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Connection.js
define ( "cordova/plugin/Connection" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Network status
* /
module . exports = {
2012-04-24 02:37:33 +08:00
UNKNOWN : "unknown" ,
ETHERNET : "ethernet" ,
WIFI : "wifi" ,
CELL _2G : "2g" ,
CELL _3G : "3g" ,
CELL _4G : "4g" ,
NONE : "none"
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Contact.js
define ( "cordova/plugin/Contact" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
ContactError = require ( 'cordova/plugin/ContactError' ) ,
utils = require ( 'cordova/utils' ) ;
2012-03-25 02:09:57 +08:00
/ * *
* Converts primitives into Complex Object
* Currently only used for Date fields
* /
function convertIn ( contact ) {
var value = contact . birthday ;
try {
contact . birthday = new Date ( parseFloat ( value ) ) ;
} catch ( exception ) {
console . log ( "Cordova Contact convertIn error: exception creating date." ) ;
}
return contact ;
2012-04-24 02:37:33 +08:00
}
2012-03-25 02:09:57 +08:00
/ * *
* Converts Complex objects into primitives
* Only conversion at present is for Dates .
* * /
function convertOut ( contact ) {
var value = contact . birthday ;
2012-04-24 02:37:33 +08:00
if ( value !== null ) {
2012-03-25 02:09:57 +08:00
// try to make it a Date object if it is not already
2012-05-01 04:42:38 +08:00
if ( ! utils . isDate ( value ) ) {
2012-03-25 02:09:57 +08:00
try {
value = new Date ( value ) ;
} catch ( exception ) {
value = null ;
}
}
2012-05-01 04:42:38 +08:00
if ( utils . isDate ( value ) ) {
2012-03-25 02:09:57 +08:00
value = value . valueOf ( ) ; // convert to milliseconds
}
contact . birthday = value ;
}
return contact ;
2012-04-24 02:37:33 +08:00
}
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contains information about a single contact .
* @ constructor
* @ param { DOMString } id unique identifier
* @ param { DOMString } displayName
* @ param { ContactName } name
* @ param { DOMString } nickname
* @ param { Array . < ContactField > } phoneNumbers array of phone numbers
* @ param { Array . < ContactField > } emails array of email addresses
* @ param { Array . < ContactAddress > } addresses array of addresses
* @ param { Array . < ContactField > } ims instant messaging user ids
* @ param { Array . < ContactOrganization > } organizations
* @ param { DOMString } birthday contact ' s birthday
* @ param { DOMString } note user notes about contact
* @ param { Array . < ContactField > } photos
* @ param { Array . < ContactField > } categories
* @ param { Array . < ContactField > } urls contact ' s web sites
* /
var Contact = function ( id , displayName , name , nickname , phoneNumbers , emails , addresses ,
ims , organizations , birthday , note , photos , categories , urls ) {
this . id = id || null ;
this . rawId = null ;
this . displayName = displayName || null ;
this . name = name || null ; // ContactName
this . nickname = nickname || null ;
2012-03-25 02:09:57 +08:00
this . phoneNumbers = phoneNumbers || null ; // ContactField[]
this . emails = emails || null ; // ContactField[]
this . addresses = addresses || null ; // ContactAddress[]
this . ims = ims || null ; // ContactField[]
this . organizations = organizations || null ; // ContactOrganization[]
2012-02-18 07:28:35 +08:00
this . birthday = birthday || null ;
this . note = note || null ;
2012-03-25 02:09:57 +08:00
this . photos = photos || null ; // ContactField[]
this . categories = categories || null ; // ContactField[]
this . urls = urls || null ; // ContactField[]
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Removes contact from device storage .
* @ param successCB success callback
* @ param errorCB error callback
* /
Contact . prototype . remove = function ( successCB , errorCB ) {
2012-03-25 02:09:57 +08:00
var fail = function ( code ) {
errorCB ( new ContactError ( code ) ) ;
} ;
2012-02-18 07:28:35 +08:00
if ( this . id === null ) {
2012-03-25 02:09:57 +08:00
fail ( ContactError . UNKNOWN _ERROR ) ;
2012-02-18 07:28:35 +08:00
}
else {
2012-03-25 02:09:57 +08:00
exec ( successCB , fail , "Contacts" , "remove" , [ this . id ] ) ;
2012-02-18 07:28:35 +08:00
}
} ;
/ * *
* Creates a deep copy of this Contact .
* With the contact ID set to null .
* @ return copy of this Contact
* /
Contact . prototype . clone = function ( ) {
var clonedContact = utils . clone ( this ) ;
var i ;
clonedContact . id = null ;
clonedContact . rawId = null ;
// Loop through and clear out any id's in phones, emails, etc.
if ( clonedContact . phoneNumbers ) {
for ( i = 0 ; i < clonedContact . phoneNumbers . length ; i ++ ) {
clonedContact . phoneNumbers [ i ] . id = null ;
}
}
if ( clonedContact . emails ) {
for ( i = 0 ; i < clonedContact . emails . length ; i ++ ) {
clonedContact . emails [ i ] . id = null ;
}
}
if ( clonedContact . addresses ) {
for ( i = 0 ; i < clonedContact . addresses . length ; i ++ ) {
clonedContact . addresses [ i ] . id = null ;
}
}
if ( clonedContact . ims ) {
for ( i = 0 ; i < clonedContact . ims . length ; i ++ ) {
clonedContact . ims [ i ] . id = null ;
}
}
if ( clonedContact . organizations ) {
for ( i = 0 ; i < clonedContact . organizations . length ; i ++ ) {
clonedContact . organizations [ i ] . id = null ;
}
}
if ( clonedContact . categories ) {
for ( i = 0 ; i < clonedContact . categories . length ; i ++ ) {
clonedContact . categories [ i ] . id = null ;
}
}
if ( clonedContact . photos ) {
for ( i = 0 ; i < clonedContact . photos . length ; i ++ ) {
clonedContact . photos [ i ] . id = null ;
}
}
if ( clonedContact . urls ) {
for ( i = 0 ; i < clonedContact . urls . length ; i ++ ) {
clonedContact . urls [ i ] . id = null ;
}
}
return clonedContact ;
} ;
/ * *
* Persists contact to device storage .
* @ param successCB success callback
* @ param errorCB error callback
* /
Contact . prototype . save = function ( successCB , errorCB ) {
2012-03-25 02:09:57 +08:00
var fail = function ( code ) {
errorCB ( new ContactError ( code ) ) ;
} ;
2012-04-24 02:37:33 +08:00
var success = function ( result ) {
2012-03-25 02:09:57 +08:00
if ( result ) {
if ( typeof successCB === 'function' ) {
var fullContact = require ( 'cordova/plugin/contacts' ) . create ( result ) ;
successCB ( convertIn ( fullContact ) ) ;
}
}
else {
// no Entry object returned
fail ( ContactError . UNKNOWN _ERROR ) ;
}
} ;
2012-04-24 02:37:33 +08:00
var dupContact = convertOut ( utils . clone ( this ) ) ;
exec ( success , fail , "Contacts" , "save" , [ dupContact ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Contact ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactAddress.js
define ( "cordova/plugin/ContactAddress" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact address .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code
* @ param formatted // NOTE: not a W3C standard
* @ param streetAddress
* @ param locality
* @ param region
* @ param postalCode
* @ param country
* /
var ContactAddress = function ( pref , type , formatted , streetAddress , locality , region , postalCode , country ) {
this . id = null ;
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
this . type = type || null ;
this . formatted = formatted || null ;
this . streetAddress = streetAddress || null ;
this . locality = locality || null ;
this . region = region || null ;
this . postalCode = postalCode || null ;
this . country = country || null ;
} ;
module . exports = ContactAddress ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactError.js
define ( "cordova/plugin/ContactError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* ContactError .
* An error code assigned by an implementation when an error has occured
* @ constructor
* /
var ContactError = function ( err ) {
this . code = ( typeof err != 'undefined' ? err : null ) ;
} ;
/ * *
* Error codes
* /
ContactError . UNKNOWN _ERROR = 0 ;
ContactError . INVALID _ARGUMENT _ERROR = 1 ;
ContactError . TIMEOUT _ERROR = 2 ;
ContactError . PENDING _OPERATION _ERROR = 3 ;
ContactError . IO _ERROR = 4 ;
ContactError . NOT _SUPPORTED _ERROR = 5 ;
ContactError . PERMISSION _DENIED _ERROR = 20 ;
module . exports = ContactError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactField.js
define ( "cordova/plugin/ContactField" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Generic contact field .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code // NOTE: not a W3C standard
* @ param type
* @ param value
* @ param pref
* /
var ContactField = function ( type , value , pref ) {
this . id = null ;
2012-05-01 04:42:38 +08:00
this . type = ( type && type . toString ( ) ) || null ;
this . value = ( value && value . toString ( ) ) || null ;
2012-02-18 07:28:35 +08:00
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
} ;
module . exports = ContactField ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactFindOptions.js
define ( "cordova/plugin/ContactFindOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* ContactFindOptions .
* @ constructor
* @ param filter used to match contacts against
* @ param multiple boolean used to determine if more than one contact should be returned
* /
var ContactFindOptions = function ( filter , multiple ) {
this . filter = filter || '' ;
this . multiple = ( typeof multiple != 'undefined' ? multiple : false ) ;
} ;
module . exports = ContactFindOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactName.js
define ( "cordova/plugin/ContactName" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact name .
* @ constructor
* @ param formatted // NOTE: not part of W3C standard
* @ param familyName
* @ param givenName
* @ param middle
* @ param prefix
* @ param suffix
* /
var ContactName = function ( formatted , familyName , givenName , middle , prefix , suffix ) {
this . formatted = formatted || null ;
this . familyName = familyName || null ;
this . givenName = givenName || null ;
this . middleName = middle || null ;
this . honorificPrefix = prefix || null ;
this . honorificSuffix = suffix || null ;
} ;
module . exports = ContactName ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactOrganization.js
define ( "cordova/plugin/ContactOrganization" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact organization .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code // NOTE: not a W3C standard
* @ param name
* @ param dept
* @ param title
* @ param startDate
* @ param endDate
* @ param location
* @ param desc
* /
var ContactOrganization = function ( pref , type , name , dept , title ) {
this . id = null ;
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
this . type = type || null ;
this . name = name || null ;
this . department = dept || null ;
this . title = title || null ;
} ;
module . exports = ContactOrganization ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Coordinates.js
define ( "cordova/plugin/Coordinates" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* This class contains position information .
* @ param { Object } lat
* @ param { Object } lng
* @ param { Object } alt
* @ param { Object } acc
* @ param { Object } head
* @ param { Object } vel
* @ param { Object } altacc
* @ constructor
* /
var Coordinates = function ( lat , lng , alt , acc , head , vel , altacc ) {
/ * *
* The latitude of the position .
* /
this . latitude = lat ;
/ * *
* The longitude of the position ,
* /
this . longitude = lng ;
/ * *
* The accuracy of the position .
* /
this . accuracy = acc ;
/ * *
* The altitude of the position .
* /
2012-05-11 06:50:02 +08:00
this . altitude = ( alt !== undefined ? alt : null ) ;
2012-02-18 07:28:35 +08:00
/ * *
* The direction the device is moving at the position .
* /
2012-05-11 06:50:02 +08:00
this . heading = ( head !== undefined ? head : null ) ;
2012-02-18 07:28:35 +08:00
/ * *
* The velocity with which the device is moving at the position .
* /
2012-05-11 06:50:02 +08:00
this . speed = ( vel !== undefined ? vel : null ) ;
if ( this . speed === 0 || this . speed === null ) {
this . heading = NaN ;
}
2012-02-18 07:28:35 +08:00
/ * *
* The altitude accuracy of the position .
* /
this . altitudeAccuracy = ( altacc !== undefined ) ? altacc : null ;
} ;
module . exports = Coordinates ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/DirectoryEntry.js
define ( "cordova/plugin/DirectoryEntry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
Entry = require ( 'cordova/plugin/Entry' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-02-18 07:28:35 +08:00
DirectoryReader = require ( 'cordova/plugin/DirectoryReader' ) ;
/ * *
* An interface representing a directory on the file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* { boolean } isFile always false ( readonly )
* { boolean } isDirectory always true ( readonly )
* { DOMString } name of the directory , excluding the path leading to it ( readonly )
* { DOMString } fullPath the absolute full path to the directory ( readonly )
2012-07-13 04:37:08 +08:00
* TODO : implement this ! ! ! { FileSystem } filesystem on which the directory resides ( readonly )
2012-02-18 07:28:35 +08:00
* /
var DirectoryEntry = function ( name , fullPath ) {
DirectoryEntry . _ _super _ _ . constructor . apply ( this , [ false , true , name , fullPath ] ) ;
} ;
utils . extend ( DirectoryEntry , Entry ) ;
/ * *
* Creates a new DirectoryReader to read entries from this directory
* /
DirectoryEntry . prototype . createReader = function ( ) {
return new DirectoryReader ( this . fullPath ) ;
} ;
/ * *
* Creates or looks up a directory
*
* @ param { DOMString } path either a relative or absolute path from this directory in which to look up or create a directory
* @ param { Flags } options to create or excluively create the directory
* @ param { Function } successCallback is called with the new entry
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . getDirectory = function ( path , options , successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var win = typeof successCallback !== 'function' ? null : function ( result ) {
2012-02-18 07:28:35 +08:00
var entry = new DirectoryEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2012-03-01 01:38:35 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-18 07:28:35 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "getDirectory" , [ this . fullPath , path , options ] ) ;
} ;
/ * *
* Deletes a directory and all of it ' s contents
*
* @ param { Function } successCallback is called with no parameters
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . removeRecursively = function ( successCallback , errorCallback ) {
2012-03-01 23:45:27 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( successCallback , fail , "File" , "removeRecursively" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Creates or looks up a file
*
* @ param { DOMString } path either a relative or absolute path from this directory in which to look up or create a file
* @ param { Flags } options to create or excluively create the file
* @ param { Function } successCallback is called with the new entry
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . getFile = function ( path , options , successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var win = typeof successCallback !== 'function' ? null : function ( result ) {
2012-02-18 07:28:35 +08:00
var FileEntry = require ( 'cordova/plugin/FileEntry' ) ;
var entry = new FileEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2012-03-01 01:38:35 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-18 07:28:35 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "getFile" , [ this . fullPath , path , options ] ) ;
} ;
module . exports = DirectoryEntry ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/DirectoryReader.js
define ( "cordova/plugin/DirectoryReader" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-24 02:37:33 +08:00
var exec = require ( 'cordova/exec' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ;
2012-02-18 07:28:35 +08:00
/ * *
* An interface that lists the files and directories in a directory .
* /
function DirectoryReader ( path ) {
this . path = path || null ;
}
/ * *
* Returns a list of entries from a directory .
*
* @ param { Function } successCallback is called with a list of entries
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryReader . prototype . readEntries = function ( successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var win = typeof successCallback !== 'function' ? null : function ( result ) {
2012-02-18 07:28:35 +08:00
var retVal = [ ] ;
for ( var i = 0 ; i < result . length ; i ++ ) {
var entry = null ;
if ( result [ i ] . isDirectory ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
else if ( result [ i ] . isFile ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/FileEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
entry . isDirectory = result [ i ] . isDirectory ;
entry . isFile = result [ i ] . isFile ;
entry . name = result [ i ] . name ;
entry . fullPath = result [ i ] . fullPath ;
retVal . push ( entry ) ;
}
successCallback ( retVal ) ;
} ;
2012-03-01 23:45:27 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "readEntries" , [ this . path ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = DirectoryReader ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Entry.js
define ( "cordova/plugin/Entry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ,
Metadata = require ( 'cordova/plugin/Metadata' ) ;
/ * *
* Represents a file or directory on the local file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param isFile
* { boolean } true if Entry is a file ( readonly )
* @ param isDirectory
* { boolean } true if Entry is a directory ( readonly )
* @ param name
* { DOMString } name of the file or directory , excluding the path
* leading to it ( readonly )
* @ param fullPath
* { DOMString } the absolute full path to the file or directory
* ( readonly )
* /
function Entry ( isFile , isDirectory , name , fullPath , fileSystem ) {
this . isFile = ( typeof isFile != 'undefined' ? isFile : false ) ;
this . isDirectory = ( typeof isDirectory != 'undefined' ? isDirectory : false ) ;
this . name = name || '' ;
this . fullPath = fullPath || '' ;
this . filesystem = fileSystem || null ;
}
/ * *
* Look up the metadata of the entry .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param successCallback
* { Function } is called with a Metadata object
* @ param errorCallback
* { Function } is called with a FileError
* /
Entry . prototype . getMetadata = function ( successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var success = typeof successCallback !== 'function' ? null : function ( lastModified ) {
2012-02-18 07:28:35 +08:00
var metadata = new Metadata ( lastModified ) ;
successCallback ( metadata ) ;
} ;
2012-03-01 23:45:27 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
2012-03-01 09:03:37 +08:00
2012-02-29 12:32:30 +08:00
exec ( success , fail , "File" , "getMetadata" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-05-11 06:50:02 +08:00
/ * *
* Set the metadata of the entry .
*
* @ param successCallback
* { Function } is called with a Metadata object
* @ param errorCallback
* { Function } is called with a FileError
* @ param metadataObject
* { Object } keys and values to set
* /
Entry . prototype . setMetadata = function ( successCallback , errorCallback , metadataObject ) {
exec ( successCallback , errorCallback , "File" , "setMetadata" , [ this . fullPath , metadataObject ] ) ;
} ;
2012-02-18 07:28:35 +08:00
/ * *
* Move a file or directory to a new location .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param parent
* { DirectoryEntry } the directory to which to move this entry
* @ param newName
* { DOMString } new name of the entry , defaults to the current name
* @ param successCallback
* { Function } called with the new DirectoryEntry object
* @ param errorCallback
* { Function } called with a FileError
* /
Entry . prototype . moveTo = function ( parent , newName , successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var fail = function ( code ) {
if ( typeof errorCallback === 'function' ) {
errorCallback ( new FileError ( code ) ) ;
}
} ;
2012-02-18 07:28:35 +08:00
// user must specify parent Entry
if ( ! parent ) {
2012-03-01 01:38:35 +08:00
fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
return ;
}
// source path
var srcPath = this . fullPath ,
// entry name
name = newName || this . name ,
success = function ( entry ) {
if ( entry ) {
2012-03-01 01:38:35 +08:00
if ( typeof successCallback === 'function' ) {
// create appropriate Entry object
var result = ( entry . isDirectory ) ? new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( entry . name , entry . fullPath ) : new ( require ( 'cordova/plugin/FileEntry' ) ) ( entry . name , entry . fullPath ) ;
try {
successCallback ( result ) ;
}
catch ( e ) {
console . log ( 'Error invoking callback: ' + e ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-03-01 01:38:35 +08:00
}
2012-02-18 07:28:35 +08:00
else {
// no Entry object returned
2012-03-01 01:38:35 +08:00
fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
}
} ;
// copy
exec ( success , fail , "File" , "moveTo" , [ srcPath , parent . fullPath , name ] ) ;
} ;
/ * *
* Copy a directory to a different location .
2012-03-01 01:38:35 +08:00
*
* @ param parent
2012-02-18 07:28:35 +08:00
* { DirectoryEntry } the directory to which to copy the entry
2012-03-01 01:38:35 +08:00
* @ param newName
2012-02-18 07:28:35 +08:00
* { DOMString } new name of the entry , defaults to the current name
* @ param successCallback
* { Function } called with the new Entry object
* @ param errorCallback
* { Function } called with a FileError
* /
Entry . prototype . copyTo = function ( parent , newName , successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var fail = function ( code ) {
if ( typeof errorCallback === 'function' ) {
errorCallback ( new FileError ( code ) ) ;
}
} ;
2012-02-18 07:28:35 +08:00
// user must specify parent Entry
if ( ! parent ) {
2012-03-01 01:38:35 +08:00
fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
return ;
}
// source path
var srcPath = this . fullPath ,
// entry name
name = newName || this . name ,
// success callback
success = function ( entry ) {
if ( entry ) {
2012-03-01 01:38:35 +08:00
if ( typeof successCallback === 'function' ) {
// create appropriate Entry object
var result = ( entry . isDirectory ) ? new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( entry . name , entry . fullPath ) : new ( require ( 'cordova/plugin/FileEntry' ) ) ( entry . name , entry . fullPath ) ;
try {
successCallback ( result ) ;
}
catch ( e ) {
console . log ( 'Error invoking callback: ' + e ) ;
}
2012-02-18 07:28:35 +08:00
}
}
else {
// no Entry object returned
2012-03-01 01:38:35 +08:00
fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
}
} ;
// copy
exec ( success , fail , "File" , "copyTo" , [ srcPath , parent . fullPath , name ] ) ;
} ;
/ * *
* Return a URL that can be used to identify this entry .
* /
2012-03-01 23:45:27 +08:00
Entry . prototype . toURL = function ( ) {
2012-02-18 07:28:35 +08:00
// fullPath attribute contains the full URL
return this . fullPath ;
} ;
2012-03-01 23:45:27 +08:00
/ * *
* Returns a URI that can be used to identify this entry .
*
* @ param { DOMString } mimeType for a FileEntry , the mime type to be used to interpret the file , when loaded through this URI .
* @ return uri
* /
Entry . prototype . toURI = function ( mimeType ) {
console . log ( "DEPRECATED: Update your code to use 'toURL'" ) ;
// fullPath attribute contains the full URI
2012-05-25 00:31:11 +08:00
return this . toURL ( ) ;
2012-03-01 23:45:27 +08:00
} ;
2012-02-18 07:28:35 +08:00
/ * *
* Remove a file or directory . It is an error to attempt to delete a
* directory that is not empty . It is an error to attempt to delete a
* root directory of a file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param successCallback { Function } called with no parameters
* @ param errorCallback { Function } called with a FileError
* /
Entry . prototype . remove = function ( successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
errorCallback ( new FileError ( code ) ) ;
2012-02-18 07:28:35 +08:00
} ;
exec ( successCallback , fail , "File" , "remove" , [ this . fullPath ] ) ;
} ;
/ * *
* Look up the parent DirectoryEntry of this entry .
*
* @ param successCallback { Function } called with the parent DirectoryEntry object
* @ param errorCallback { Function } called with a FileError
* /
Entry . prototype . getParent = function ( successCallback , errorCallback ) {
2012-04-04 01:09:31 +08:00
var win = typeof successCallback !== 'function' ? null : function ( result ) {
var DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ;
var entry = new DirectoryEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2012-03-01 23:45:27 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
2012-04-04 01:09:31 +08:00
exec ( win , fail , "File" , "getParent" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Entry ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/File.js
define ( "cordova/plugin/File" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Constructor .
* name { DOMString } name of the file , without path information
* fullPath { DOMString } the full path of the file , including the name
* type { DOMString } mime type
* lastModifiedDate { Date } last modified date
* size { Number } size of the file in bytes
* /
var File = function ( name , fullPath , type , lastModifiedDate , size ) {
2012-04-24 02:37:33 +08:00
this . name = name || '' ;
this . fullPath = fullPath || null ;
this . type = type || null ;
this . lastModifiedDate = lastModifiedDate || null ;
this . size = size || 0 ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = File ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileEntry.js
define ( "cordova/plugin/FileEntry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
Entry = require ( 'cordova/plugin/Entry' ) ,
FileWriter = require ( 'cordova/plugin/FileWriter' ) ,
File = require ( 'cordova/plugin/File' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ;
/ * *
* An interface representing a file on the file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* { boolean } isFile always true ( readonly )
* { boolean } isDirectory always false ( readonly )
* { DOMString } name of the file , excluding the path leading to it ( readonly )
* { DOMString } fullPath the absolute full path to the file ( readonly )
* { FileSystem } filesystem on which the file resides ( readonly )
* /
var FileEntry = function ( name , fullPath ) {
FileEntry . _ _super _ _ . constructor . apply ( this , [ true , false , name , fullPath ] ) ;
} ;
utils . extend ( FileEntry , Entry ) ;
/ * *
* Creates a new FileWriter associated with the file that this FileEntry represents .
*
* @ param { Function } successCallback is called with the new FileWriter
* @ param { Function } errorCallback is called with a FileError
* /
FileEntry . prototype . createWriter = function ( successCallback , errorCallback ) {
this . file ( function ( filePointer ) {
var writer = new FileWriter ( filePointer ) ;
if ( writer . fileName === null || writer . fileName === "" ) {
if ( typeof errorCallback === "function" ) {
errorCallback ( new FileError ( FileError . INVALID _STATE _ERR ) ) ;
}
} else {
if ( typeof successCallback === "function" ) {
successCallback ( writer ) ;
}
}
} , errorCallback ) ;
} ;
/ * *
* Returns a File that represents the current state of the file that this FileEntry represents .
*
* @ param { Function } successCallback is called with the new File object
* @ param { Function } errorCallback is called with a FileError
* /
FileEntry . prototype . file = function ( successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var win = typeof successCallback !== 'function' ? null : function ( f ) {
2012-02-18 07:28:35 +08:00
var file = new File ( f . name , f . fullPath , f . type , f . lastModifiedDate , f . size ) ;
successCallback ( file ) ;
} ;
2012-03-01 01:38:35 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
errorCallback ( new FileError ( code ) ) ;
2012-02-18 07:28:35 +08:00
} ;
exec ( win , fail , "File" , "getFileMetadata" , [ this . fullPath ] ) ;
} ;
module . exports = FileEntry ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileError.js
define ( "cordova/plugin/FileError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileError
* /
function FileError ( error ) {
this . code = error || null ;
}
// File error codes
// Found in DOMException
FileError . NOT _FOUND _ERR = 1 ;
FileError . SECURITY _ERR = 2 ;
FileError . ABORT _ERR = 3 ;
// Added by File API specification
FileError . NOT _READABLE _ERR = 4 ;
FileError . ENCODING _ERR = 5 ;
FileError . NO _MODIFICATION _ALLOWED _ERR = 6 ;
FileError . INVALID _STATE _ERR = 7 ;
FileError . SYNTAX _ERR = 8 ;
FileError . INVALID _MODIFICATION _ERR = 9 ;
FileError . QUOTA _EXCEEDED _ERR = 10 ;
FileError . TYPE _MISMATCH _ERR = 11 ;
FileError . PATH _EXISTS _ERR = 12 ;
module . exports = FileError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileReader.js
define ( "cordova/plugin/FileReader" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ,
ProgressEvent = require ( 'cordova/plugin/ProgressEvent' ) ;
/ * *
* This class reads the mobile device file system .
*
* For Android :
* The root directory is the root of the file system .
* To read from the SD card , the file name is "sdcard/my_file.txt"
* @ constructor
* /
var FileReader = function ( ) {
this . fileName = "" ;
this . readyState = 0 ; // FileReader.EMPTY
// File data
this . result = null ;
// Error
this . error = null ;
// Event handlers
this . onloadstart = null ; // When the read starts.
this . onprogress = null ; // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
this . onload = null ; // When the read has successfully completed.
this . onerror = null ; // When the read has failed (see errors).
this . onloadend = null ; // When the request has completed (either in success or failure).
this . onabort = null ; // When the read has been aborted. For instance, by invoking the abort() method.
} ;
// States
FileReader . EMPTY = 0 ;
FileReader . LOADING = 1 ;
FileReader . DONE = 2 ;
/ * *
* Abort reading file .
* /
FileReader . prototype . abort = function ( ) {
this . result = null ;
if ( this . readyState == FileReader . DONE || this . readyState == FileReader . EMPTY ) {
return ;
}
this . readyState = FileReader . DONE ;
// If abort callback
if ( typeof this . onabort === 'function' ) {
this . onabort ( new ProgressEvent ( 'abort' , { target : this } ) ) ;
}
// If load end callback
if ( typeof this . onloadend === 'function' ) {
this . onloadend ( new ProgressEvent ( 'loadend' , { target : this } ) ) ;
}
} ;
/ * *
* Read text file .
*
* @ param file { File } File object containing file properties
* @ param encoding [ Optional ] ( see http : //www.iana.org/assignments/character-sets)
* /
FileReader . prototype . readAsText = function ( file , encoding ) {
// Figure out pathing
this . fileName = '' ;
if ( typeof file . fullPath === 'undefined' ) {
this . fileName = file ;
} else {
this . fileName = file . fullPath ;
}
// Already loading something
if ( this . readyState == FileReader . LOADING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// LOADING state
this . readyState = FileReader . LOADING ;
// If loadstart callback
if ( typeof this . onloadstart === "function" ) {
this . onloadstart ( new ProgressEvent ( "loadstart" , { target : this } ) ) ;
}
// Default encoding is UTF-8
var enc = encoding ? encoding : "UTF-8" ;
var me = this ;
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileReader . DONE ) {
return ;
}
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
// Save result
me . result = r ;
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// DONE state
me . readyState = FileReader . DONE ;
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . readyState = FileReader . DONE ;
// null result
me . result = null ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} , "File" , "readAsText" , [ this . fileName , enc ] ) ;
} ;
/ * *
* Read file and return data as a base64 encoded data url .
* A data url is of the form :
* data : [ < mediatype > ] [ ; base64 ] , < data >
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsDataURL = function ( file ) {
this . fileName = "" ;
if ( typeof file . fullPath === "undefined" ) {
this . fileName = file ;
} else {
this . fileName = file . fullPath ;
}
// Already loading something
if ( this . readyState == FileReader . LOADING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// LOADING state
this . readyState = FileReader . LOADING ;
// If loadstart callback
if ( typeof this . onloadstart === "function" ) {
this . onloadstart ( new ProgressEvent ( "loadstart" , { target : this } ) ) ;
}
var me = this ;
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . readyState = FileReader . DONE ;
// Save result
me . result = r ;
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . readyState = FileReader . DONE ;
me . result = null ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} , "File" , "readAsDataURL" , [ this . fileName ] ) ;
} ;
/ * *
* Read file and return data as a binary data .
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsBinaryString = function ( file ) {
// TODO - Can't return binary data to browser.
2012-03-25 02:09:57 +08:00
console . log ( 'method "readAsBinaryString" is not supported at this time.' ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Read file and return data as a binary data .
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsArrayBuffer = function ( file ) {
// TODO - Can't return binary data to browser.
console . log ( 'This method is not supported at this time.' ) ;
} ;
module . exports = FileReader ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileSystem.js
define ( "cordova/plugin/FileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ;
/ * *
* An interface representing a file system
*
* @ constructor
* { DOMString } name the unique name of the file system ( readonly )
* { DirectoryEntry } root directory of the file system ( readonly )
* /
var FileSystem = function ( name , root ) {
this . name = name || null ;
if ( root ) {
2012-03-01 01:38:35 +08:00
this . root = new DirectoryEntry ( root . name , root . fullPath ) ;
2012-02-18 07:28:35 +08:00
}
} ;
module . exports = FileSystem ;
2012-07-13 04:37:08 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileTransfer.js
define ( "cordova/plugin/FileTransfer" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-06-22 02:12:30 +08:00
var exec = require ( 'cordova/exec' ) ,
FileTransferError = require ( 'cordova/plugin/FileTransferError' ) ;
2012-02-18 07:28:35 +08:00
/ * *
* FileTransfer uploads a file to a remote server .
* @ constructor
* /
var FileTransfer = function ( ) { } ;
/ * *
* Given an absolute file path , uploads a file on the device to a remote server
* using a multipart HTTP request .
* @ param filePath { String } Full path of the file on the device
* @ param server { String } URL of the server to receive the file
* @ param successCallback ( Function } Callback to be invoked when upload has completed
* @ param errorCallback { Function } Callback to be invoked upon error
* @ param options { FileUploadOptions } Optional parameters such as file name and mimetype
2012-04-10 08:11:13 +08:00
* @ param trustAllHosts { Boolean } Optional trust all hosts ( e . g . for self - signed certs ) , defaults to false
2012-02-18 07:28:35 +08:00
* /
2012-04-10 08:11:13 +08:00
FileTransfer . prototype . upload = function ( filePath , server , successCallback , errorCallback , options , trustAllHosts ) {
2012-06-22 02:12:30 +08:00
// sanity parameter checking
if ( ! filePath || ! server ) throw new Error ( "FileTransfer.upload requires filePath and server URL parameters at the minimum." ) ;
2012-02-18 07:28:35 +08:00
// check for options
var fileKey = null ;
var fileName = null ;
var mimeType = null ;
var params = null ;
var chunkedMode = true ;
2012-08-22 21:50:40 +08:00
var headers = null ;
2012-02-18 07:28:35 +08:00
if ( options ) {
fileKey = options . fileKey ;
fileName = options . fileName ;
mimeType = options . mimeType ;
2012-08-22 21:50:40 +08:00
headers = options . headers ;
2012-05-01 04:42:38 +08:00
if ( options . chunkedMode !== null || typeof options . chunkedMode != "undefined" ) {
2012-02-18 07:28:35 +08:00
chunkedMode = options . chunkedMode ;
}
if ( options . params ) {
params = options . params ;
}
else {
params = { } ;
}
}
2012-06-22 02:12:30 +08:00
var fail = function ( e ) {
var error = new FileTransferError ( e . code , e . source , e . target , e . http _status ) ;
errorCallback ( error ) ;
} ;
2012-08-22 21:50:40 +08:00
exec ( successCallback , fail , 'FileTransfer' , 'upload' , [ filePath , server , fileKey , fileName , mimeType , params , trustAllHosts , chunkedMode , headers ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Downloads a file form a given URL and saves it to the specified directory .
* @ param source { String } URL of the server to receive the file
* @ param target { String } Full path of the file on the device
* @ param successCallback ( Function } Callback to be invoked when upload has completed
* @ param errorCallback { Function } Callback to be invoked upon error
* /
FileTransfer . prototype . download = function ( source , target , successCallback , errorCallback ) {
2012-06-22 02:12:30 +08:00
// sanity parameter checking
if ( ! source || ! target ) throw new Error ( "FileTransfer.download requires source URI and target URI parameters at the minimum." ) ;
2012-02-18 07:28:35 +08:00
var win = function ( result ) {
var entry = null ;
if ( result . isDirectory ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
else if ( result . isFile ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/FileEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
entry . isDirectory = result . isDirectory ;
entry . isFile = result . isFile ;
entry . name = result . name ;
entry . fullPath = result . fullPath ;
2012-04-24 02:37:33 +08:00
successCallback ( entry ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-06-22 02:12:30 +08:00
var fail = function ( e ) {
var error = new FileTransferError ( e . code , e . source , e . target , e . http _status ) ;
errorCallback ( error ) ;
} ;
2012-02-18 07:28:35 +08:00
exec ( win , errorCallback , 'FileTransfer' , 'download' , [ source , target ] ) ;
} ;
module . exports = FileTransfer ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileTransferError.js
define ( "cordova/plugin/FileTransferError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileTransferError
* @ constructor
* /
2012-06-22 02:12:30 +08:00
var FileTransferError = function ( code , source , target , status ) {
2012-02-18 07:28:35 +08:00
this . code = code || null ;
2012-06-22 02:12:30 +08:00
this . source = source || null ;
this . target = target || null ;
this . http _status = status || null ;
2012-02-18 07:28:35 +08:00
} ;
FileTransferError . FILE _NOT _FOUND _ERR = 1 ;
FileTransferError . INVALID _URL _ERR = 2 ;
FileTransferError . CONNECTION _ERR = 3 ;
module . exports = FileTransferError ;
2012-06-22 02:12:30 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileUploadOptions.js
define ( "cordova/plugin/FileUploadOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Options to customize the HTTP request used to upload files .
* @ constructor
* @ param fileKey { String } Name of file request parameter .
* @ param fileName { String } Filename to be used by the server . Defaults to image . jpg .
* @ param mimeType { String } Mimetype of the uploaded file . Defaults to image / jpeg .
* @ param params { Object } Object with key : value params to send to the server .
2012-08-22 21:50:40 +08:00
* @ param headers { Object } Keys are header names , values are header values . Multiple
* headers of the same name are not supported .
2012-02-18 07:28:35 +08:00
* /
2012-08-22 21:50:40 +08:00
var FileUploadOptions = function ( fileKey , fileName , mimeType , params , headers ) {
2012-02-18 07:28:35 +08:00
this . fileKey = fileKey || null ;
this . fileName = fileName || null ;
this . mimeType = mimeType || null ;
this . params = params || null ;
2012-08-22 21:50:40 +08:00
this . headers = headers || null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = FileUploadOptions ;
2012-08-22 21:50:40 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileUploadResult.js
define ( "cordova/plugin/FileUploadResult" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileUploadResult
* @ constructor
* /
var FileUploadResult = function ( ) {
this . bytesSent = 0 ;
this . responseCode = null ;
this . response = null ;
} ;
module . exports = FileUploadResult ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileWriter.js
define ( "cordova/plugin/FileWriter" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-02-18 07:28:35 +08:00
ProgressEvent = require ( 'cordova/plugin/ProgressEvent' ) ;
/ * *
* This class writes to the mobile device file system .
*
* For Android :
* The root directory is the root of the file system .
* To write to the SD card , the file name is "sdcard/my_file.txt"
*
* @ constructor
* @ param file { File } File object containing file properties
* @ param append if true write to the end of the file , otherwise overwrite the file
* /
var FileWriter = function ( file ) {
this . fileName = "" ;
this . length = 0 ;
if ( file ) {
this . fileName = file . fullPath || file ;
this . length = file . size || 0 ;
}
// default is to write at the beginning of the file
this . position = 0 ;
this . readyState = 0 ; // EMPTY
this . result = null ;
// Error
this . error = null ;
// Event handlers
this . onwritestart = null ; // When writing starts
this . onprogress = null ; // While writing the file, and reporting partial file data
this . onwrite = null ; // When the write has successfully completed.
this . onwriteend = null ; // When the request has completed (either in success or failure).
this . onabort = null ; // When the write has been aborted. For instance, by invoking the abort() method.
this . onerror = null ; // When the write has failed (see errors).
} ;
// States
FileWriter . INIT = 0 ;
FileWriter . WRITING = 1 ;
FileWriter . DONE = 2 ;
/ * *
* Abort writing file .
* /
FileWriter . prototype . abort = function ( ) {
// check for invalid state
if ( this . readyState === FileWriter . DONE || this . readyState === FileWriter . INIT ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// set error
this . error = new FileError ( FileError . ABORT _ERR ) ;
this . readyState = FileWriter . DONE ;
// If abort callback
if ( typeof this . onabort === "function" ) {
this . onabort ( new ProgressEvent ( "abort" , { "target" : this } ) ) ;
}
// If write end callback
if ( typeof this . onwriteend === "function" ) {
this . onwriteend ( new ProgressEvent ( "writeend" , { "target" : this } ) ) ;
}
} ;
/ * *
* Writes data to the file
*
* @ param text to be written
* /
FileWriter . prototype . write = function ( text ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// WRITING state
this . readyState = FileWriter . WRITING ;
var me = this ;
// If onwritestart callback
if ( typeof me . onwritestart === "function" ) {
me . onwritestart ( new ProgressEvent ( "writestart" , { "target" : me } ) ) ;
}
// Write file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// position always increases by bytes written because file would be extended
me . position += r ;
// The length of the file is now where we are done writing.
me . length = me . position ;
// DONE state
me . readyState = FileWriter . DONE ;
// If onwrite callback
if ( typeof me . onwrite === "function" ) {
me . onwrite ( new ProgressEvent ( "write" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} , "File" , "write" , [ this . fileName , text , this . position ] ) ;
} ;
/ * *
* Moves the file pointer to the location specified .
*
* If the offset is a negative number the position of the file
* pointer is rewound . If the offset is greater than the file
* size the position is set to the end of the file .
*
* @ param offset is the location to move the file pointer to .
* /
FileWriter . prototype . seek = function ( offset ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
2012-04-24 02:37:33 +08:00
if ( ! offset && offset !== 0 ) {
2012-02-18 07:28:35 +08:00
return ;
}
// See back from end of file.
if ( offset < 0 ) {
this . position = Math . max ( offset + this . length , 0 ) ;
}
2012-08-25 04:44:18 +08:00
// Offset is bigger than file size so set position
2012-02-18 07:28:35 +08:00
// to the end of the file.
else if ( offset > this . length ) {
this . position = this . length ;
}
// Offset is between 0 and file size so set the position
// to start writing.
else {
this . position = offset ;
}
} ;
/ * *
* Truncates the file to the size specified .
*
* @ param size to chop the file at .
* /
FileWriter . prototype . truncate = function ( size ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// WRITING state
this . readyState = FileWriter . WRITING ;
var me = this ;
// If onwritestart callback
if ( typeof me . onwritestart === "function" ) {
me . onwritestart ( new ProgressEvent ( "writestart" , { "target" : this } ) ) ;
}
// Write file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Update the length of the file
me . length = r ;
me . position = Math . min ( me . position , r ) ;
// If onwrite callback
if ( typeof me . onwrite === "function" ) {
me . onwrite ( new ProgressEvent ( "write" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} , "File" , "truncate" , [ this . fileName , size ] ) ;
} ;
module . exports = FileWriter ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Flags.js
define ( "cordova/plugin/Flags" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Supplies arguments to methods that lookup or create files and directories .
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param create
* { boolean } file or directory if it doesn ' t exist
* @ param exclusive
* { boolean } used with create ; if true the command will fail if
* target path exists
* /
function Flags ( create , exclusive ) {
this . create = create || false ;
this . exclusive = exclusive || false ;
}
module . exports = Flags ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-09-20 02:08:52 +08:00
// file: lib/common/plugin/GlobalizationError.js
define ( "cordova/plugin/GlobalizationError" , function ( require , exports , module ) {
var GlobalizationError = function ( code , message ) {
this . code = code || null ;
this . message = message || '' ;
} ;
// Globalization error codes
GlobalizationError . UNKNOWN _ERROR = 0 ;
GlobalizationError . FORMATTING _ERROR = 1 ;
GlobalizationError . PARSING _ERROR = 2 ;
GlobalizationError . PATTERN _ERROR = 3 ;
module . exports = GlobalizationError ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/LocalFileSystem.js
define ( "cordova/plugin/LocalFileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Represents a local file system .
* /
var LocalFileSystem = function ( ) {
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
LocalFileSystem . TEMPORARY = 0 ; //temporary, with no guarantee of persistence
LocalFileSystem . PERSISTENT = 1 ; //persistent
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
module . exports = LocalFileSystem ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-10 04:32:22 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Media.js
define ( "cordova/plugin/Media" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ;
var mediaObjects = { } ;
/ * *
* This class provides access to the device media , interfaces to both sound and video
*
* @ constructor
* @ param src The file name or url to play
* @ param successCallback The callback to be called when the file is done playing or recording .
* successCallback ( )
* @ param errorCallback The callback to be called if there is an error .
* errorCallback ( int errorCode ) - OPTIONAL
* @ param statusCallback The callback to be called when media status has changed .
* statusCallback ( int statusCode ) - OPTIONAL
* /
var Media = function ( src , successCallback , errorCallback , statusCallback ) {
// successCallback optional
if ( successCallback && ( typeof successCallback !== "function" ) ) {
console . log ( "Media Error: successCallback is not a function" ) ;
return ;
}
// errorCallback optional
if ( errorCallback && ( typeof errorCallback !== "function" ) ) {
console . log ( "Media Error: errorCallback is not a function" ) ;
return ;
}
// statusCallback optional
if ( statusCallback && ( typeof statusCallback !== "function" ) ) {
console . log ( "Media Error: statusCallback is not a function" ) ;
return ;
}
this . id = utils . createUUID ( ) ;
mediaObjects [ this . id ] = this ;
this . src = src ;
this . successCallback = successCallback ;
this . errorCallback = errorCallback ;
this . statusCallback = statusCallback ;
this . _duration = - 1 ;
this . _position = - 1 ;
exec ( null , this . errorCallback , "Media" , "create" , [ this . id , this . src ] ) ;
} ;
// Media messages
Media . MEDIA _STATE = 1 ;
Media . MEDIA _DURATION = 2 ;
Media . MEDIA _POSITION = 3 ;
Media . MEDIA _ERROR = 9 ;
// Media states
Media . MEDIA _NONE = 0 ;
Media . MEDIA _STARTING = 1 ;
Media . MEDIA _RUNNING = 2 ;
Media . MEDIA _PAUSED = 3 ;
Media . MEDIA _STOPPED = 4 ;
Media . MEDIA _MSG = [ "None" , "Starting" , "Running" , "Paused" , "Stopped" ] ;
// "static" function to return existing objs.
Media . get = function ( id ) {
return mediaObjects [ id ] ;
} ;
/ * *
* Start or resume playing audio file .
* /
2012-03-25 02:09:57 +08:00
Media . prototype . play = function ( options ) {
2012-03-31 03:29:26 +08:00
exec ( null , null , "Media" , "startPlayingAudio" , [ this . id , this . src , options ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Stop playing audio file .
* /
Media . prototype . stop = function ( ) {
var me = this ;
exec ( function ( ) {
me . _position = 0 ;
} , this . errorCallback , "Media" , "stopPlayingAudio" , [ this . id ] ) ;
} ;
/ * *
* Seek or jump to a new time in the track . .
* /
Media . prototype . seekTo = function ( milliseconds ) {
var me = this ;
exec ( function ( p ) {
me . _position = p ;
} , this . errorCallback , "Media" , "seekToAudio" , [ this . id , milliseconds ] ) ;
} ;
/ * *
* Pause playing audio file .
* /
Media . prototype . pause = function ( ) {
exec ( null , this . errorCallback , "Media" , "pausePlayingAudio" , [ this . id ] ) ;
} ;
/ * *
* Get duration of an audio file .
* The duration is only set for audio that is playing , paused or stopped .
*
* @ return duration or - 1 if not known .
* /
Media . prototype . getDuration = function ( ) {
return this . _duration ;
} ;
/ * *
* Get position of audio .
* /
Media . prototype . getCurrentPosition = function ( success , fail ) {
var me = this ;
exec ( function ( p ) {
me . _position = p ;
success ( p ) ;
} , fail , "Media" , "getCurrentPositionAudio" , [ this . id ] ) ;
} ;
/ * *
* Start recording audio file .
* /
Media . prototype . startRecord = function ( ) {
2012-08-22 21:50:40 +08:00
exec ( null , this . errorCallback , "Media" , "startRecordingAudio" , [ this . id , this . src ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Stop recording audio file .
* /
Media . prototype . stopRecord = function ( ) {
2012-08-22 21:50:40 +08:00
exec ( null , this . errorCallback , "Media" , "stopRecordingAudio" , [ this . id ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Release the resources .
* /
Media . prototype . release = function ( ) {
exec ( null , this . errorCallback , "Media" , "release" , [ this . id ] ) ;
} ;
/ * *
* Adjust the volume .
* /
Media . prototype . setVolume = function ( volume ) {
exec ( null , null , "Media" , "setVolume" , [ this . id , volume ] ) ;
} ;
2012-03-01 23:45:27 +08:00
/ * *
* Audio has status update .
* PRIVATE
*
* @ param id The media object id ( string )
2012-09-12 23:44:53 +08:00
* @ param msgType The 'type' of update this is
* @ param value Use of value is determined by the msgType
2012-03-01 23:45:27 +08:00
* /
2012-09-12 23:44:53 +08:00
Media . onStatus = function ( id , msgType , value ) {
2012-03-01 23:45:27 +08:00
var media = mediaObjects [ id ] ;
2012-09-12 23:44:53 +08:00
if ( media ) {
switch ( msgType ) {
case Media . MEDIA _STATE :
media . statusCallback && media . statusCallback ( value ) ;
if ( value == Media . MEDIA _STOPPED ) {
media . successCallback && media . successCallback ( ) ;
}
break ;
case Media . MEDIA _DURATION :
media . _duration = value ;
break ;
case Media . MEDIA _ERROR :
media . errorCallback && media . errorCallback ( value ) ;
break ;
case Media . MEDIA _POSITION :
media . _position = Number ( value ) ;
break ;
default :
console && console . error && console . error ( "Unhandled Media.onStatus :: " + msgType ) ;
break ;
2012-03-01 23:45:27 +08:00
}
}
2012-09-12 23:44:53 +08:00
else {
console && console . error && console . error ( "Received Media.onStatus callback for unknown media :: " + id ) ;
2012-03-01 23:45:27 +08:00
}
2012-09-12 23:44:53 +08:00
2012-03-01 23:45:27 +08:00
} ;
2012-02-18 07:28:35 +08:00
module . exports = Media ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaError.js
define ( "cordova/plugin/MediaError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* This class contains information about any Media errors .
2012-09-12 23:44:53 +08:00
* /
/ *
According to : : http : //dev.w3.org/html5/spec-author-view/video.html#mediaerror
We should never be creating these objects , we should just implement the interface
which has 1 property for an instance , 'code'
instead of doing :
errorCallbackFunction ( new MediaError ( 3 , 'msg' ) ) ;
we should simply use a literal :
errorCallbackFunction ( { 'code' : 3 } ) ;
2012-02-18 07:28:35 +08:00
* /
2012-09-12 23:44:53 +08:00
if ( ! MediaError ) {
var MediaError = function ( code , msg ) {
this . code = ( typeof code != 'undefined' ) ? code : null ;
this . message = msg || "" ; // message is NON-standard! do not use!
} ;
}
MediaError . MEDIA _ERR _NONE _ACTIVE = MediaError . MEDIA _ERR _NONE _ACTIVE || 0 ;
MediaError . MEDIA _ERR _ABORTED = MediaError . MEDIA _ERR _ABORTED || 1 ;
MediaError . MEDIA _ERR _NETWORK = MediaError . MEDIA _ERR _NETWORK || 2 ;
MediaError . MEDIA _ERR _DECODE = MediaError . MEDIA _ERR _DECODE || 3 ;
MediaError . MEDIA _ERR _NONE _SUPPORTED = MediaError . MEDIA _ERR _NONE _SUPPORTED || 4 ;
// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
MediaError . MEDIA _ERR _SRC _NOT _SUPPORTED = MediaError . MEDIA _ERR _SRC _NOT _SUPPORTED || 4 ;
2012-02-18 07:28:35 +08:00
module . exports = MediaError ;
2012-09-12 23:44:53 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaFile.js
define ( "cordova/plugin/MediaFile" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
File = require ( 'cordova/plugin/File' ) ,
CaptureError = require ( 'cordova/plugin/CaptureError' ) ;
/ * *
* Represents a single file .
*
* name { DOMString } name of the file , without path information
* fullPath { DOMString } the full path of the file , including the name
* type { DOMString } mime type
* lastModifiedDate { Date } last modified date
* size { Number } size of the file in bytes
* /
var MediaFile = function ( name , fullPath , type , lastModifiedDate , size ) {
2012-05-01 04:42:38 +08:00
MediaFile . _ _super _ _ . constructor . apply ( this , arguments ) ;
2012-02-18 07:28:35 +08:00
} ;
utils . extend ( MediaFile , File ) ;
/ * *
* Request capture format data for a specific file and type
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param { Function } successCB
* @ param { Function } errorCB
* /
MediaFile . prototype . getFormatData = function ( successCallback , errorCallback ) {
2012-04-24 02:37:33 +08:00
if ( typeof this . fullPath === "undefined" || this . fullPath === null ) {
errorCallback ( new CaptureError ( CaptureError . CAPTURE _INVALID _ARGUMENT ) ) ;
} else {
2012-05-01 04:42:38 +08:00
exec ( successCallback , errorCallback , "Capture" , "getFormatData" , [ this . fullPath , this . type ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-02-18 07:28:35 +08:00
} ;
module . exports = MediaFile ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaFileData.js
define ( "cordova/plugin/MediaFileData" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* MediaFileData encapsulates format information of a media file .
*
* @ param { DOMString } codecs
* @ param { long } bitrate
* @ param { long } height
* @ param { long } width
* @ param { float } duration
* /
var MediaFileData = function ( codecs , bitrate , height , width , duration ) {
2012-04-24 02:37:33 +08:00
this . codecs = codecs || null ;
this . bitrate = bitrate || 0 ;
this . height = height || 0 ;
this . width = width || 0 ;
this . duration = duration || 0 ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = MediaFileData ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Metadata.js
define ( "cordova/plugin/Metadata" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Information about the state of the file or directory
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* { Date } modificationTime ( readonly )
* /
var Metadata = function ( time ) {
this . modificationTime = ( typeof time != 'undefined' ? new Date ( time ) : null ) ;
} ;
module . exports = Metadata ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Position.js
define ( "cordova/plugin/Position" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-10 04:32:22 +08:00
var Coordinates = require ( 'cordova/plugin/Coordinates' ) ;
2012-02-18 07:28:35 +08:00
var Position = function ( coords , timestamp ) {
2012-05-11 06:50:02 +08:00
if ( coords ) {
this . coords = new Coordinates ( coords . latitude , coords . longitude , coords . altitude , coords . accuracy , coords . heading , coords . velocity , coords . altitudeAccuracy ) ;
} else {
this . coords = new Coordinates ( ) ;
}
2012-06-06 05:26:02 +08:00
this . timestamp = ( timestamp !== undefined ) ? timestamp : new Date ( ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Position ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/PositionError.js
define ( "cordova/plugin/PositionError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Position error object
*
* @ constructor
* @ param code
* @ param message
* /
var PositionError = function ( code , message ) {
this . code = code || null ;
this . message = message || '' ;
} ;
PositionError . PERMISSION _DENIED = 1 ;
PositionError . POSITION _UNAVAILABLE = 2 ;
PositionError . TIMEOUT = 3 ;
module . exports = PositionError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ProgressEvent.js
define ( "cordova/plugin/ProgressEvent" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
// Feature test: See if we can instantiate a native ProgressEvent;
// if so, use that approach,
// otherwise fill-in with our own implementation.
//
// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
var ProgressEvent = ( function ( ) {
/ *
var createEvent = function ( data ) {
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'ProgressEvent' , false , false ) ;
if ( data ) {
for ( var i in data ) {
if ( data . hasOwnProperty ( i ) ) {
event [ i ] = data [ i ] ;
}
}
if ( data . target ) {
// TODO: cannot call <some_custom_object>.dispatchEvent
// need to first figure out how to implement EventTarget
}
}
return event ;
} ;
try {
var ev = createEvent ( { type : "abort" , target : document } ) ;
return function ProgressEvent ( type , data ) {
data . type = type ;
return createEvent ( data ) ;
} ;
} catch ( e ) {
* /
return function ProgressEvent ( type , dict ) {
this . type = type ;
this . bubbles = false ;
this . cancelBubble = false ;
this . cancelable = false ;
this . lengthComputable = false ;
this . loaded = dict && dict . loaded ? dict . loaded : 0 ;
this . total = dict && dict . total ? dict . total : 0 ;
this . target = dict && dict . target ? dict . target : null ;
} ;
//}
} ) ( ) ;
module . exports = ProgressEvent ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/accelerometer.js
define ( "cordova/plugin/accelerometer" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* This class provides access to device accelerometer data .
* @ constructor
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
var utils = require ( "cordova/utils" ) ,
2012-05-15 04:04:07 +08:00
exec = require ( "cordova/exec" ) ,
Acceleration = require ( 'cordova/plugin/Acceleration' ) ;
2012-03-01 23:45:27 +08:00
2012-05-19 04:50:45 +08:00
// Is the accel sensor running?
var running = false ;
2012-03-01 23:45:27 +08:00
2012-05-15 04:04:07 +08:00
// Keeps reference to watchAcceleration calls.
2012-03-25 02:09:57 +08:00
var timers = { } ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
// Array of listeners; used to keep track of when we should call start and stop.
var listeners = [ ] ;
2012-05-15 04:04:07 +08:00
// Last returned acceleration object from native
var accel = null ;
2012-05-19 04:50:45 +08:00
// Tells native to start.
function start ( ) {
exec ( function ( a ) {
var tempListeners = listeners . slice ( 0 ) ;
accel = new Acceleration ( a . x , a . y , a . z , a . timestamp ) ;
for ( var i = 0 , l = tempListeners . length ; i < l ; i ++ ) {
tempListeners [ i ] . win ( accel ) ;
}
} , function ( e ) {
var tempListeners = listeners . slice ( 0 ) ;
for ( var i = 0 , l = tempListeners . length ; i < l ; i ++ ) {
tempListeners [ i ] . fail ( e ) ;
}
} , "Accelerometer" , "start" , [ ] ) ;
running = true ;
}
// Tells native to stop.
function stop ( ) {
exec ( null , null , "Accelerometer" , "stop" , [ ] ) ;
running = false ;
}
// Adds a callback pair to the listeners array
function createCallbackPair ( win , fail ) {
return { win : win , fail : fail } ;
}
// Removes a win/fail listener pair from the listeners array
function removeListeners ( l ) {
var idx = listeners . indexOf ( l ) ;
if ( idx > - 1 ) {
listeners . splice ( idx , 1 ) ;
if ( listeners . length === 0 ) {
stop ( ) ;
}
}
}
2012-03-25 02:09:57 +08:00
var accelerometer = {
/ * *
* Asynchronously aquires the current acceleration .
*
* @ param { Function } successCallback The function to call when the acceleration data is available
* @ param { Function } errorCallback The function to call when there is an error getting the acceleration data . ( OPTIONAL )
* @ param { AccelerationOptions } options The options for getting the accelerometer data such as timeout . ( OPTIONAL )
* /
getCurrentAcceleration : function ( successCallback , errorCallback , options ) {
// successCallback required
if ( typeof successCallback !== "function" ) {
2012-05-15 04:04:07 +08:00
throw "getCurrentAcceleration must be called with at least a success callback function as first parameter." ;
2012-03-25 02:09:57 +08:00
}
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
var p ;
2012-05-15 04:04:07 +08:00
var win = function ( a ) {
2012-05-19 04:50:45 +08:00
removeListeners ( p ) ;
2012-07-19 07:58:03 +08:00
successCallback ( a ) ;
2012-05-19 04:50:45 +08:00
} ;
var fail = function ( e ) {
removeListeners ( p ) ;
2012-07-19 07:58:03 +08:00
errorCallback ( e ) ;
2012-05-15 04:04:07 +08:00
} ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
p = createCallbackPair ( win , fail ) ;
listeners . push ( p ) ;
if ( ! running ) {
start ( ) ;
}
2012-03-25 02:09:57 +08:00
} ,
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Asynchronously aquires the acceleration repeatedly at a given interval .
*
* @ param { Function } successCallback The function to call each time the acceleration data is available
* @ param { Function } errorCallback The function to call when there is an error getting the acceleration data . ( OPTIONAL )
* @ param { AccelerationOptions } options The options for getting the accelerometer data such as timeout . ( OPTIONAL )
* @ return String The watch id that must be passed to # clearWatch to stop watching .
* /
watchAcceleration : function ( successCallback , errorCallback , options ) {
// Default interval (10 sec)
2012-05-15 04:04:07 +08:00
var frequency = ( options && options . frequency && typeof options . frequency == 'number' ) ? options . frequency : 10000 ;
2012-03-25 02:09:57 +08:00
// successCallback required
if ( typeof successCallback !== "function" ) {
2012-05-15 04:04:07 +08:00
throw "watchAcceleration must be called with at least a success callback function as first parameter." ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
2012-05-15 04:04:07 +08:00
// Keep reference to watch id, and report accel readings as often as defined in frequency
2012-03-25 02:09:57 +08:00
var id = utils . createUUID ( ) ;
2012-05-15 04:04:07 +08:00
2012-05-19 04:50:45 +08:00
var p = createCallbackPair ( function ( ) { } , function ( e ) {
removeListeners ( p ) ;
2012-07-19 07:58:03 +08:00
errorCallback ( e ) ;
2012-05-19 04:50:45 +08:00
} ) ;
listeners . push ( p ) ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
timers [ id ] = {
timer : window . setInterval ( function ( ) {
if ( accel ) {
successCallback ( accel ) ;
2012-03-25 02:09:57 +08:00
}
2012-05-19 04:50:45 +08:00
} , frequency ) ,
listeners : p
2012-05-15 04:04:07 +08:00
} ;
2012-03-25 02:09:57 +08:00
2012-05-19 04:50:45 +08:00
if ( running ) {
// If we're already running then immediately invoke the success callback
2012-08-25 04:44:18 +08:00
// but only if we have retrieved a value, sample code does not check for null ...
2012-07-19 07:58:03 +08:00
if ( accel ) {
successCallback ( accel ) ;
}
2012-05-19 04:50:45 +08:00
} else {
start ( ) ;
}
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified accelerometer watch .
*
* @ param { String } id The id of the watch returned from # watchAcceleration .
* /
clearWatch : function ( id ) {
// Stop javascript timer & remove from timer list
2012-05-15 04:04:07 +08:00
if ( id && timers [ id ] ) {
2012-05-19 04:50:45 +08:00
window . clearInterval ( timers [ id ] . timer ) ;
removeListeners ( timers [ id ] . listeners ) ;
2012-03-25 02:09:57 +08:00
delete timers [ id ] ;
}
}
2012-02-18 07:28:35 +08:00
} ;
2012-03-25 02:09:57 +08:00
module . exports = accelerometer ;
2012-05-15 04:04:07 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/app.js
define ( "cordova/plugin/android/app" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ;
module . exports = {
/ * *
* Clear the resource cache .
* /
clearCache : function ( ) {
exec ( null , null , "App" , "clearCache" , [ ] ) ;
} ,
/ * *
* Load the url into the webview or into new browser instance .
*
* @ param url The URL to load
* @ param props Properties that can be passed in to the activity :
* wait : int => wait msec before loading URL
* loadingDialog : "Title,Message" => display a native loading dialog
* loadUrlTimeoutValue : int => time in msec to wait before triggering a timeout error
* clearHistory : boolean => clear webview history ( default = false )
* openExternal : boolean => open in a new browser ( default = false )
*
* Example :
* navigator . app . loadUrl ( "http://server/myapp/index.html" , { wait : 2000 , loadingDialog : "Wait,Loading App" , loadUrlTimeoutValue : 60000 } ) ;
* /
loadUrl : function ( url , props ) {
exec ( null , null , "App" , "loadUrl" , [ url , props ] ) ;
} ,
/ * *
* Cancel loadUrl that is waiting to be loaded .
* /
cancelLoadUrl : function ( ) {
exec ( null , null , "App" , "cancelLoadUrl" , [ ] ) ;
} ,
/ * *
* Clear web history in this web view .
* Instead of BACK button loading the previous web page , it will exit the app .
* /
clearHistory : function ( ) {
exec ( null , null , "App" , "clearHistory" , [ ] ) ;
} ,
/ * *
* Go to previous page displayed .
* This is the same as pressing the backbutton on Android device .
* /
backHistory : function ( ) {
exec ( null , null , "App" , "backHistory" , [ ] ) ;
} ,
/ * *
* Override the default behavior of the Android back button .
* If overridden , when the back button is pressed , the "backKeyDown" JavaScript event will be fired .
*
* Note : The user should not have to call this method . Instead , when the user
* registers for the "backbutton" event , this is automatically done .
*
2012-04-24 02:37:33 +08:00
* @ param override T = override , F = cancel override
2012-02-18 07:28:35 +08:00
* /
overrideBackbutton : function ( override ) {
exec ( null , null , "App" , "overrideBackbutton" , [ override ] ) ;
} ,
/ * *
* Exit and terminate the application .
* /
exitApp : function ( ) {
return exec ( null , null , "App" , "exitApp" , [ ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/callback.js
define ( "cordova/plugin/android/callback" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var port = null ,
token = null ,
2012-08-22 21:50:40 +08:00
xmlhttp ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
function startXhr ( ) {
// cordova/exec depends on this module, so we can't require cordova/exec on the module level.
var exec = require ( 'cordova/exec' ) ,
xmlhttp = new XMLHttpRequest ( ) ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
// Callback function when XMLHttpRequest is ready
xmlhttp . onreadystatechange = function ( ) {
if ( ! xmlhttp ) {
return ;
}
if ( xmlhttp . readyState === 4 ) {
// If callback has JavaScript statement to execute
if ( xmlhttp . status === 200 ) {
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
// Need to url decode the response
var msg = decodeURIComponent ( xmlhttp . responseText ) ;
setTimeout ( startXhr , 1 ) ;
2012-09-19 01:15:24 +08:00
exec . processMessages ( msg ) ;
2012-08-22 21:50:40 +08:00
}
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
// If callback ping (used to keep XHR request from timing out)
else if ( xmlhttp . status === 404 ) {
setTimeout ( startXhr , 10 ) ;
}
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
// 0 == Page is unloading.
// 400 == Bad request.
// 403 == invalid token.
// 503 == server stopped.
else {
console . log ( "JSCallback Error: Request failed with status " + xmlhttp . status ) ;
exec . setNativeToJsBridgeMode ( exec . nativeToJsModes . POLLING ) ;
}
}
} ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
if ( port === null ) {
port = prompt ( "getPort" , "gap_callbackServer:" ) ;
}
if ( token === null ) {
token = prompt ( "getToken" , "gap_callbackServer:" ) ;
}
xmlhttp . open ( "GET" , "http://127.0.0.1:" + port + "/" + token , true ) ;
xmlhttp . send ( ) ;
}
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
module . exports = {
start : function ( ) {
startXhr ( ) ;
} ,
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
stop : function ( ) {
if ( xmlhttp ) {
var tmp = xmlhttp ;
xmlhttp = null ;
tmp . abort ( ) ;
}
} ,
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
isAvailable : function ( ) {
return ( "true" != prompt ( "usePolling" , "gap_callbackServer:" ) ) ;
}
2012-02-18 07:28:35 +08:00
} ;
2012-08-22 21:50:40 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/device.js
define ( "cordova/plugin/android/device" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var channel = require ( 'cordova/channel' ) ,
2012-03-29 04:47:45 +08:00
utils = require ( 'cordova/utils' ) ,
2012-07-13 04:37:08 +08:00
exec = require ( 'cordova/exec' ) ,
app = require ( 'cordova/plugin/android/app' ) ;
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
module . exports = {
/ *
* DEPRECATED
* This is only for Android .
*
* You must explicitly override the back button .
* /
overrideBackButton : function ( ) {
console . log ( "Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true)." ) ;
app . overrideBackbutton ( true ) ;
} ,
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
/ *
* DEPRECATED
* This is only for Android .
*
* This resets the back button to the default behaviour
* /
resetBackButton : function ( ) {
console . log ( "Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false)." ) ;
app . overrideBackbutton ( false ) ;
} ,
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
/ *
* DEPRECATED
* This is only for Android .
*
* This terminates the activity !
* /
exitApp : function ( ) {
console . log ( "Device.exitApp() is deprecated. Use App.exitApp()." ) ;
app . exitApp ( ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
// file: lib/android/plugin/android/nativeapiprovider.js
define ( "cordova/plugin/android/nativeapiprovider" , function ( require , exports , module ) {
var nativeApi = this . _cordovaNative || require ( 'cordova/plugin/android/promptbasednativeapi' ) ;
var currentApi = nativeApi ;
module . exports = {
get : function ( ) { return currentApi } ,
setPreferPrompt : function ( value ) {
currentApi = value ? require ( 'cordova/plugin/android/promptbasednativeapi' ) : nativeApi ;
}
} ;
} ) ;
2012-03-29 04:47:45 +08:00
// file: lib/android/plugin/android/notification.js
define ( "cordova/plugin/android/notification" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-29 04:47:45 +08:00
var exec = require ( 'cordova/exec' ) ;
/ * *
* Provides Android enhanced notification API .
* /
module . exports = {
activityStart : function ( title , message ) {
// If title and message not specified then mimic Android behavior of
// using default strings.
if ( typeof title === "undefined" && typeof message == "undefined" ) {
title = "Busy" ;
message = 'Please wait...' ;
}
exec ( null , null , 'Notification' , 'activityStart' , [ title , message ] ) ;
} ,
/ * *
* Close an activity dialog
* /
activityStop : function ( ) {
exec ( null , null , 'Notification' , 'activityStop' , [ ] ) ;
} ,
/ * *
* Display a progress dialog with progress bar that goes from 0 to 100.
*
* @ param { String }
* title Title of the progress dialog .
* @ param { String }
* message Message to display in the dialog .
* /
progressStart : function ( title , message ) {
exec ( null , null , 'Notification' , 'progressStart' , [ title , message ] ) ;
} ,
/ * *
* Close the progress dialog .
* /
progressStop : function ( ) {
exec ( null , null , 'Notification' , 'progressStop' , [ ] ) ;
} ,
/ * *
* Set the progress dialog value .
*
* @ param { Number }
* value 0 - 100
* /
progressValue : function ( value ) {
exec ( null , null , 'Notification' , 'progressValue' , [ value ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-03-29 04:47:45 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-29 04:47:45 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/polling.js
define ( "cordova/plugin/android/polling" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var cordova = require ( 'cordova' ) ,
2012-09-19 01:15:24 +08:00
nativeApiProvider = require ( 'cordova/plugin/android/nativeapiprovider' ) ,
2012-08-22 21:50:40 +08:00
POLL _INTERVAL = 50 ,
enabled = false ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
function pollOnce ( ) {
2012-09-19 01:15:24 +08:00
var exec = require ( 'cordova/exec' ) ,
msg = nativeApiProvider . get ( ) . retrieveJsMessages ( ) ;
exec . processMessages ( msg ) ;
2012-08-22 21:50:40 +08:00
}
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
function doPoll ( ) {
if ( ! enabled ) {
return ;
}
2012-09-19 01:15:24 +08:00
pollOnce ( ) ;
setTimeout ( doPoll , POLL _INTERVAL ) ;
2012-08-22 21:50:40 +08:00
}
module . exports = {
start : function ( ) {
enabled = true ;
setTimeout ( doPoll , 1 ) ;
} ,
stop : function ( ) {
enabled = false ;
} ,
pollOnce : pollOnce
2012-02-18 07:28:35 +08:00
} ;
2012-08-22 21:50:40 +08:00
2012-09-19 01:15:24 +08:00
} ) ;
// file: lib/android/plugin/android/promptbasednativeapi.js
define ( "cordova/plugin/android/promptbasednativeapi" , function ( require , exports , module ) {
module . exports = {
exec : function ( service , action , callbackId , argsJson ) {
return prompt ( argsJson , 'gap:' + JSON . stringify ( [ service , action , callbackId ] ) ) ;
} ,
setNativeToJsBridgeMode : function ( value ) {
prompt ( value , 'gap_bridge_mode:' ) ;
} ,
retrieveJsMessages : function ( ) {
return prompt ( '' , 'gap_poll:' ) ;
}
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/storage.js
define ( "cordova/plugin/android/storage" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
2012-04-24 02:37:33 +08:00
exec = require ( 'cordova/exec' ) ,
2012-03-25 02:09:57 +08:00
channel = require ( 'cordova/channel' ) ;
2012-02-18 07:28:35 +08:00
var queryQueue = { } ;
/ * *
* SQL result set object
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Rows = function ( ) {
this . resultSet = [ ] ; // results array
this . length = 0 ; // number of rows
} ;
/ * *
* Get item from SQL result set
*
* @ param row The row number to return
* @ return The row object
* /
DroidDB _Rows . prototype . item = function ( row ) {
return this . resultSet [ row ] ;
} ;
/ * *
* SQL result set that is returned to user .
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Result = function ( ) {
this . rows = new DroidDB _Rows ( ) ;
} ;
/ * *
* Callback from native code when query is complete .
* PRIVATE METHOD
*
* @ param id Query id
* /
function completeQuery ( id , data ) {
var query = queryQueue [ id ] ;
if ( query ) {
try {
delete queryQueue [ id ] ;
// Get transaction
var tx = query . tx ;
// If transaction hasn't failed
// Note: We ignore all query results if previous query
// in the same transaction failed.
if ( tx && tx . queryList [ id ] ) {
// Save query results
var r = new DroidDB _Result ( ) ;
r . rows . resultSet = data ;
r . rows . length = data . length ;
try {
if ( typeof query . successCallback === 'function' ) {
query . successCallback ( query . tx , r ) ;
}
} catch ( ex ) {
console . log ( "executeSql error calling user success callback: " + ex ) ;
}
tx . queryComplete ( id ) ;
}
} catch ( e ) {
console . log ( "executeSql error: " + e ) ;
}
}
}
/ * *
* Callback from native code when query fails
* PRIVATE METHOD
*
* @ param reason Error message
* @ param id Query id
* /
function failQuery ( reason , id ) {
var query = queryQueue [ id ] ;
if ( query ) {
try {
delete queryQueue [ id ] ;
// Get transaction
var tx = query . tx ;
// If transaction hasn't failed
// Note: We ignore all query results if previous query
// in the same transaction failed.
if ( tx && tx . queryList [ id ] ) {
tx . queryList = { } ;
try {
if ( typeof query . errorCallback === 'function' ) {
query . errorCallback ( query . tx , reason ) ;
}
} catch ( ex ) {
console . log ( "executeSql error calling user error callback: " + ex ) ;
}
tx . queryFailed ( id , reason ) ;
}
} catch ( e ) {
console . log ( "executeSql error: " + e ) ;
}
}
}
/ * *
* SQL query object
* PRIVATE METHOD
*
* @ constructor
* @ param tx The transaction object that this query belongs to
* /
var DroidDB _Query = function ( tx ) {
// Set the id of the query
this . id = utils . createUUID ( ) ;
// Add this query to the queue
queryQueue [ this . id ] = this ;
// Init result
this . resultSet = [ ] ;
// Set transaction that this query belongs to
this . tx = tx ;
// Add this query to transaction list
this . tx . queryList [ this . id ] = this ;
// Callbacks
this . successCallback = null ;
this . errorCallback = null ;
} ;
/ * *
* Transaction object
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Tx = function ( ) {
// Set the id of the transaction
this . id = utils . createUUID ( ) ;
// Callbacks
this . successCallback = null ;
this . errorCallback = null ;
// Query list
this . queryList = { } ;
} ;
/ * *
* Mark query in transaction as complete .
* If all queries are complete , call the user ' s transaction success callback .
*
* @ param id Query id
* /
DroidDB _Tx . prototype . queryComplete = function ( id ) {
delete this . queryList [ id ] ;
// If no more outstanding queries, then fire transaction success
if ( this . successCallback ) {
var count = 0 ;
var i ;
for ( i in this . queryList ) {
if ( this . queryList . hasOwnProperty ( i ) ) {
count ++ ;
}
}
if ( count === 0 ) {
try {
this . successCallback ( ) ;
} catch ( e ) {
console . log ( "Transaction error calling user success callback: " + e ) ;
}
}
}
} ;
/ * *
* Mark query in transaction as failed .
*
* @ param id Query id
* @ param reason Error message
* /
DroidDB _Tx . prototype . queryFailed = function ( id , reason ) {
// The sql queries in this transaction have already been run, since
// we really don't have a real transaction implemented in native code.
// However, the user callbacks for the remaining sql queries in transaction
// will not be called.
this . queryList = { } ;
if ( this . errorCallback ) {
try {
this . errorCallback ( reason ) ;
} catch ( e ) {
console . log ( "Transaction error calling user error callback: " + e ) ;
}
}
} ;
/ * *
* Execute SQL statement
*
* @ param sql SQL statement to execute
* @ param params Statement parameters
* @ param successCallback Success callback
* @ param errorCallback Error callback
* /
DroidDB _Tx . prototype . executeSql = function ( sql , params , successCallback , errorCallback ) {
// Init params array
if ( typeof params === 'undefined' ) {
params = [ ] ;
}
// Create query and add to queue
var query = new DroidDB _Query ( this ) ;
queryQueue [ query . id ] = query ;
// Save callbacks
query . successCallback = successCallback ;
query . errorCallback = errorCallback ;
// Call native code
exec ( null , null , "Storage" , "executeSql" , [ sql , params , query . id ] ) ;
} ;
2012-03-25 02:09:57 +08:00
var DatabaseShell = function ( ) {
} ;
/ * *
* Start a transaction .
* Does not support rollback in event of failure .
*
* @ param process { Function } The transaction function
* @ param successCallback { Function }
* @ param errorCallback { Function }
* /
DatabaseShell . prototype . transaction = function ( process , errorCallback , successCallback ) {
var tx = new DroidDB _Tx ( ) ;
tx . successCallback = successCallback ;
tx . errorCallback = errorCallback ;
try {
process ( tx ) ;
} catch ( e ) {
console . log ( "Transaction error: " + e ) ;
if ( tx . errorCallback ) {
try {
tx . errorCallback ( e ) ;
} catch ( ex ) {
console . log ( "Transaction error calling user error callback: " + e ) ;
}
}
}
} ;
/ * *
* Open database
*
* @ param name Database name
* @ param version Database version
* @ param display _name Database display name
* @ param size Database size in bytes
* @ return Database object
* /
var DroidDB _openDatabase = function ( name , version , display _name , size ) {
exec ( null , null , "Storage" , "openDatabase" , [ name , version , display _name , size ] ) ;
var db = new DatabaseShell ( ) ;
return db ;
} ;
/ * *
* For browsers with no localStorage we emulate it with SQLite . Follows the w3c api .
* TODO : Do similar for sessionStorage .
* @ constructor
* /
var CupcakeLocalStorage = function ( ) {
channel . waitForInitialization ( "cupcakeStorage" ) ;
try {
this . db = openDatabase ( 'localStorage' , '1.0' , 'localStorage' , 2621440 ) ;
var storage = { } ;
this . length = 0 ;
function setLength ( length ) {
this . length = length ;
localStorage . length = length ;
}
this . db . transaction (
function ( transaction ) {
var i ;
transaction . executeSql ( 'CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))' ) ;
transaction . executeSql ( 'SELECT * FROM storage' , [ ] , function ( tx , result ) {
for ( var i = 0 ; i < result . rows . length ; i ++ ) {
2012-04-24 02:37:33 +08:00
storage [ result . rows . item ( i ) . id ] = result . rows . item ( i ) . body ;
2012-03-25 02:09:57 +08:00
}
setLength ( result . rows . length ) ;
channel . initializationComplete ( "cupcakeStorage" ) ;
} ) ;
} ,
function ( err ) {
2012-03-29 04:47:45 +08:00
utils . alert ( err . message ) ;
2012-03-25 02:09:57 +08:00
}
) ;
this . setItem = function ( key , val ) {
if ( typeof ( storage [ key ] ) == 'undefined' ) {
this . length ++ ;
}
storage [ key ] = val ;
this . db . transaction (
function ( transaction ) {
transaction . executeSql ( 'CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))' ) ;
transaction . executeSql ( 'REPLACE INTO storage (id, body) values(?,?)' , [ key , val ] ) ;
}
) ;
} ;
this . getItem = function ( key ) {
return storage [ key ] ;
} ;
this . removeItem = function ( key ) {
delete storage [ key ] ;
this . length -- ;
this . db . transaction (
function ( transaction ) {
transaction . executeSql ( 'CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))' ) ;
transaction . executeSql ( 'DELETE FROM storage where id=?' , [ key ] ) ;
}
) ;
} ;
this . clear = function ( ) {
storage = { } ;
this . length = 0 ;
this . db . transaction (
function ( transaction ) {
transaction . executeSql ( 'CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))' ) ;
transaction . executeSql ( 'DELETE FROM storage' , [ ] ) ;
}
) ;
} ;
this . key = function ( index ) {
var i = 0 ;
for ( var j in storage ) {
if ( i == index ) {
return j ;
} else {
i ++ ;
}
}
return null ;
} ;
} catch ( e ) {
2012-03-29 04:47:45 +08:00
utils . alert ( "Database error " + e + "." ) ;
2012-03-25 02:09:57 +08:00
return ;
}
} ;
module . exports = {
openDatabase : DroidDB _openDatabase ,
CupcakeLocalStorage : CupcakeLocalStorage ,
failQuery : failQuery ,
completeQuery : completeQuery
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/battery.js
define ( "cordova/plugin/battery" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* This class contains information about the current battery status .
* @ constructor
* /
var cordova = require ( 'cordova' ) ,
exec = require ( 'cordova/exec' ) ;
function handlers ( ) {
2012-04-24 02:37:33 +08:00
return battery . channels . batterystatus . numHandlers +
2012-03-25 02:09:57 +08:00
battery . channels . batterylow . numHandlers +
battery . channels . batterycritical . numHandlers ;
}
var Battery = function ( ) {
this . _level = null ;
this . _isPlugged = null ;
// Create new event handlers on the window (returns a channel instance)
this . channels = {
2012-09-19 01:15:24 +08:00
batterystatus : cordova . addWindowEventHandler ( "batterystatus" ) ,
batterylow : cordova . addWindowEventHandler ( "batterylow" ) ,
batterycritical : cordova . addWindowEventHandler ( "batterycritical" )
2012-03-25 02:09:57 +08:00
} ;
2012-09-19 01:15:24 +08:00
for ( var key in this . channels ) {
this . channels [ key ] . onHasSubscribersChange = Battery . onHasSubscribersChange ;
}
2012-03-25 02:09:57 +08:00
} ;
/ * *
* Event handlers for when callbacks get registered for the battery .
* Keep track of how many handlers we have so we can start and stop the native battery listener
* appropriately ( and hopefully save on battery life ! ) .
* /
2012-09-19 01:15:24 +08:00
Battery . onHasSubscribersChange = function ( ) {
2012-03-25 02:09:57 +08:00
// If we just registered the first handler, make sure native listener is started.
2012-09-19 01:15:24 +08:00
if ( this . numHandlers === 1 && handlers ( ) === 1 ) {
exec ( battery . _status , battery . _error , "Battery" , "start" , [ ] ) ;
} else if ( handlers ( ) === 0 ) {
2012-03-25 02:09:57 +08:00
exec ( null , null , "Battery" , "stop" , [ ] ) ;
}
} ;
/ * *
* Callback for battery status
2012-04-24 02:37:33 +08:00
*
* @ param { Object } info keys : level , isPlugged
2012-03-25 02:09:57 +08:00
* /
Battery . prototype . _status = function ( info ) {
2012-04-24 02:37:33 +08:00
if ( info ) {
var me = battery ;
2012-03-25 02:09:57 +08:00
var level = info . level ;
2012-04-24 02:37:33 +08:00
if ( me . _level !== level || me . _isPlugged !== info . isPlugged ) {
// Fire batterystatus event
cordova . fireWindowEvent ( "batterystatus" , info ) ;
// Fire low battery event
if ( level === 20 || level === 5 ) {
if ( level === 20 ) {
cordova . fireWindowEvent ( "batterylow" , info ) ;
}
else {
cordova . fireWindowEvent ( "batterycritical" , info ) ;
}
}
}
me . _level = level ;
me . _isPlugged = info . isPlugged ;
}
2012-03-25 02:09:57 +08:00
} ;
/ * *
* Error callback for battery start
* /
Battery . prototype . _error = function ( e ) {
console . log ( "Error initializing Battery: " + e ) ;
} ;
var battery = new Battery ( ) ;
module . exports = battery ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/capture.js
define ( "cordova/plugin/capture" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
MediaFile = require ( 'cordova/plugin/MediaFile' ) ;
/ * *
* Launches a capture of different types .
*
2012-04-24 02:37:33 +08:00
* @ param ( DOMString } type
2012-03-25 02:09:57 +08:00
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureVideoOptions } options
* /
function _capture ( type , successCallback , errorCallback , options ) {
var win = function ( pluginResult ) {
var mediaFiles = [ ] ;
var i ;
for ( i = 0 ; i < pluginResult . length ; i ++ ) {
var mediaFile = new MediaFile ( ) ;
mediaFile . name = pluginResult [ i ] . name ;
mediaFile . fullPath = pluginResult [ i ] . fullPath ;
mediaFile . type = pluginResult [ i ] . type ;
mediaFile . lastModifiedDate = pluginResult [ i ] . lastModifiedDate ;
mediaFile . size = pluginResult [ i ] . size ;
mediaFiles . push ( mediaFile ) ;
}
successCallback ( mediaFiles ) ;
} ;
exec ( win , errorCallback , "Capture" , type , [ options ] ) ;
}
/ * *
* The Capture interface exposes an interface to the camera and microphone of the hosting device .
* /
function Capture ( ) {
2012-04-24 02:37:33 +08:00
this . supportedAudioModes = [ ] ;
this . supportedImageModes = [ ] ;
this . supportedVideoModes = [ ] ;
2012-03-25 02:09:57 +08:00
}
/ * *
* Launch audio recorder application for recording audio clip ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureAudioOptions } options
* /
Capture . prototype . captureAudio = function ( successCallback , errorCallback , options ) {
_capture ( "captureAudio" , successCallback , errorCallback , options ) ;
} ;
/ * *
* Launch camera application for taking image ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureImageOptions } options
* /
Capture . prototype . captureImage = function ( successCallback , errorCallback , options ) {
_capture ( "captureImage" , successCallback , errorCallback , options ) ;
} ;
/ * *
* Launch device camera application for recording video ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureVideoOptions } options
* /
Capture . prototype . captureVideo = function ( successCallback , errorCallback , options ) {
_capture ( "captureVideo" , successCallback , errorCallback , options ) ;
} ;
module . exports = new Capture ( ) ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/compass.js
define ( "cordova/plugin/compass" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
utils = require ( 'cordova/utils' ) ,
CompassHeading = require ( 'cordova/plugin/CompassHeading' ) ,
CompassError = require ( 'cordova/plugin/CompassError' ) ,
timers = { } ,
compass = {
/ * *
* Asynchronously acquires the current heading .
* @ param { Function } successCallback The function to call when the heading
* data is available
2012-04-24 02:37:33 +08:00
* @ param { Function } errorCallback The function to call when there is an error
2012-03-25 02:09:57 +08:00
* getting the heading data .
* @ param { CompassOptions } options The options for getting the heading data ( not used ) .
* /
2012-04-10 08:11:13 +08:00
getCurrentHeading : function ( successCallback , errorCallback , options ) {
2012-03-25 02:09:57 +08:00
// successCallback required
if ( typeof successCallback !== "function" ) {
console . log ( "Compass Error: successCallback is not a function" ) ;
return ;
}
// errorCallback optional
if ( errorCallback && ( typeof errorCallback !== "function" ) ) {
console . log ( "Compass Error: errorCallback is not a function" ) ;
return ;
}
var win = function ( result ) {
var ch = new CompassHeading ( result . magneticHeading , result . trueHeading , result . headingAccuracy , result . timestamp ) ;
successCallback ( ch ) ;
} ;
var fail = function ( code ) {
var ce = new CompassError ( code ) ;
errorCallback ( ce ) ;
2012-04-24 02:37:33 +08:00
} ;
2012-03-25 02:09:57 +08:00
// Get heading
2012-04-10 08:11:13 +08:00
exec ( win , fail , "Compass" , "getHeading" , [ options ] ) ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* Asynchronously acquires the heading repeatedly at a given interval .
* @ param { Function } successCallback The function to call each time the heading
* data is available
2012-04-24 02:37:33 +08:00
* @ param { Function } errorCallback The function to call when there is an error
2012-03-25 02:09:57 +08:00
* getting the heading data .
* @ param { HeadingOptions } options The options for getting the heading data
2012-04-10 08:11:13 +08:00
* such as timeout and the frequency of the watch . For iOS , filter parameter
* specifies to watch via a distance filter rather than time .
2012-03-25 02:09:57 +08:00
* /
watchHeading : function ( successCallback , errorCallback , options ) {
// Default interval (100 msec)
var frequency = ( options !== undefined && options . frequency !== undefined ) ? options . frequency : 100 ;
2012-04-10 08:11:13 +08:00
var filter = ( options !== undefined && options . filter !== undefined ) ? options . filter : 0 ;
2012-03-25 02:09:57 +08:00
// successCallback required
if ( typeof successCallback !== "function" ) {
console . log ( "Compass Error: successCallback is not a function" ) ;
return ;
}
// errorCallback optional
if ( errorCallback && ( typeof errorCallback !== "function" ) ) {
console . log ( "Compass Error: errorCallback is not a function" ) ;
return ;
}
var id = utils . createUUID ( ) ;
2012-04-24 02:37:33 +08:00
if ( filter > 0 ) {
// is an iOS request for watch by filter, no timer needed
timers [ id ] = "iOS" ;
compass . getCurrentHeading ( successCallback , errorCallback , options ) ;
} else {
// Start watch timer to get headings
timers [ id ] = window . setInterval ( function ( ) {
compass . getCurrentHeading ( successCallback , errorCallback ) ;
} , frequency ) ;
}
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified heading watch .
* @ param { String } watchId The ID of the watch returned from # watchHeading .
* /
clearWatch : function ( id ) {
// Stop javascript timer & remove from timer list
if ( id && timers [ id ] ) {
2012-04-24 02:37:33 +08:00
if ( timers [ id ] != "iOS" ) {
clearInterval ( timers [ id ] ) ;
} else {
// is iOS watch by filter so call into device to stop
exec ( null , null , "Compass" , "stopHeading" , [ ] ) ;
}
delete timers [ id ] ;
2012-03-25 02:09:57 +08:00
}
}
} ;
module . exports = compass ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-05-25 00:31:11 +08:00
// file: lib/common/plugin/console-via-logger.js
define ( "cordova/plugin/console-via-logger" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-25 00:31:11 +08:00
//------------------------------------------------------------------------------
var logger = require ( "cordova/plugin/logger" ) ;
var utils = require ( "cordova/utils" ) ;
//------------------------------------------------------------------------------
// object that we're exporting
//------------------------------------------------------------------------------
var console = module . exports ;
//------------------------------------------------------------------------------
// copy of the original console object
//------------------------------------------------------------------------------
var WinConsole = window . console ;
//------------------------------------------------------------------------------
// whether to use the logger
//------------------------------------------------------------------------------
var UseLogger = false ;
//------------------------------------------------------------------------------
// Timers
//------------------------------------------------------------------------------
var Timers = { } ;
//------------------------------------------------------------------------------
// used for unimplemented methods
//------------------------------------------------------------------------------
function noop ( ) { }
//------------------------------------------------------------------------------
// used for unimplemented methods
//------------------------------------------------------------------------------
console . useLogger = function ( value ) {
if ( arguments . length ) UseLogger = ! ! value ;
if ( UseLogger ) {
if ( logger . useConsole ( ) ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
}
return UseLogger ;
} ;
//------------------------------------------------------------------------------
console . log = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . log . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . error = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . error . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . warn = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . warn . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . info = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . info . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . debug = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . debug . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . assert = function ( expression ) {
if ( expression ) return ;
var message = utils . vformat ( arguments [ 1 ] , [ ] . slice . call ( arguments , 2 ) ) ;
console . log ( "ASSERT: " + message ) ;
} ;
//------------------------------------------------------------------------------
console . clear = function ( ) { } ;
//------------------------------------------------------------------------------
console . dir = function ( object ) {
console . log ( "%o" , object ) ;
} ;
//------------------------------------------------------------------------------
console . dirxml = function ( node ) {
console . log ( node . innerHTML ) ;
} ;
//------------------------------------------------------------------------------
console . trace = noop ;
//------------------------------------------------------------------------------
console . group = console . log ;
//------------------------------------------------------------------------------
console . groupCollapsed = console . log ;
//------------------------------------------------------------------------------
console . groupEnd = noop ;
//------------------------------------------------------------------------------
console . time = function ( name ) {
Timers [ name ] = new Date ( ) . valueOf ( ) ;
} ;
//------------------------------------------------------------------------------
console . timeEnd = function ( name ) {
var timeStart = Timers [ name ] ;
if ( ! timeStart ) {
console . warn ( "unknown timer: " + name ) ;
return ;
}
var timeElapsed = new Date ( ) . valueOf ( ) - timeStart ;
console . log ( name + ": " + timeElapsed + "ms" ) ;
} ;
//------------------------------------------------------------------------------
console . timeStamp = noop ;
//------------------------------------------------------------------------------
console . profile = noop ;
//------------------------------------------------------------------------------
console . profileEnd = noop ;
//------------------------------------------------------------------------------
console . count = noop ;
//------------------------------------------------------------------------------
console . exception = console . log ;
//------------------------------------------------------------------------------
console . table = function ( data , columns ) {
console . log ( "%o" , data ) ;
} ;
//------------------------------------------------------------------------------
// return a new function that calls both functions passed as args
//------------------------------------------------------------------------------
function wrapperedOrigCall ( orgFunc , newFunc ) {
return function ( ) {
var args = [ ] . slice . call ( arguments ) ;
try { orgFunc . apply ( WinConsole , args ) ; } catch ( e ) { }
try { newFunc . apply ( console , args ) ; } catch ( e ) { }
} ;
}
//------------------------------------------------------------------------------
// For every function that exists in the original console object, that
// also exists in the new console object, wrap the new console method
// with one that calls both
//------------------------------------------------------------------------------
for ( var key in console ) {
if ( typeof WinConsole [ key ] == "function" ) {
console [ key ] = wrapperedOrigCall ( WinConsole [ key ] , console [ key ] ) ;
}
}
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/contacts.js
define ( "cordova/plugin/contacts" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
ContactError = require ( 'cordova/plugin/ContactError' ) ,
2012-05-01 04:42:38 +08:00
utils = require ( 'cordova/utils' ) ,
2012-03-25 02:09:57 +08:00
Contact = require ( 'cordova/plugin/Contact' ) ;
/ * *
* Represents a group of Contacts .
* @ constructor
* /
var contacts = {
/ * *
* Returns an array of Contacts matching the search criteria .
* @ param fields that should be searched
* @ param successCB success callback
* @ param errorCB error callback
* @ param { ContactFindOptions } options that can be applied to contact searching
* @ return array of Contacts matching search criteria
* /
find : function ( fields , successCB , errorCB , options ) {
if ( ! successCB ) {
throw new TypeError ( "You must specify a success callback for the find command." ) ;
}
2012-05-01 04:42:38 +08:00
if ( ! fields || ( utils . isArray ( fields ) && fields . length === 0 ) ) {
2012-03-25 02:09:57 +08:00
if ( typeof errorCB === "function" ) {
errorCB ( new ContactError ( ContactError . INVALID _ARGUMENT _ERROR ) ) ;
}
} else {
var win = function ( result ) {
var cs = [ ] ;
for ( var i = 0 , l = result . length ; i < l ; i ++ ) {
cs . push ( contacts . create ( result [ i ] ) ) ;
}
successCB ( cs ) ;
} ;
exec ( win , errorCB , "Contacts" , "search" , [ fields , options ] ) ;
}
} ,
/ * *
* This function creates a new contact , but it does not persist the contact
* to device storage . To persist the contact to device storage , invoke
* contact . save ( ) .
2012-08-25 04:44:18 +08:00
* @ param properties an object whose properties will be examined to create a new Contact
2012-03-25 02:09:57 +08:00
* @ returns new Contact object
* /
create : function ( properties ) {
var i ;
var contact = new Contact ( ) ;
for ( i in properties ) {
if ( typeof contact [ i ] !== 'undefined' && properties . hasOwnProperty ( i ) ) {
contact [ i ] = properties [ i ] ;
}
}
return contact ;
}
} ;
module . exports = contacts ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-07-13 04:37:08 +08:00
// file: lib/common/plugin/device.js
define ( "cordova/plugin/device" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-07-13 04:37:08 +08:00
var channel = require ( 'cordova/channel' ) ,
utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ;
// Tell cordova channel to wait on the CordovaInfoReady event
channel . waitForInitialization ( 'onCordovaInfoReady' ) ;
/ * *
* This represents the mobile device , and provides properties for inspecting the model , version , UUID of the
* phone , etc .
* @ constructor
* /
function Device ( ) {
this . available = false ;
this . platform = null ;
this . version = null ;
this . name = null ;
this . uuid = null ;
this . cordova = null ;
var me = this ;
2012-09-19 01:15:24 +08:00
channel . onCordovaReady . subscribe ( function ( ) {
2012-07-13 04:37:08 +08:00
me . getInfo ( function ( info ) {
me . available = true ;
me . platform = info . platform ;
me . version = info . version ;
me . name = info . name ;
me . uuid = info . uuid ;
me . cordova = info . cordova ;
channel . onCordovaInfoReady . fire ( ) ;
} , function ( e ) {
me . available = false ;
utils . alert ( "[ERROR] Error initializing Cordova: " + e ) ;
} ) ;
} ) ;
}
/ * *
* Get device info
*
* @ param { Function } successCallback The function to call when the heading data is available
* @ param { Function } errorCallback The function to call when there is an error getting the heading data . ( OPTIONAL )
* /
Device . prototype . getInfo = function ( successCallback , errorCallback ) {
// successCallback required
if ( typeof successCallback !== "function" ) {
console . log ( "Device Error: successCallback is not a function" ) ;
return ;
}
// errorCallback optional
if ( errorCallback && ( typeof errorCallback !== "function" ) ) {
console . log ( "Device Error: errorCallback is not a function" ) ;
return ;
}
// Get info
exec ( successCallback , errorCallback , "Device" , "getDeviceInfo" , [ ] ) ;
} ;
module . exports = new Device ( ) ;
2012-08-22 21:50:40 +08:00
} ) ;
// file: lib/common/plugin/echo.js
define ( "cordova/plugin/echo" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-08-22 21:50:40 +08:00
var exec = require ( 'cordova/exec' ) ;
/ * *
* Sends the given message through exec ( ) to the Echo plugink , which sends it back to the successCallback .
* @ param successCallback invoked with a FileSystem object
* @ param errorCallback invoked if error occurs retrieving file system
* @ param message The string to be echoed .
* @ param forceAsync Whether to force an async return value ( for testing native - > js bridge ) .
* /
module . exports = function ( successCallback , errorCallback , message , forceAsync ) {
var action = forceAsync ? 'echoAsync' : 'echo' ;
exec ( successCallback , errorCallback , "Echo" , action , [ message ] ) ;
} ;
2012-07-13 04:37:08 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/geolocation.js
define ( "cordova/plugin/geolocation" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
PositionError = require ( 'cordova/plugin/PositionError' ) ,
Position = require ( 'cordova/plugin/Position' ) ;
var timers = { } ; // list of timers in use
// Returns default params, overrides if provided with values
function parseParameters ( options ) {
var opt = {
2012-05-11 06:50:02 +08:00
maximumAge : 0 ,
2012-03-25 02:09:57 +08:00
enableHighAccuracy : false ,
2012-05-11 06:50:02 +08:00
timeout : Infinity
2012-03-25 02:09:57 +08:00
} ;
if ( options ) {
2012-05-11 06:50:02 +08:00
if ( options . maximumAge !== undefined && ! isNaN ( options . maximumAge ) && options . maximumAge > 0 ) {
2012-03-25 02:09:57 +08:00
opt . maximumAge = options . maximumAge ;
}
if ( options . enableHighAccuracy !== undefined ) {
opt . enableHighAccuracy = options . enableHighAccuracy ;
}
2012-05-11 06:50:02 +08:00
if ( options . timeout !== undefined && ! isNaN ( options . timeout ) ) {
if ( options . timeout < 0 ) {
opt . timeout = 0 ;
} else {
opt . timeout = options . timeout ;
}
2012-03-25 02:09:57 +08:00
}
}
return opt ;
}
2012-05-11 06:50:02 +08:00
// Returns a timeout failure, closed over a specified timeout value and error callback.
function createTimeout ( errorCallback , timeout ) {
var t = setTimeout ( function ( ) {
clearTimeout ( t ) ;
t = null ;
errorCallback ( {
code : PositionError . TIMEOUT ,
message : "Position retrieval timed out."
} ) ;
} , timeout ) ;
return t ;
}
2012-03-25 02:09:57 +08:00
var geolocation = {
2012-05-11 06:50:02 +08:00
lastPosition : null , // reference to last known (cached) position returned
2012-03-25 02:09:57 +08:00
/ * *
* Asynchronously aquires the current position .
*
* @ param { Function } successCallback The function to call when the position data is available
* @ param { Function } errorCallback The function to call when there is an error getting the heading position . ( OPTIONAL )
* @ param { PositionOptions } options The options for getting the position data . ( OPTIONAL )
* /
getCurrentPosition : function ( successCallback , errorCallback , options ) {
2012-05-11 06:50:02 +08:00
if ( arguments . length === 0 ) {
throw new Error ( "getCurrentPosition must be called with at least one argument." ) ;
}
2012-03-25 02:09:57 +08:00
options = parseParameters ( options ) ;
2012-05-11 06:50:02 +08:00
// Timer var that will fire an error callback if no position is retrieved from native
// before the "timeout" param provided expires
2012-09-19 01:15:24 +08:00
var timeoutTimer = { timer : null } ;
2012-05-11 06:50:02 +08:00
2012-03-25 02:09:57 +08:00
var win = function ( p ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timeoutTimer . timer ) ;
if ( ! ( timeoutTimer . timer ) ) {
2012-05-11 06:50:02 +08:00
// Timeout already happened, or native fired error callback for
// this geo request.
// Don't continue with success callback.
return ;
}
var pos = new Position (
2012-03-25 02:09:57 +08:00
{
latitude : p . latitude ,
longitude : p . longitude ,
altitude : p . altitude ,
accuracy : p . accuracy ,
heading : p . heading ,
velocity : p . velocity ,
altitudeAccuracy : p . altitudeAccuracy
} ,
2012-06-06 05:26:02 +08:00
( p . timestamp === undefined ? new Date ( ) : ( ( p . timestamp instanceof Date ) ? p . timestamp : new Date ( p . timestamp ) ) )
2012-05-11 06:50:02 +08:00
) ;
geolocation . lastPosition = pos ;
successCallback ( pos ) ;
2012-03-25 02:09:57 +08:00
} ;
var fail = function ( e ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timeoutTimer . timer ) ;
timeoutTimer . timer = null ;
2012-05-11 06:50:02 +08:00
var err = new PositionError ( e . code , e . message ) ;
if ( errorCallback ) {
errorCallback ( err ) ;
}
2012-03-25 02:09:57 +08:00
} ;
2012-05-11 06:50:02 +08:00
// Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
// fire the success callback with the cached position.
if ( geolocation . lastPosition && options . maximumAge && ( ( ( new Date ( ) ) . getTime ( ) - geolocation . lastPosition . timestamp . getTime ( ) ) <= options . maximumAge ) ) {
successCallback ( geolocation . lastPosition ) ;
// If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
} else if ( options . timeout === 0 ) {
fail ( {
code : PositionError . TIMEOUT ,
2012-08-25 04:44:18 +08:00
message : "timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
2012-05-11 06:50:02 +08:00
} ) ;
// Otherwise we have to call into native to retrieve a position.
} else {
if ( options . timeout !== Infinity ) {
// If the timeout value was not set to Infinity (default), then
// set up a timeout function that will fire the error callback
// if no successful position was retrieved before timeout expired.
2012-09-19 01:15:24 +08:00
timeoutTimer . timer = createTimeout ( fail , options . timeout ) ;
2012-05-11 06:50:02 +08:00
} else {
// This is here so the check in the win function doesn't mess stuff up
// may seem weird but this guarantees timeoutTimer is
// always truthy before we call into native
2012-09-19 01:15:24 +08:00
timeoutTimer . timer = true ;
2012-05-11 06:50:02 +08:00
}
exec ( win , fail , "Geolocation" , "getLocation" , [ options . enableHighAccuracy , options . maximumAge ] ) ;
}
return timeoutTimer ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* Asynchronously watches the geolocation for changes to geolocation . When a change occurs ,
* the successCallback is called with the new location .
*
* @ param { Function } successCallback The function to call each time the location data is available
* @ param { Function } errorCallback The function to call when there is an error getting the location data . ( OPTIONAL )
* @ param { PositionOptions } options The options for getting the location data such as frequency . ( OPTIONAL )
* @ return String The watch id that must be passed to # clearWatch to stop watching .
* /
watchPosition : function ( successCallback , errorCallback , options ) {
2012-05-11 06:50:02 +08:00
if ( arguments . length === 0 ) {
throw new Error ( "watchPosition must be called with at least one argument." ) ;
}
2012-03-25 02:09:57 +08:00
options = parseParameters ( options ) ;
var id = utils . createUUID ( ) ;
2012-05-11 06:50:02 +08:00
// Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
timers [ id ] = geolocation . getCurrentPosition ( successCallback , errorCallback , options ) ;
var fail = function ( e ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
2012-05-11 06:50:02 +08:00
var err = new PositionError ( e . code , e . message ) ;
if ( errorCallback ) {
errorCallback ( err ) ;
}
} ;
var win = function ( p ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
2012-05-11 06:50:02 +08:00
if ( options . timeout !== Infinity ) {
2012-09-19 01:15:24 +08:00
timers [ id ] . timer = createTimeout ( fail , options . timeout ) ;
2012-05-11 06:50:02 +08:00
}
var pos = new Position (
{
latitude : p . latitude ,
longitude : p . longitude ,
altitude : p . altitude ,
accuracy : p . accuracy ,
heading : p . heading ,
velocity : p . velocity ,
altitudeAccuracy : p . altitudeAccuracy
} ,
2012-06-06 05:26:02 +08:00
( p . timestamp === undefined ? new Date ( ) : ( ( p . timestamp instanceof Date ) ? p . timestamp : new Date ( p . timestamp ) ) )
2012-05-11 06:50:02 +08:00
) ;
geolocation . lastPosition = pos ;
successCallback ( pos ) ;
} ;
exec ( win , fail , "Geolocation" , "addWatch" , [ id , options . enableHighAccuracy ] ) ;
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified heading watch .
*
* @ param { String } id The ID of the watch returned from # watchPosition
* /
clearWatch : function ( id ) {
if ( id && timers [ id ] !== undefined ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
timers [ id ] . timer = false ;
2012-05-11 06:50:02 +08:00
exec ( null , null , "Geolocation" , "clearWatch" , [ id ] ) ;
2012-03-25 02:09:57 +08:00
}
}
} ;
module . exports = geolocation ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-09-20 02:08:52 +08:00
// file: lib/common/plugin/globalization.js
define ( "cordova/plugin/globalization" , function ( require , exports , module ) {
var exec = require ( 'cordova/exec' ) ,
GlobalizationError = require ( 'cordova/plugin/GlobalizationError' ) ;
var globalization = {
getPreferredLanguage : function ( successCB , failureCB ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getPreferredLanguage Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getPreferredLanguage Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getPreferredLanguage" , [ ] ) ;
} ,
/ * *
* Returns the string identifier for the client ' s current locale setting .
* It returns the locale identifier string to the successCB callback with a
* properties object as a parameter . If there is an error getting the locale ,
* then the errorCB callback is invoked .
*
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . value { String } : The locale identifier
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getLocaleName ( function ( locale ) { alert ( 'locale:' + locale . value + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getLocaleName : function ( successCB , failureCB ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getLocaleName Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getLocaleName Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getLocaleName" , [ ] ) ;
} ,
/ * *
* Returns a date formatted as a string according to the client ' s user preferences and
* calendar using the time zone of the client . It returns the formatted date string to the
* successCB callback with a properties object as a parameter . If there is an error
* formatting the date , then the errorCB callback is invoked .
*
* The defaults are : formatLenght = "short" and selector = "date and time"
*
* @ param { Date } date
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . value { String } : The localized date string
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . dateToString ( new Date ( ) ,
* function ( date ) { alert ( 'date:' + date . value + '\n' ) ; } ,
* function ( errorCode ) { alert ( errorCode ) ; } ,
* { formatLength : 'short' } ) ;
* /
dateToString : function ( date , successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.dateToString Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.dateToString Error: failureCB is not a function" ) ;
return ;
}
if ( date instanceof Date ) {
var dateValue ;
dateValue = date . valueOf ( ) ;
exec ( successCB , failureCB , "Globalization" , "dateToString" , [ { "date" : dateValue , "options" : options } ] ) ;
}
else {
console . log ( "Globalization.dateToString Error: date is not a Date object" ) ;
}
} ,
/ * *
* Parses a date formatted as a string according to the client ' s user
* preferences and calendar using the time zone of the client and returns
* the corresponding date object . It returns the date to the successCB
* callback with a properties object as a parameter . If there is an error
* parsing the date string , then the errorCB callback is invoked .
*
* The defaults are : formatLength = "short" and selector = "date and time"
*
* @ param { String } dateString
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . year { Number } : The four digit year
* Object . month { Number } : The month from ( 0 - 11 )
* Object . day { Number } : The day from ( 1 - 31 )
* Object . hour { Number } : The hour from ( 0 - 23 )
* Object . minute { Number } : The minute from ( 0 - 59 )
* Object . second { Number } : The second from ( 0 - 59 )
* Object . millisecond { Number } : The milliseconds ( from 0 - 999 ) ,
* not available on all platforms
*
* @ error GlobalizationError . PARSING _ERROR
*
* Example
* globalization . stringToDate ( '4/11/2011' ,
* function ( date ) { alert ( 'Month:' + date . month + '\n' +
* 'Day:' + date . day + '\n' +
* 'Year:' + date . year + '\n' ) ; } ,
* function ( errorCode ) { alert ( errorCode ) ; } ,
* { selector : 'date' } ) ;
* /
stringToDate : function ( dateString , successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.stringToDate Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.stringToDate Error: failureCB is not a function" ) ;
return ;
}
if ( typeof dateString == "string" ) {
exec ( successCB , failureCB , "Globalization" , "stringToDate" , [ { "dateString" : dateString , "options" : options } ] ) ;
}
else {
console . log ( "Globalization.stringToDate Error: dateString is not a string" ) ;
}
} ,
/ * *
* Returns a pattern string for formatting and parsing dates according to the client ' s
* user preferences . It returns the pattern to the successCB callback with a
* properties object as a parameter . If there is an error obtaining the pattern ,
* then the errorCB callback is invoked .
*
* The defaults are : formatLength = "short" and selector = "date and time"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . pattern { String } : The date and time pattern for formatting and parsing dates .
* The patterns follow Unicode Technical Standard # 35
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . timezone { String } : The abbreviated name of the time zone on the client
* Object . utc _offset { Number } : The current difference in seconds between the client ' s
* time zone and coordinated universal time .
* Object . dst _offset { Number } : The current daylight saving time offset in seconds
* between the client 's non-daylight saving' s time zone
* and the client 's daylight saving' s time zone .
*
* @ error GlobalizationError . PATTERN _ERROR
*
* Example
* globalization . getDatePattern (
* function ( date ) { alert ( 'pattern:' + date . pattern + '\n' ) ; } ,
* function ( ) { } ,
* { formatLength : 'short' } ) ;
* /
getDatePattern : function ( successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getDatePattern Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getDatePattern Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getDatePattern" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns an array of either the names of the months or days of the week
* according to the client ' s user preferences and calendar . It returns the array of names to the
* successCB callback with a properties object as a parameter . If there is an error obtaining the
* names , then the errorCB callback is invoked .
*
* The defaults are : type = "wide" and item = "months"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'narrow' or 'wide'
* item { String } : 'months' , or 'days'
*
* @ return Object . value { Array { String } } : The array of names starting from either
* the first month in the year or the
* first day of the week .
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getDateNames ( function ( names ) {
* for ( var i = 0 ; i < names . value . length ; i ++ ) {
* alert ( 'Month:' + names . value [ i ] + '\n' ) ; } } ,
* function ( ) { } ) ;
* /
getDateNames : function ( successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getDateNames Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getDateNames Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getDateNames" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns whether daylight savings time is in effect for a given date using the client ' s
* time zone and calendar . It returns whether or not daylight savings time is in effect
* to the successCB callback with a properties object as a parameter . If there is an error
* reading the date , then the errorCB callback is invoked .
*
* @ param { Date } date
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . dst { Boolean } : The value "true" indicates that daylight savings time is
* in effect for the given date and "false" indicate that it is not .
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . isDayLightSavingsTime ( new Date ( ) ,
* function ( date ) { alert ( 'dst:' + date . dst + '\n' ) ; }
* function ( ) { } ) ;
* /
isDayLightSavingsTime : function ( date , successCB , failureCB ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.isDayLightSavingsTime Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.isDayLightSavingsTime Error: failureCB is not a function" ) ;
return ;
}
if ( date instanceof Date ) {
var dateValue ;
dateValue = date . valueOf ( ) ;
exec ( successCB , failureCB , "Globalization" , "isDayLightSavingsTime" , [ { "date" : dateValue } ] ) ;
}
else {
console . log ( "Globalization.isDayLightSavingsTime Error: date is not a Date object" ) ;
}
} ,
/ * *
* Returns the first day of the week according to the client ' s user preferences and calendar .
* The days of the week are numbered starting from 1 where 1 is considered to be Sunday .
* It returns the day to the successCB callback with a properties object as a parameter .
* If there is an error obtaining the pattern , then the errorCB callback is invoked .
*
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . value { Number } : The number of the first day of the week .
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getFirstDayOfWeek ( function ( day )
* { alert ( 'Day:' + day . value + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getFirstDayOfWeek : function ( successCB , failureCB ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getFirstDayOfWeek Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getFirstDayOfWeek Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getFirstDayOfWeek" , [ ] ) ;
} ,
/ * *
* Returns a number formatted as a string according to the client ' s user preferences .
* It returns the formatted number string to the successCB callback with a properties object as a
* parameter . If there is an error formatting the number , then the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { Number } number
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . value { String } : The formatted number string .
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . numberToString ( 3.25 ,
* function ( number ) { alert ( 'number:' + number . value + '\n' ) ; } ,
* function ( ) { } ,
* { type : 'decimal' } ) ;
* /
numberToString : function ( number , successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.numberToString Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.numberToString Error: failureCB is not a function" ) ;
return ;
}
if ( typeof number == "number" ) {
exec ( successCB , failureCB , "Globalization" , "numberToString" , [ { "number" : number , "options" : options } ] ) ;
}
else {
console . log ( "Globalization.numberToString Error: number is not a number" ) ;
}
} ,
/ * *
* Parses a number formatted as a string according to the client ' s user preferences and
* returns the corresponding number . It returns the number to the successCB callback with a
* properties object as a parameter . If there is an error parsing the number string , then
* the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { String } numberString
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . value { Number } : The parsed number .
*
* @ error GlobalizationError . PARSING _ERROR
*
* Example
* globalization . stringToNumber ( '1234.56' ,
* function ( number ) { alert ( 'Number:' + number . value + '\n' ) ; } ,
* function ( ) { alert ( 'Error parsing number' ) ; } ) ;
* /
stringToNumber : function ( numberString , successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.stringToNumber Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.stringToNumber Error: failureCB is not a function" ) ;
return ;
}
if ( typeof numberString == "string" ) {
exec ( successCB , failureCB , "Globalization" , "stringToNumber" , [ { "numberString" : numberString , "options" : options } ] ) ;
}
else {
console . log ( "Globalization.stringToNumber Error: numberString is not a string" ) ;
}
} ,
/ * *
* Returns a pattern string for formatting and parsing numbers according to the client ' s user
* preferences . It returns the pattern to the successCB callback with a properties object as a
* parameter . If there is an error obtaining the pattern , then the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . pattern { String } : The number pattern for formatting and parsing numbers .
* The patterns follow Unicode Technical Standard # 35.
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . symbol { String } : The symbol to be used when formatting and parsing
* e . g . , percent or currency symbol .
* Object . fraction { Number } : The number of fractional digits to use when parsing and
* formatting numbers .
* Object . rounding { Number } : The rounding increment to use when parsing and formatting .
* Object . positive { String } : The symbol to use for positive numbers when parsing and formatting .
* Object . negative : { String } : The symbol to use for negative numbers when parsing and formatting .
* Object . decimal : { String } : The decimal symbol to use for parsing and formatting .
* Object . grouping : { String } : The grouping symbol to use for parsing and formatting .
*
* @ error GlobalizationError . PATTERN _ERROR
*
* Example
* globalization . getNumberPattern (
* function ( pattern ) { alert ( 'Pattern:' + pattern . pattern + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getNumberPattern : function ( successCB , failureCB , options ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getNumberPattern Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getNumberPattern Error: failureCB is not a function" ) ;
return ;
}
exec ( successCB , failureCB , "Globalization" , "getNumberPattern" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns a pattern string for formatting and parsing currency values according to the client ' s
* user preferences and ISO 4217 currency code . It returns the pattern to the successCB callback with a
* properties object as a parameter . If there is an error obtaining the pattern , then the errorCB
* callback is invoked .
*
* @ param { String } currencyCode
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . pattern { String } : The currency pattern for formatting and parsing currency values .
* The patterns follow Unicode Technical Standard # 35
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . code { String } : The ISO 4217 currency code for the pattern .
* Object . fraction { Number } : The number of fractional digits to use when parsing and
* formatting currency .
* Object . rounding { Number } : The rounding increment to use when parsing and formatting .
* Object . decimal : { String } : The decimal symbol to use for parsing and formatting .
* Object . grouping : { String } : The grouping symbol to use for parsing and formatting .
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . getCurrencyPattern ( 'EUR' ,
* function ( currency ) { alert ( 'Pattern:' + currency . pattern + '\n' ) ; }
* function ( ) { } ) ;
* /
getCurrencyPattern : function ( currencyCode , successCB , failureCB ) {
// successCallback required
if ( typeof successCB != "function" ) {
console . log ( "Globalization.getCurrencyPattern Error: successCB is not a function" ) ;
return ;
}
// errorCallback required
if ( typeof failureCB != "function" ) {
console . log ( "Globalization.getCurrencyPattern Error: failureCB is not a function" ) ;
return ;
}
if ( typeof currencyCode == "string" ) {
exec ( successCB , failureCB , "Globalization" , "getCurrencyPattern" , [ { "currencyCode" : currencyCode } ] ) ;
}
else {
console . log ( "Globalization.getCurrencyPattern Error: currencyCode is not a currency code" ) ;
}
}
} ;
module . exports = globalization ;
} ) ;
2012-05-25 00:31:11 +08:00
// file: lib/common/plugin/logger.js
define ( "cordova/plugin/logger" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-25 00:31:11 +08:00
//------------------------------------------------------------------------------
// The logger module exports the following properties/functions:
//
// LOG - constant for the level LOG
// ERROR - constant for the level ERROR
// WARN - constant for the level WARN
// INFO - constant for the level INFO
// DEBUG - constant for the level DEBUG
// logLevel() - returns current log level
// logLevel(value) - sets and returns a new log level
// useConsole() - returns whether logger is using console
// useConsole(value) - sets and returns whether logger is using console
// log(message,...) - logs a message at level LOG
// error(message,...) - logs a message at level ERROR
// warn(message,...) - logs a message at level WARN
// info(message,...) - logs a message at level INFO
// debug(message,...) - logs a message at level DEBUG
// logLevel(level,message,...) - logs a message specified level
//
//------------------------------------------------------------------------------
var logger = exports ;
var exec = require ( 'cordova/exec' ) ;
var utils = require ( 'cordova/utils' ) ;
var UseConsole = true ;
var Queued = [ ] ;
var DeviceReady = false ;
var CurrentLevel ;
/ * *
* Logging levels
* /
var Levels = [
"LOG" ,
"ERROR" ,
"WARN" ,
"INFO" ,
"DEBUG"
] ;
/ *
* add the logging levels to the logger object and
* to a separate levelsMap object for testing
* /
var LevelsMap = { } ;
for ( var i = 0 ; i < Levels . length ; i ++ ) {
var level = Levels [ i ] ;
LevelsMap [ level ] = i ;
logger [ level ] = level ;
}
CurrentLevel = LevelsMap . WARN ;
/ * *
* Getter / Setter for the logging level
*
* Returns the current logging level .
*
* When a value is passed , sets the logging level to that value .
* The values should be one of the following constants :
* logger . LOG
* logger . ERROR
* logger . WARN
* logger . INFO
* logger . DEBUG
*
* The value used determines which messages get printed . The logging
* values above are in order , and only messages logged at the logging
2012-08-25 04:44:18 +08:00
* level or above will actually be displayed to the user . E . g . , the
2012-05-25 00:31:11 +08:00
* default level is WARN , so only messages logged with LOG , ERROR , or
* WARN will be displayed ; INFO and DEBUG messages will be ignored .
* /
logger . level = function ( value ) {
if ( arguments . length ) {
if ( LevelsMap [ value ] === null ) {
throw new Error ( "invalid logging level: " + value ) ;
}
CurrentLevel = LevelsMap [ value ] ;
}
return Levels [ CurrentLevel ] ;
} ;
/ * *
* Getter / Setter for the useConsole functionality
*
* When useConsole is true , the logger will log via the
* browser 'console' object . Otherwise , it will use the
* native Logger plugin .
* /
logger . useConsole = function ( value ) {
if ( arguments . length ) UseConsole = ! ! value ;
if ( UseConsole ) {
if ( typeof console == "undefined" ) {
throw new Error ( "global console object is not defined" ) ;
}
if ( typeof console . log != "function" ) {
throw new Error ( "global console object does not have a log function" ) ;
}
if ( typeof console . useLogger == "function" ) {
if ( console . useLogger ( ) ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
}
}
return UseConsole ;
} ;
/ * *
* Logs a message at the LOG level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . log = function ( message ) { logWithArgs ( "LOG" , arguments ) ; } ;
/ * *
* Logs a message at the ERROR level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . error = function ( message ) { logWithArgs ( "ERROR" , arguments ) ; } ;
/ * *
* Logs a message at the WARN level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . warn = function ( message ) { logWithArgs ( "WARN" , arguments ) ; } ;
/ * *
* Logs a message at the INFO level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . info = function ( message ) { logWithArgs ( "INFO" , arguments ) ; } ;
/ * *
* Logs a message at the DEBUG level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . debug = function ( message ) { logWithArgs ( "DEBUG" , arguments ) ; } ;
// log at the specified level with args
function logWithArgs ( level , args ) {
args = [ level ] . concat ( [ ] . slice . call ( args ) ) ;
logger . logLevel . apply ( logger , args ) ;
}
/ * *
* Logs a message at the specified level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . logLevel = function ( level , message /* , ... */ ) {
// format the message with the parameters
var formatArgs = [ ] . slice . call ( arguments , 2 ) ;
message = utils . vformat ( message , formatArgs ) ;
if ( LevelsMap [ level ] === null ) {
throw new Error ( "invalid logging level: " + level ) ;
}
if ( LevelsMap [ level ] > CurrentLevel ) return ;
// queue the message if not yet at deviceready
if ( ! DeviceReady && ! UseConsole ) {
Queued . push ( [ level , message ] ) ;
return ;
}
// if not using the console, use the native logger
if ( ! UseConsole ) {
exec ( null , null , "Logger" , "logLevel" , [ level , message ] ) ;
return ;
}
// make sure console is not using logger
if ( console . _ _usingCordovaLogger ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
// log to the console
switch ( level ) {
case logger . LOG : console . log ( message ) ; break ;
case logger . ERROR : console . log ( "ERROR: " + message ) ; break ;
case logger . WARN : console . log ( "WARN: " + message ) ; break ;
case logger . INFO : console . log ( "INFO: " + message ) ; break ;
case logger . DEBUG : console . log ( "DEBUG: " + message ) ; break ;
}
} ;
// when deviceready fires, log queued messages
logger . _ _onDeviceReady = function ( ) {
if ( DeviceReady ) return ;
DeviceReady = true ;
for ( var i = 0 ; i < Queued . length ; i ++ ) {
var messageArgs = Queued [ i ] ;
logger . logLevel ( messageArgs [ 0 ] , messageArgs [ 1 ] ) ;
}
Queued = null ;
} ;
// add a deviceready event to log queued messages
document . addEventListener ( "deviceready" , logger . _ _onDeviceReady , false ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/network.js
define ( "cordova/plugin/network" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
cordova = require ( 'cordova' ) ,
2012-09-19 01:15:24 +08:00
channel = require ( 'cordova/channel' ) ,
utils = require ( 'cordova/utils' ) ;
// Link the onLine property with the Cordova-supplied network info.
// This works because we clobber the naviagtor object with our own
// object in bootstrap.js.
if ( typeof navigator != 'undefined' ) {
utils . defineGetter ( navigator , 'onLine' , function ( ) {
return this . connection . type != 'none' ;
} ) ;
}
2012-03-25 02:09:57 +08:00
var NetworkConnection = function ( ) {
2012-03-31 03:29:26 +08:00
this . type = null ;
this . _firstRun = true ;
this . _timer = null ;
this . timeout = 500 ;
2012-03-25 02:09:57 +08:00
2012-03-31 03:29:26 +08:00
var me = this ;
2012-09-19 01:15:24 +08:00
channel . onCordovaReady . subscribe ( function ( ) {
2012-03-31 03:29:26 +08:00
me . getInfo ( function ( info ) {
me . type = info ;
if ( info === "none" ) {
// set a timer if still offline at the end of timer send the offline event
me . _timer = setTimeout ( function ( ) {
cordova . fireDocumentEvent ( "offline" ) ;
me . _timer = null ;
} , me . timeout ) ;
} else {
// If there is a current offline event pending clear it
if ( me . _timer !== null ) {
clearTimeout ( me . _timer ) ;
me . _timer = null ;
2012-03-25 02:09:57 +08:00
}
2012-03-31 03:29:26 +08:00
cordova . fireDocumentEvent ( "online" ) ;
}
// should only fire this once
if ( me . _firstRun ) {
me . _firstRun = false ;
channel . onCordovaConnectionReady . fire ( ) ;
}
} ,
function ( e ) {
// If we can't get the network info we should still tell Cordova
// to fire the deviceready event.
if ( me . _firstRun ) {
me . _firstRun = false ;
channel . onCordovaConnectionReady . fire ( ) ;
}
console . log ( "Error initializing Network Connection: " + e ) ;
} ) ;
} ) ;
2012-03-25 02:09:57 +08:00
} ;
/ * *
* Get connection info
*
* @ param { Function } successCallback The function to call when the Connection data is available
* @ param { Function } errorCallback The function to call when there is an error getting the Connection data . ( OPTIONAL )
* /
NetworkConnection . prototype . getInfo = function ( successCallback , errorCallback ) {
// Get info
2012-03-29 04:47:45 +08:00
exec ( successCallback , errorCallback , "NetworkStatus" , "getConnectionInfo" , [ ] ) ;
2012-03-25 02:09:57 +08:00
} ;
module . exports = new NetworkConnection ( ) ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/notification.js
define ( "cordova/plugin/notification" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ;
/ * *
* Provides access to notifications on the device .
* /
module . exports = {
/ * *
* Open a native alert dialog , with a customizable title and button text .
*
* @ param { String } message Message to print in the body of the alert
* @ param { Function } completeCallback The callback that is called when user clicks on a button .
* @ param { String } title Title of the alert dialog ( default : Alert )
* @ param { String } buttonLabel Label of the close button ( default : OK )
* /
alert : function ( message , completeCallback , title , buttonLabel ) {
var _title = ( title || "Alert" ) ;
var _buttonLabel = ( buttonLabel || "OK" ) ;
exec ( completeCallback , null , "Notification" , "alert" , [ message , _title , _buttonLabel ] ) ;
} ,
/ * *
* Open a native confirm dialog , with a customizable title and button text .
* The result that the user selects is returned to the result callback .
*
* @ param { String } message Message to print in the body of the alert
* @ param { Function } resultCallback The callback that is called when user clicks on a button .
* @ param { String } title Title of the alert dialog ( default : Confirm )
* @ param { String } buttonLabels Comma separated list of the labels of the buttons ( default : 'OK,Cancel' )
* /
confirm : function ( message , resultCallback , title , buttonLabels ) {
var _title = ( title || "Confirm" ) ;
var _buttonLabels = ( buttonLabels || "OK,Cancel" ) ;
exec ( resultCallback , null , "Notification" , "confirm" , [ message , _title , _buttonLabels ] ) ;
} ,
/ * *
* Causes the device to vibrate .
*
* @ param { Integer } mills The number of milliseconds to vibrate for .
* /
vibrate : function ( mills ) {
exec ( null , null , "Notification" , "vibrate" , [ mills ] ) ;
} ,
/ * *
* Causes the device to beep .
* On Android , the default notification ringtone is played "count" times .
*
* @ param { Integer } count The number of beeps .
* /
beep : function ( count ) {
exec ( null , null , "Notification" , "beep" , [ count ] ) ;
}
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/requestFileSystem.js
define ( "cordova/plugin/requestFileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var FileError = require ( 'cordova/plugin/FileError' ) ,
FileSystem = require ( 'cordova/plugin/FileSystem' ) ,
exec = require ( 'cordova/exec' ) ;
/ * *
* Request a file system in which to store application data .
* @ param type local file system type
* @ param size indicates how much storage space , in bytes , the application expects to need
* @ param successCallback invoked with a FileSystem object
* @ param errorCallback invoked if error occurs retrieving file system
* /
var requestFileSystem = function ( type , size , successCallback , errorCallback ) {
var fail = function ( code ) {
if ( typeof errorCallback === 'function' ) {
errorCallback ( new FileError ( code ) ) ;
}
} ;
if ( type < 0 || type > 3 ) {
fail ( FileError . SYNTAX _ERR ) ;
} else {
// if successful, return a FileSystem object
var success = function ( file _system ) {
if ( file _system ) {
if ( typeof successCallback === 'function' ) {
// grab the name and root from the file system object
var result = new FileSystem ( file _system . name , file _system . root ) ;
successCallback ( result ) ;
}
}
else {
// no FileSystem object returned
fail ( FileError . NOT _FOUND _ERR ) ;
}
} ;
exec ( success , fail , "File" , "requestFileSystem" , [ type , size ] ) ;
}
} ;
module . exports = requestFileSystem ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/resolveLocalFileSystemURI.js
define ( "cordova/plugin/resolveLocalFileSystemURI" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ,
FileEntry = require ( 'cordova/plugin/FileEntry' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-03-25 02:09:57 +08:00
exec = require ( 'cordova/exec' ) ;
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Look up file system Entry referred to by local URI .
* @ param { DOMString } uri URI referring to a local file or directory
* @ param successCallback invoked with Entry object corresponding to URI
* @ param errorCallback invoked if error occurs retrieving file system entry
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
module . exports = function ( uri , successCallback , errorCallback ) {
// error callback
var fail = function ( error ) {
if ( typeof errorCallback === 'function' ) {
errorCallback ( new FileError ( error ) ) ;
}
} ;
2012-05-25 09:39:45 +08:00
// sanity check for 'not:valid:filename'
if ( ! uri || uri . split ( ":" ) . length > 2 ) {
setTimeout ( function ( ) {
fail ( FileError . ENCODING _ERR ) ;
} , 0 ) ;
return ;
}
2012-03-25 02:09:57 +08:00
// if successful, return either a file or directory entry
var success = function ( entry ) {
var result ;
if ( entry ) {
if ( typeof successCallback === 'function' ) {
// create appropriate Entry object
result = ( entry . isDirectory ) ? new DirectoryEntry ( entry . name , entry . fullPath ) : new FileEntry ( entry . name , entry . fullPath ) ;
try {
successCallback ( result ) ;
}
catch ( e ) {
console . log ( 'Error invoking callback: ' + e ) ;
}
2012-02-18 07:28:35 +08:00
}
}
2012-03-25 02:09:57 +08:00
else {
// no Entry object returned
fail ( FileError . NOT _FOUND _ERR ) ;
}
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
exec ( success , fail , "File" , "resolveLocalFileSystemURI" , [ uri ] ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-05-11 06:50:02 +08:00
// file: lib/common/plugin/splashscreen.js
define ( "cordova/plugin/splashscreen" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
var exec = require ( 'cordova/exec' ) ;
var splashscreen = {
2012-06-22 02:12:30 +08:00
show : function ( ) {
exec ( null , null , "SplashScreen" , "show" , [ ] ) ;
} ,
2012-05-11 06:50:02 +08:00
hide : function ( ) {
exec ( null , null , "SplashScreen" , "hide" , [ ] ) ;
}
} ;
module . exports = splashscreen ;
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/utils.js
define ( "cordova/utils" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
var utils = exports ;
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
/ * *
* Defines a property getter for obj [ key ] .
* /
utils . defineGetter = function ( obj , key , func ) {
if ( Object . defineProperty ) {
Object . defineProperty ( obj , key , { get : func } ) ;
} else {
obj . _ _defineGetter _ _ ( key , func ) ;
}
} ;
2012-05-11 06:50:02 +08:00
/ * *
* Returns an indication of whether the argument is an array or not
* /
utils . isArray = function ( a ) {
return Object . prototype . toString . call ( a ) == '[object Array]' ;
} ;
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Returns an indication of whether the argument is a Date or not
* /
utils . isDate = function ( d ) {
return Object . prototype . toString . call ( d ) == '[object Date]' ;
} ;
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Does a deep clone of the object .
* /
utils . clone = function ( obj ) {
if ( ! obj || typeof obj == 'function' || utils . isDate ( obj ) || typeof obj != 'object' ) {
return obj ;
}
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
var retVal , i ;
if ( utils . isArray ( obj ) ) {
retVal = [ ] ;
for ( i = 0 ; i < obj . length ; ++ i ) {
retVal . push ( utils . clone ( obj [ i ] ) ) ;
2012-03-25 02:09:57 +08:00
}
return retVal ;
2012-05-11 06:50:02 +08:00
}
2012-03-25 02:09:57 +08:00
2012-05-11 06:50:02 +08:00
retVal = { } ;
for ( i in obj ) {
if ( ! ( i in retVal ) || retVal [ i ] != obj [ i ] ) {
retVal [ i ] = utils . clone ( obj [ i ] ) ;
2012-03-25 02:09:57 +08:00
}
2012-05-11 06:50:02 +08:00
}
return retVal ;
} ;
2012-03-25 02:09:57 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Returns a wrappered version of the function
* /
utils . close = function ( context , func , params ) {
if ( typeof params == 'undefined' ) {
return function ( ) {
return func . apply ( context , arguments ) ;
} ;
} else {
return function ( ) {
return func . apply ( context , params ) ;
2012-03-25 02:09:57 +08:00
} ;
2012-05-11 06:50:02 +08:00
}
} ;
2012-02-18 07:28:35 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Create a UUID
* /
utils . createUUID = function ( ) {
return UUIDcreatePart ( 4 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 6 ) ;
} ;
/ * *
* Extends a child object from a parent object using classical inheritance
* pattern .
* /
utils . extend = ( function ( ) {
// proxy used to establish prototype chain
var F = function ( ) { } ;
// extend Child from Parent
return function ( Child , Parent ) {
F . prototype = Parent . prototype ;
Child . prototype = new F ( ) ;
Child . _ _super _ _ = Parent . prototype ;
Child . prototype . constructor = Child ;
} ;
} ( ) ) ;
/ * *
* Alerts a message in any available way : alert or console . log .
* /
utils . alert = function ( msg ) {
if ( alert ) {
alert ( msg ) ;
} else if ( console && console . log ) {
console . log ( msg ) ;
}
} ;
/ * *
* Formats a string and arguments following it ala sprintf ( )
*
2012-05-25 00:31:11 +08:00
* see utils . vformat ( ) for more information
* /
utils . format = function ( formatString /* ,... */ ) {
var args = [ ] . slice . call ( arguments , 1 ) ;
return utils . vformat ( formatString , args ) ;
} ;
/ * *
* Formats a string and arguments following it ala vsprintf ( )
*
2012-05-11 06:50:02 +08:00
* format chars :
* % j - format arg as JSON
* % o - format arg as JSON
* % c - format arg as ''
* % % - replace with '%'
* any other char following % will format it ' s
* arg via toString ( ) .
*
* for rationale , see FireBug ' s Console API :
* http : //getfirebug.com/wiki/index.php/Console_API
* /
2012-05-25 00:31:11 +08:00
utils . vformat = function ( formatString , args ) {
2012-05-11 06:50:02 +08:00
if ( formatString === null || formatString === undefined ) return "" ;
if ( arguments . length == 1 ) return formatString . toString ( ) ;
2012-06-06 05:26:02 +08:00
if ( typeof formatString != "string" ) return formatString . toString ( ) ;
2012-05-11 06:50:02 +08:00
var pattern = /(.*?)%(.)(.*)/ ;
2012-06-06 05:26:02 +08:00
var rest = formatString ;
2012-05-11 06:50:02 +08:00
var result = [ ] ;
while ( args . length ) {
var arg = args . shift ( ) ;
var match = pattern . exec ( rest ) ;
if ( ! match ) break ;
rest = match [ 3 ] ;
result . push ( match [ 1 ] ) ;
if ( match [ 2 ] == '%' ) {
result . push ( '%' ) ;
args . unshift ( arg ) ;
continue ;
2012-03-29 04:47:45 +08:00
}
2012-05-11 06:50:02 +08:00
result . push ( formatted ( arg , match [ 2 ] ) ) ;
2012-03-29 04:47:45 +08:00
}
2012-05-11 06:50:02 +08:00
result . push ( rest ) ;
return result . join ( '' ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-05-11 06:50:02 +08:00
//------------------------------------------------------------------------------
function UUIDcreatePart ( length ) {
var uuidpart = "" ;
for ( var i = 0 ; i < length ; i ++ ) {
var uuidchar = parseInt ( ( Math . random ( ) * 256 ) , 10 ) . toString ( 16 ) ;
if ( uuidchar . length == 1 ) {
uuidchar = "0" + uuidchar ;
}
uuidpart += uuidchar ;
}
return uuidpart ;
}
//------------------------------------------------------------------------------
function formatted ( object , formatChar ) {
2012-06-06 05:26:02 +08:00
try {
switch ( formatChar ) {
case 'j' :
case 'o' : return JSON . stringify ( object ) ;
case 'c' : return '' ;
}
}
catch ( e ) {
return "error JSON.stringify()ing argument: " + e ;
2012-05-11 06:50:02 +08:00
}
2012-06-06 05:26:02 +08:00
if ( ( object === null ) || ( object === undefined ) ) {
return Object . prototype . toString . call ( object ) ;
}
2012-05-11 06:50:02 +08:00
return object . toString ( ) ;
}
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
window . cordova = require ( 'cordova' ) ;
2012-03-25 02:09:57 +08:00
// file: lib/scripts/bootstrap.js
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
( function ( context ) {
2012-09-19 01:15:24 +08:00
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
if ( typeof navigator != 'undefined' ) {
function CordovaNavigator ( ) { }
CordovaNavigator . prototype = navigator ;
navigator = new CordovaNavigator ( ) ;
}
2012-02-18 07:28:35 +08:00
var channel = require ( "cordova/channel" ) ,
_self = {
boot : function ( ) {
/ * *
* Create all cordova objects once page has fully loaded and native side is ready .
* /
channel . join ( function ( ) {
var builder = require ( 'cordova/builder' ) ,
base = require ( 'cordova/common' ) ,
platform = require ( 'cordova/platform' ) ;
// Drop the common globals into the window object, but be nice and don't overwrite anything.
builder . build ( base . objects ) . intoButDontClobber ( window ) ;
2012-03-25 02:09:57 +08:00
// Drop the platform-specific globals into the window object
// and clobber any existing object.
builder . build ( platform . objects ) . intoAndClobber ( window ) ;
// Merge the platform-specific overrides/enhancements into
// the window object.
if ( typeof platform . merges !== 'undefined' ) {
builder . build ( platform . merges ) . intoAndMerge ( window ) ;
}
2012-02-18 07:28:35 +08:00
// Call the platform-specific initialization
platform . initialize ( ) ;
// Fire event to notify that all objects are created
channel . onCordovaReady . fire ( ) ;
2012-03-25 02:09:57 +08:00
// Fire onDeviceReady event once all constructors have run and
2012-02-18 07:28:35 +08:00
// cordova info has been received from native side.
channel . join ( function ( ) {
2012-05-12 01:36:17 +08:00
require ( 'cordova' ) . fireDocumentEvent ( 'deviceready' ) ;
2012-03-25 02:09:57 +08:00
} , channel . deviceReadyChannelsArray ) ;
2012-04-24 02:37:33 +08:00
2012-02-18 07:28:35 +08:00
} , [ channel . onDOMContentLoaded , channel . onNativeReady ] ) ;
}
} ;
2012-04-24 02:37:33 +08:00
2012-02-18 07:28:35 +08:00
// boot up once native side is ready
2012-09-19 01:15:24 +08:00
channel . onNativeReady . subscribe ( _self . boot ) ;
2012-02-18 07:28:35 +08:00
// _nativeReady is global variable that the native side can set
2012-03-25 02:09:57 +08:00
// to signify that the native code is ready. It is a global since
2012-02-18 07:28:35 +08:00
// it may be called before any cordova JS is ready.
if ( window . _nativeReady ) {
2012-03-25 02:09:57 +08:00
channel . onNativeReady . fire ( ) ;
2012-02-18 07:28:35 +08:00
}
} ( window ) ) ;
2012-05-12 01:36:17 +08:00
2012-03-10 04:32:22 +08:00
} ) ( ) ;