From d3733e1488793bebddf21dfbe9415f652ad43d19 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Fri, 17 Apr 2009 17:48:25 -0700 Subject: [PATCH 01/10] Got the basics of UIControls.createTabbar working --- iphone/Classes/PhoneGapCommand.h | 6 +++- iphone/Classes/PhoneGapCommand.m | 25 ++++++++++++-- iphone/Classes/PhoneGapDelegate.h | 2 ++ iphone/Classes/PhoneGapDelegate.m | 41 ++++++++++++++-------- iphone/Classes/UIControls.h | 8 +++-- iphone/Classes/UIControls.m | 57 +++++++++++++++++++++++++++++-- iphone/Settings.plist | 10 ++++++ iphone/www/index.html | 1 + 8 files changed, 125 insertions(+), 25 deletions(-) diff --git a/iphone/Classes/PhoneGapCommand.h b/iphone/Classes/PhoneGapCommand.h index cf4d9245..7b90c66b 100644 --- a/iphone/Classes/PhoneGapCommand.h +++ b/iphone/Classes/PhoneGapCommand.h @@ -10,11 +10,15 @@ #import @interface PhoneGapCommand : NSObject { - UIWebView* webView; + UIWebView* webView; + NSDictionary* settings; } @property (nonatomic, retain) UIWebView *webView; +@property (nonatomic, retain) NSDictionary *settings; +-(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView settings:(NSDictionary*)classSettings; -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView; -(void) setWebView:(UIWebView*) theWebView; +-(void) setSettings:(NSDictionary*) classSettings; @end diff --git a/iphone/Classes/PhoneGapCommand.m b/iphone/Classes/PhoneGapCommand.m index c3bdcf09..99e801b9 100644 --- a/iphone/Classes/PhoneGapCommand.m +++ b/iphone/Classes/PhoneGapCommand.m @@ -10,14 +10,21 @@ @implementation PhoneGapCommand @synthesize webView; +@synthesize settings; + +-(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView settings:(NSDictionary*)classSettings +{ + self = [self initWithWebView:theWebView]; + if (self) + [self setSettings:classSettings]; + return self; +} -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView { - NSLog(@"phonegap command initializing"); self = [super init]; - if (self) { + if (self) [self setWebView:theWebView]; - } return self; } @@ -26,4 +33,16 @@ -(void) setWebView:(UIWebView*) theWebView webView = theWebView; } +-(void) setSettings:(NSDictionary*) classSettings +{ + settings = classSettings; +} + +- (void)dealloc +{ + if (self.settings) + [self.settings release]; + [super dealloc]; +} + @end diff --git a/iphone/Classes/PhoneGapDelegate.h b/iphone/Classes/PhoneGapDelegate.h index a922a7a4..94003609 100755 --- a/iphone/Classes/PhoneGapDelegate.h +++ b/iphone/Classes/PhoneGapDelegate.h @@ -43,6 +43,7 @@ //UIImagePickerController *imagePickerController; UIInterfaceOrientation orientationType; + NSDictionary *settings; NSURLConnection *callBackConnection; Sound *sound; @@ -58,6 +59,7 @@ //@property (nonatomic, retain) UIImagePickerController *imagePickerController; @property (nonatomic, retain) UIActivityIndicatorView *activityView; @property (nonatomic, retain) NSMutableDictionary *commandObjects; +@property (nonatomic, retain) NSDictionary *settings; //- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image2 editingInfo:(NSDictionary *)editingInfo; //- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker; diff --git a/iphone/Classes/PhoneGapDelegate.m b/iphone/Classes/PhoneGapDelegate.m index d6ec7a89..3c3f7d7c 100755 --- a/iphone/Classes/PhoneGapDelegate.m +++ b/iphone/Classes/PhoneGapDelegate.m @@ -8,6 +8,7 @@ @implementation PhoneGapDelegate @synthesize viewController; @synthesize activityView; @synthesize commandObjects; +@synthesize settings; //@synthesize imagePickerController; @@ -24,7 +25,14 @@ -(id) getCommandInstance:(NSString*)className { id obj = [commandObjects objectForKey:className]; if (!obj) { - obj = [[NSClassFromString(className) alloc] initWithWebView:webView]; + // attempt to load the settings for this command class + NSDictionary* classSettings; + classSettings = [settings objectForKey:className]; + + if (classSettings) + obj = [[NSClassFromString(className) alloc] initWithWebView:webView settings:classSettings]; + else + obj = [[NSClassFromString(className) alloc] initWithWebView:webView]; NSLog(@"******* Object %@ created from scratch for %@", obj, className); [commandObjects setObject:obj forKey:className]; @@ -49,20 +57,21 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"plist"]; NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization - propertyListFromData:plistXML - mutabilityOption:NSPropertyListMutableContainersAndLeaves - format:&format errorDescription:&errorDesc]; + propertyListFromData:plistXML + mutabilityOption:NSPropertyListMutableContainersAndLeaves + format:&format errorDescription:&errorDesc]; + settings = [[NSDictionary alloc] initWithDictionary:temp]; - NSNumber *offline = [temp objectForKey:@"Offline"]; - NSString *url = [temp objectForKey:@"Callback"]; - NSNumber *detectNumber = [temp objectForKey:@"DetectPhoneNumber"]; - NSNumber *useLocation = [temp objectForKey:@"UseLocation"]; - NSNumber *useAccelerometer = [temp objectForKey:@"UseAccelerometer"]; - NSNumber *autoRotate = [temp objectForKey:@"AutoRotate"]; - NSString *startOrientation = [temp objectForKey:@"StartOrientation"]; - NSString *rotateOrientation = [temp objectForKey:@"RotateOrientation"]; - NSString *topStatusBar = [temp objectForKey:@"TopStatusBar"]; - NSString *topActivityIndicator = [temp objectForKey:@"TopActivityIndicator"]; + NSNumber *offline = [settings objectForKey:@"Offline"]; + NSString *url = [settings objectForKey:@"Callback"]; + NSNumber *detectNumber = [settings objectForKey:@"DetectPhoneNumber"]; + NSNumber *useLocation = [settings objectForKey:@"UseLocation"]; + NSNumber *useAccelerometer = [settings objectForKey:@"UseAccelerometer"]; + NSNumber *autoRotate = [settings objectForKey:@"AutoRotate"]; + NSString *startOrientation = [settings objectForKey:@"StartOrientation"]; + NSString *rotateOrientation = [settings objectForKey:@"RotateOrientation"]; + NSString *topStatusBar = [settings objectForKey:@"TopStatusBar"]; + NSString *topActivityIndicator = [settings objectForKey:@"TopActivityIndicator"]; /* * Fire up the GPS Service right away as it takes a moment for data to come back. @@ -301,9 +310,11 @@ - (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest NSString* className = [components objectAtIndex:0]; NSString* methodName = [components objectAtIndex:1]; + // Fetch an instance of this class + PhoneGapCommand* obj = [self getCommandInstance:className]; + // construct the fill method name to ammend the second argument. NSString* fullMethodName = [[NSString alloc] initWithFormat:@"%@:withDict:", methodName]; - PhoneGapCommand* obj = [self getCommandInstance:className]; if ([obj respondsToSelector:NSSelectorFromString(fullMethodName)]) { [obj performSelector:NSSelectorFromString(fullMethodName) withObject:arguments withObject:options]; diff --git a/iphone/Classes/UIControls.h b/iphone/Classes/UIControls.h index 7c01576b..0c34cae9 100644 --- a/iphone/Classes/UIControls.h +++ b/iphone/Classes/UIControls.h @@ -8,13 +8,15 @@ #import #import -/* #import #import -*/ + #import "PhoneGapCommand.h" -@interface UIControls : PhoneGapCommand { +@interface UIControls : PhoneGapCommand { + UITabBar* tabbar; + + UIToolbar* toolbar; } @end diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 3641bf6f..7168e26f 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -10,11 +10,62 @@ @implementation UIControls +- (void)createTabbar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + CGFloat height = 49.0f; + NSDictionary* tabSettings = [settings objectForKey:@"TabbarSettings"]; + if (tabSettings) { + height = [[tabSettings objectForKey:@"height"] floatValue]; + } + + tabbar = [UITabBar new]; + [tabbar sizeToFit]; + tabbar.autoresizesSubviews = YES; + + CGRect mainViewBounds = self.webView.superview.bounds; + + [tabbar setFrame:CGRectMake(0.0f, 431.0f, 320.0f, height)]; + /* + [tabbar setFrame:CGRectMake(CGRectGetMinX(mainViewBounds), + CGRectGetMinY(mainViewBounds) + CGRectGetHeight(mainViewBounds) - (height * 2.0) + 2.0, + CGRectGetWidth(mainViewBounds), + height)]; + */ + + [self.webView.superview addSubview:tabbar]; + + //tabbar.delegate = self; +} + /* -+ (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options +- (void)showToolbar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + if (!tabbar) + [self createTabbar:nil withDict:nil]; + [tabbar hi +} + +- (void)showToolbar:(NSArray*)arguments withDict:(NSDictionary*)options +{ +} + +- (void)showTabbar:(NSArray*)arguments withDict:(NSDictionary*)options +{ +} + +- (void)addTabButton:(NSArray*)arguments withDict:(NSDictionary*)options +{ +// id* controller = [[UITabBar alloc] initWithFrame:( +} +*/ + +- (void)dealloc { - id* controller = [[UITabBar alloc] initWithFrame:( + if (tabbar) + [tabbar release]; + if (toolbar) + [toolbar release]; + [super dealloc]; } - */ @end diff --git a/iphone/Settings.plist b/iphone/Settings.plist index 9e9e93c3..61e1e940 100755 --- a/iphone/Settings.plist +++ b/iphone/Settings.plist @@ -22,5 +22,15 @@ portrait RotateOrientation portrait + UIControls + + TabbarSettings + + height + 49 + position + bottom + + diff --git a/iphone/www/index.html b/iphone/www/index.html index 0898e52c..fcc5ec39 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -34,6 +34,7 @@ function beep(){ debug.log("beep"); navigator.notification.beep(2); + PhoneGap.exec("UIControls.createTabbar", 'foo', 'bar'); } function vibrate(){ From aca2cd77db35323a05fe5780cc1fdd4e9ae48713 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Sun, 19 Apr 2009 13:59:31 -0700 Subject: [PATCH 02/10] Got setting tab items working --- iphone/Classes/Notification.m | 7 + iphone/Classes/UIControls.h | 17 +- iphone/Classes/UIControls.m | 301 +++- iphone/www/index.html | 12 +- iphone/www/phonegap.js | 2 +- javascripts/device.js | 38 +- javascripts/iphone/device.js | 41 + lib/android/phonegap-min.js | 2 +- lib/android/phonegap.js | 38 +- lib/blackberry/phonegap-min.js | 2 +- lib/blackberry/phonegap.js | 38 +- lib/iphone/phonegap-min.js | 2 +- lib/iphone/phonegap.js | 74 +- util/jsdoc-toolkit/out/jsdoc/files.html | 2 +- util/jsdoc-toolkit/out/jsdoc/index.html | 2 +- .../out/jsdoc/symbols/Acceleration.html | 2 +- .../jsdoc/symbols/AccelerationOptions.html | 2 +- .../out/jsdoc/symbols/Accelerometer.html | 2 +- .../out/jsdoc/symbols/Camera.html | 2 +- .../out/jsdoc/symbols/Contact.html | 2 +- .../out/jsdoc/symbols/DebugConsole.html | 2 +- .../out/jsdoc/symbols/Device.html | 2 +- .../out/jsdoc/symbols/Geolocation.html | 2 +- .../out/jsdoc/symbols/Media.html | 2 +- .../out/jsdoc/symbols/MediaError.html | 2 +- .../out/jsdoc/symbols/Orientation.html | 2 +- .../out/jsdoc/symbols/PhoneGap.html | 2 +- .../out/jsdoc/symbols/Position.html | 2 +- .../out/jsdoc/symbols/PositionError.html | 2 +- .../out/jsdoc/symbols/PositionOptions.html | 2 +- util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html | 2 +- .../out/jsdoc/symbols/Telephony.html | 2 +- .../out/jsdoc/symbols/UIControls.html | 2 +- .../out/jsdoc/symbols/_global_.html | 2 +- .../jsdoc/symbols/src/tmp_phonegap.js.html | 1504 ++++++++--------- 35 files changed, 1148 insertions(+), 972 deletions(-) create mode 100644 javascripts/iphone/device.js diff --git a/iphone/Classes/Notification.m b/iphone/Classes/Notification.m index d0de296a..34903443 100644 --- a/iphone/Classes/Notification.m +++ b/iphone/Classes/Notification.m @@ -31,11 +31,18 @@ - (void)alert:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options - (void)activityStart:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { //[(UIActivityIndicatorView*)[self.webView.window viewWithTag:2] startAnimating]; + NSLog(@"Starting"); + UIApplication* app = [UIApplication sharedApplication]; + app.networkActivityIndicatorVisible = YES; } - (void)activityStop:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { //[(UIActivityIndicatorView*)[self.webView.window viewWithTag:2] stopAnimating]; + + NSLog(@"Stopping "); + UIApplication* app = [UIApplication sharedApplication]; + app.networkActivityIndicatorVisible = NO; } - (void)vibrate:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options diff --git a/iphone/Classes/UIControls.h b/iphone/Classes/UIControls.h index 0c34cae9..8c99d966 100644 --- a/iphone/Classes/UIControls.h +++ b/iphone/Classes/UIControls.h @@ -14,9 +14,20 @@ #import "PhoneGapCommand.h" @interface UIControls : PhoneGapCommand { - UITabBar* tabbar; - - UIToolbar* toolbar; + UITabBar* tabBar; + NSMutableDictionary* tabBarItems; } +/* Tab Bar methods + */ +- (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options; + +/* Tab Bar Item methods + */ +- (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; + @end diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 7168e26f..4ecf49c7 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -9,62 +9,295 @@ #import "UIControls.h" @implementation UIControls +@synthesize webView; -- (void)createTabbar:(NSArray*)arguments withDict:(NSDictionary*)options +-(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView { + self = [super initWithWebView:theWebView]; + if (self) { + tabBarItems = [[NSMutableDictionary alloc] initWithCapacity:5]; + } + return self; +} + +/** + * Create a native tab bar at either the top or the bottom of the display. + * @brief creates a tab bar + * @param arguments unused + * @param options used to indicate options for where and how the tab bar should be placed + * - \c height integer indicating the height of the tab bar (default: \c 49) + * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom) + */ +- (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + NSLog(@"createTabBar"); + tabBar = [UITabBar new]; + [tabBar sizeToFit]; + tabBar.delegate = self; + tabBar.multipleTouchEnabled = NO; + tabBar.autoresizesSubviews = YES; + tabBar.hidden = YES; + tabBar.userInteractionEnabled = YES; + + [self.webView.superview addSubview:tabBar]; +} + +/** + * Show the tab bar after its been created. + * @brief show the tab bar + * @param arguments unused + * @param options unused + */ +- (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + NSLog(@"showTabBar"); CGFloat height = 49.0f; - NSDictionary* tabSettings = [settings objectForKey:@"TabbarSettings"]; + BOOL atBottom = YES; + + NSDictionary* tabSettings = [settings objectForKey:@"TabBarSettings"]; if (tabSettings) { - height = [[tabSettings objectForKey:@"height"] floatValue]; + height = [[tabSettings objectForKey:@"height"] floatValue]; + atBottom = [[tabSettings objectForKey:@"position"] isEqualTo:@"bottom"]; } - - tabbar = [UITabBar new]; - [tabbar sizeToFit]; - tabbar.autoresizesSubviews = YES; + tabBar.hidden = NO; - CGRect mainViewBounds = self.webView.superview.bounds; - - [tabbar setFrame:CGRectMake(0.0f, 431.0f, 320.0f, height)]; - /* - [tabbar setFrame:CGRectMake(CGRectGetMinX(mainViewBounds), - CGRectGetMinY(mainViewBounds) + CGRectGetHeight(mainViewBounds) - (height * 2.0) + 2.0, - CGRectGetWidth(mainViewBounds), - height)]; - */ - - [self.webView.superview addSubview:tabbar]; - //tabbar.delegate = self; + CGRect webViewBounds = webView.bounds; + CGRect tabBarBounds; + if (atBottom) { + NSLog(@"Positioning tabbar at bottom"); + tabBarBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y + webViewBounds.size.height - height, + webViewBounds.size.width, + height + ); + webViewBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y, + webViewBounds.size.width, + webViewBounds.size.height - height + ); + } else { + NSLog(@"Positioning tabbar at top"); + tabBarBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y, + webViewBounds.size.width, + height + ); + webViewBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y + height, + webViewBounds.size.width, + webViewBounds.size.height - height + ); + } + + [tabBar setFrame:tabBarBounds]; + [webView setFrame:webViewBounds]; } -/* -- (void)showToolbar:(NSArray*)arguments withDict:(NSDictionary*)options +/** + * Hide the tab bar + * @brief hide the tab bar + * @param arguments unused + * @param options unused + */ +- (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + NSLog(@"hideTabBar"); + tabBar.hidden = YES; +} + +/** + * Create a new tab bar item for use on a previously created tab bar. Use ::showTabBarItems to show the new item on the tab bar. + * + * If the supplied image name is one of the labels listed below, then this method will construct a tab button + * using the standard system buttons. Note that if you use one of the system images, that the \c title you supply will be ignored. + * - Tab Buttons + * - tabButton:More + * - tabButton:Favorites + * - tabButton:Featured + * - tabButton:TopRated + * - tabButton:Recents + * - tabButton:Contacts + * - tabButton:History + * - tabButton:Bookmarks + * - tabButton:Search + * - tabButton:Downloads + * - tabButton:MostRecent + * - tabButton:MostViewed + * @brief create a tab bar item + * @param arguments Parameters used to create the tab bar + * -# \c name internal name to refer to this tab by + * -# \c title title text to show on the tab, or null if no text should be shown + * -# \c image image filename or internal identifier to show, or null if now image should be shown + * -# \c tag unique number to be used as an internal reference to this button + * @param options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if nil or unspecified, the badge will be hidden + */ +- (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { - if (!tabbar) - [self createTabbar:nil withDict:nil]; - [tabbar hi + NSLog(@"createTabBarItem"); + NSString *name = [arguments objectAtIndex:0]; + NSString *title = [arguments objectAtIndex:1]; + NSString *imageName = [arguments objectAtIndex:2]; + int tag = [[arguments objectAtIndex:3] intValue]; + + UITabBarItem *item; + if ([[imageName substringWithRange:NSMakeRange(0, 10)] isEqualTo:@"tabButton:"]) { + NSLog(@"Tab button!!"); + UIBarButtonSystemItem systemItem; + if ([imageName isEqualTo:@"tabButton:More"]) systemItem = UITabBarSystemItemMore; + if ([imageName isEqualTo:@"tabButton:Favorites"]) systemItem = UITabBarSystemItemFavorites; + if ([imageName isEqualTo:@"tabButton:Featured"]) systemItem = UITabBarSystemItemFeatured; + if ([imageName isEqualTo:@"tabButton:TopRated"]) systemItem = UITabBarSystemItemTopRated; + if ([imageName isEqualTo:@"tabButton:Recents"]) systemItem = UITabBarSystemItemRecents; + if ([imageName isEqualTo:@"tabButton:Contacts"]) systemItem = UITabBarSystemItemContacts; + if ([imageName isEqualTo:@"tabButton:History"]) systemItem = UITabBarSystemItemHistory; + if ([imageName isEqualTo:@"tabButton:Bookmarks"]) systemItem = UITabBarSystemItemBookmarks; + if ([imageName isEqualTo:@"tabButton:Search"]) systemItem = UITabBarSystemItemSearch; + if ([imageName isEqualTo:@"tabButton:Downloads"]) systemItem = UITabBarSystemItemDownloads; + if ([imageName isEqualTo:@"tabButton:MostRecent"]) systemItem = UITabBarSystemItemMostRecent; + if ([imageName isEqualTo:@"tabButton:MostViewed"]) systemItem = UITabBarSystemItemMostViewed; + item = [[UITabBarItem alloc] initWithTabBarSystemItem:systemItem tag:tag]; + } + + if (!item) { + NSLog(@"Creating with custom image and title"); + UIImage *image = [[UIImage alloc] initWithContentsOfFile:imageName]; + item = [[UITabBarItem alloc] initWithTitle:title image:image tag:tag]; + } + + if ([options objectForKey:@"badge"]) + item.badgeValue = [options objectForKey:@"badge"]; + + [tabBarItems setObject:item forKey:name]; } -- (void)showToolbar:(NSArray*)arguments withDict:(NSDictionary*)options +/** + * Update an existing tab bar item to change its badge value. + * @brief update the badge value on an existing tab bar item + * @param arguments Parameters used to identify the tab bar item to update + * -# \c name internal name used to represent this item when it was created + * @param options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if nil or unspecified, the badge will be hidden + */ +- (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { + NSLog(@"updateTabBarItem"); + NSString *name = [arguments objectAtIndex:0]; + UITabBarItem *item = [tabBarItems objectForKey:name]; + if (item) + item.badgeValue = [options objectForKey:@"badge"]; } -- (void)showTabbar:(NSArray*)arguments withDict:(NSDictionary*)options +/** + * Show previously created items on the tab bar + * @brief show a list of tab bar items + * @param arguments the item names to be shown + * @param options dictionary of options, notable options including: + * - \c animate indicates that the items should animate onto the tab bar + * @see createTabBarItem + * @see createTabBar + */ +- (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options { + NSLog(@"showTabBarItems"); + int i, count = [arguments count]; + NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:count]; + for (i = 0; i < count; i++) { + NSString *itemName = [arguments objectAtIndex:i]; + UITabBarItem *item = [tabBarItems objectForKey:itemName]; + if (item) + [items addObject:item]; + } + + BOOL animateItems = YES; + if ([options objectForKey:@"animate"]) + animateItems = [(NSString*)[options objectForKey:@"animate"] boolValue]; + [tabBar setItems:items animated:animateItems]; } - -- (void)addTabButton:(NSArray*)arguments withDict:(NSDictionary*)options + +/* + * - Tool Buttons + * - toolButton:Done + * - toolButton:Cancel + * - toolButton:Edit + * - toolButton:Save + * - toolButton:Add + * - toolButton:FlexibleSpace + * - toolButton:FixedSpace + * - toolButton:Compose + * - toolButton:Reply + * - toolButton:Action + * - toolButton:Organize + * - toolButton:Bookmarks + * - toolButton:Search + * - toolButton:Refresh + * - toolButton:Stop + * - toolButton:Camera + * - toolButton:Trash + * - toolButton:Play + * - toolButton:Pause + * - toolButton:Rewind + * - toolButton:FastForward + */ +/* +-(UIBarButtonSystemItem) getSystemItemFromString:(NSString*)imageName { -// id* controller = [[UITabBar alloc] initWithFrame:( + if ([[imageName substringWithRange:NSMakeRange(0, 10)] isEqualTo:@"tabButton:"]) { + NSLog(@"Tab button!!"); + if ([imageName isEqualTo:@"tabButton:More"]) return UITabBarSystemItemMore; + if ([imageName isEqualTo:@"tabButton:Favorites"]) return UITabBarSystemItemFavorites; + if ([imageName isEqualTo:@"tabButton:Featured"]) return UITabBarSystemItemFeatured; + if ([imageName isEqualTo:@"tabButton:TopRated"]) return UITabBarSystemItemTopRated; + if ([imageName isEqualTo:@"tabButton:Recents"]) return UITabBarSystemItemRecents; + if ([imageName isEqualTo:@"tabButton:Contacts"]) return UITabBarSystemItemContacts; + if ([imageName isEqualTo:@"tabButton:History"]) return UITabBarSystemItemHistory; + if ([imageName isEqualTo:@"tabButton:Bookmarks"]) return UITabBarSystemItemBookmarks; + if ([imageName isEqualTo:@"tabButton:Search"]) return UITabBarSystemItemSearch; + if ([imageName isEqualTo:@"tabButton:Downloads"]) return UITabBarSystemItemDownloads; + if ([imageName isEqualTo:@"tabButton:MostRecent"]) return UITabBarSystemItemMostRecent; + if ([imageName isEqualTo:@"tabButton:MostViewed"]) return UITabBarSystemItemMostViewed; + NSLog(@"Couldn't figure out what it was"); + return -1; + } + else if ([[imageName substringWithRange:NSMakeRange(0, 11)] isEqualTo:@"toolButton:"]) { + NSLog(@"Tool button!!"); + if ([imageName isEqualTo:@"toolButton:Done"]) return UIBarButtonSystemItemDone; + if ([imageName isEqualTo:@"toolButton:Cancel"]) return UIBarButtonSystemItemCancel; + if ([imageName isEqualTo:@"toolButton:Edit"]) return UIBarButtonSystemItemEdit; + if ([imageName isEqualTo:@"toolButton:Save"]) return UIBarButtonSystemItemSave; + if ([imageName isEqualTo:@"toolButton:Add"]) return UIBarButtonSystemItemAdd; + if ([imageName isEqualTo:@"toolButton:FlexibleSpace"]) return UIBarButtonSystemItemFlexibleSpace; + if ([imageName isEqualTo:@"toolButton:FixedSpace"]) return UIBarButtonSystemItemFixedSpace; + if ([imageName isEqualTo:@"toolButton:Compose"]) return UIBarButtonSystemItemCompose; + if ([imageName isEqualTo:@"toolButton:Reply"]) return UIBarButtonSystemItemReply; + if ([imageName isEqualTo:@"toolButton:Action"]) return UIBarButtonSystemItemAction; + if ([imageName isEqualTo:@"toolButton:Organize"]) return UIBarButtonSystemItemOrganize; + if ([imageName isEqualTo:@"toolButton:Bookmarks"]) return UIBarButtonSystemItemBookmarks; + if ([imageName isEqualTo:@"toolButton:Search"]) return UIBarButtonSystemItemSearch; + if ([imageName isEqualTo:@"toolButton:Refresh"]) return UIBarButtonSystemItemRefresh; + if ([imageName isEqualTo:@"toolButton:Stop"]) return UIBarButtonSystemItemStop; + if ([imageName isEqualTo:@"toolButton:Camera"]) return UIBarButtonSystemItemCamera; + if ([imageName isEqualTo:@"toolButton:Trash"]) return UIBarButtonSystemItemTrash; + if ([imageName isEqualTo:@"toolButton:Play"]) return UIBarButtonSystemItemPlay; + if ([imageName isEqualTo:@"toolButton:Pause"]) return UIBarButtonSystemItemPause; + if ([imageName isEqualTo:@"toolButton:Rewind"]) return UIBarButtonSystemItemRewind; + if ([imageName isEqualTo:@"toolButton:FastForward"]) return UIBarButtonSystemItemFastForward; + return -1; + } else { + return -1; + } } */ - + - (void)dealloc { - if (tabbar) - [tabbar release]; - if (toolbar) - [toolbar release]; + if (tabBar) + [tabBar release]; [super dealloc]; } diff --git a/iphone/www/index.html b/iphone/www/index.html index fcc5ec39..5f6acd35 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -34,7 +34,17 @@ function beep(){ debug.log("beep"); navigator.notification.beep(2); - PhoneGap.exec("UIControls.createTabbar", 'foo', 'bar'); + try { + PhoneGap.exec("UIControls.createTabBar"); + PhoneGap.exec("UIControls.createTabBarItem", "toprated", "Top Rated", "tabButton:TopRated", 1); + PhoneGap.exec("UIControls.createTabBarItem", "recents", "Recents", "tabButton:Recents", 2); + PhoneGap.exec("UIControls.createTabBarItem", "history", "History", "tabButton:History", 3); + PhoneGap.exec("UIControls.createTabBarItem", "more", "More", "tabButton:More", 4); + PhoneGap.exec("UIControls.showTabBar"); + PhoneGap.exec("UIControls.showTabBarItems", "toprated", "recents", "history", "more"); + } catch(e) { + debug.log(e); + } } function vibrate(){ diff --git a/iphone/www/phonegap.js b/iphone/www/phonegap.js index 23870833..f087e67a 100644 --- a/iphone/www/phonegap.js +++ b/iphone/www/phonegap.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){}PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;e0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){}PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;btmp/phonegap.js
- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/util/jsdoc-toolkit/out/jsdoc/index.html index 8e508015..5abe9687 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/util/jsdoc-toolkit/out/jsdoc/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html index cf04a953..1c3470a1 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html index 1affeb7c..007690bb 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html index fd515f6d..55ec9a5b 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html index 87358c74..e6dd1c83 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html index 81c608de..99981e33 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html index c0647338..0a138642 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html index 20fc8532..e41d7485 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html index 9e9b8e76..e22dbed5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html index 254b883c..78e0b515 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html index a2939bc8..fb684ed1 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html index d4778b3b..0333f624 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html index 8b2f1ded..b7a407f9 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html index 4919c7c8..bbd7db27 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html index 9c1aceb6..fbd2fa62 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html index 1c028e98..67152d34 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html index a6ea2678..777a4a13 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html index 7db2cadb..2bec0154 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html index ef1ed758..23edaff0 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html index 4a32db6f..50c749a5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html index 429ca7ac..734ec09d 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html @@ -74,791 +74,757 @@ 67 PhoneGap.queue.timer = setInterval(PhoneGap.run_command, 10); 68 }; 69 /** - 70 * Internal function used to dispatch the request to PhoneGap. It processes the - 71 * command queue and executes the next command on the list. If one of the - 72 * arguments is a JavaScript object, it will be passed on the QueryString of the - 73 * url, which will be turned into a dictionary on the other end. - 74 * @private - 75 */ - 76 PhoneGap.run_command = function() { - 77 if (!PhoneGap.available) - 78 return; - 79 - 80 PhoneGap.queue.ready = false; - 81 - 82 var args = PhoneGap.queue.commands.shift(); - 83 if (PhoneGap.queue.commands.length == 0) { - 84 clearInterval(PhoneGap.queue.timer); - 85 PhoneGap.queue.timer = null; - 86 } - 87 - 88 var uri = []; - 89 var dict = null; - 90 for (var i = 1; i < args.length; i++) { - 91 if (typeof(args[i]) == 'object') - 92 dict = args[i]; - 93 else - 94 uri.push(encodeURIComponent(args[i])); - 95 } - 96 var url = "gap://" + args[0] + "/" + uri.join("/"); - 97 if (dict != null) { - 98 var query_args = []; - 99 for (var name in dict) { -100 if (typeof(name) != 'string') -101 continue; -102 query_args.push(encodeURIComponent(name) + "=" + encodeURIComponent(dict[name])); -103 } -104 if (query_args.length > 0) -105 url += "?" + query_args.join("&"); -106 } -107 document.location = url; + 70 * Internal function used to dispatch the request to PhoneGap. This needs to be implemented per-platform to + 71 * ensure that methods are called on the phone in a way appropriate for that device. + 72 * @private + 73 */ + 74 PhoneGap.run_command = function() { + 75 }; + 76 + 77 /** + 78 * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the + 79 * phone, etc. + 80 * @constructor + 81 */ + 82 function Device() { + 83 this.available = PhoneGap.available; + 84 this.model = null; + 85 this.version = null; + 86 this.gap = null; + 87 this.uuid = null; + 88 try { + 89 if (window['DroidGap'] != undefined && window.DroidGap.exists()) { + 90 this.available = true; + 91 this.isAndroid = true; + 92 this.uuid = window.DroidGap.getUuid(); + 93 this.gapVersion = window.DroidGap.getVersion(); + 94 } else { + 95 this.model = DeviceInfo.platform; + 96 this.version = DeviceInfo.version; + 97 this.gap = DeviceInfo.gap; + 98 this.uuid = DeviceInfo.uuid; + 99 } +100 } catch(e) { +101 this.available = false; +102 } +103 } +104 +105 PhoneGap.addConstructor(function() { +106 navigator.device = window.device = new Device(); +107 }); 108 -109 }; -110 +109 +110 111 /** -112 * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the -113 * phone, etc. -114 * @constructor -115 */ -116 function Device() { -117 this.available = PhoneGap.available; -118 this.model = null; -119 this.version = null; -120 this.gap = null; -121 this.uuid = null; -122 try { -123 if (window['DroidGap'] != undefined && window.DroidGap.exists()) { -124 this.available = true; -125 this.isAndroid = true; -126 this.uuid = window.DroidGap.getUuid(); -127 this.gapVersion = window.DroidGap.getVersion(); -128 } else { -129 this.model = DeviceInfo.platform; -130 this.version = DeviceInfo.version; -131 this.gap = DeviceInfo.gap; -132 this.uuid = DeviceInfo.uuid; -133 } -134 } catch(e) { -135 this.available = false; -136 } -137 } -138 -139 PhoneGap.addConstructor(function() { -140 navigator.device = window.device = new Device(); -141 }); -142 -143 -144 -145 /** -146 * This class contains acceleration information -147 * @constructor -148 * @param {Number} x The force applied by the device in the x-axis. -149 * @param {Number} y The force applied by the device in the y-axis. -150 * @param {Number} z The force applied by the device in the z-axis. -151 */ -152 function Acceleration(x, y, z) { -153 /** -154 * The force applied by the device in the x-axis. -155 */ -156 this.x = x; -157 /** -158 * The force applied by the device in the y-axis. -159 */ -160 this.y = y; -161 /** -162 * The force applied by the device in the z-axis. -163 */ -164 this.z = z; -165 /** -166 * The time that the acceleration was obtained. -167 */ -168 this.timestamp = new Date().getTime(); -169 } -170 -171 /** -172 * This class specifies the options for requesting acceleration data. -173 * @constructor -174 */ -175 function AccelerationOptions() { -176 /** -177 * The timeout after which if acceleration data cannot be obtained the errorCallback -178 * is called. -179 */ -180 this.timeout = 10000; -181 } -182 -183 -184 /** -185 * This class provides access to device accelerometer data. -186 * @constructor -187 */ -188 function Accelerometer() { -189 /** -190 * The last known acceleration. -191 */ -192 this.lastAcceleration = null; -193 } -194 -195 /** -196 * Asynchronously aquires the current acceleration. -197 * @param {Function} successCallback The function to call when the acceleration -198 * data is available -199 * @param {Function} errorCallback The function to call when there is an error -200 * getting the acceleration data. -201 * @param {AccelerationOptions} options The options for getting the accelerometer data -202 * such as timeout. -203 */ -204 Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) { -205 // If the acceleration is available then call success -206 // If the acceleration is not available then call error -207 -208 // Created for iPhone, Iphone passes back _accel obj litteral -209 if (typeof successCallback == "function") { -210 var accel = new Acceleration(_accel.x,_accel.y,_accel.z); -211 Accelerometer.lastAcceleration = accel; -212 successCallback(accel); -213 } -214 } -215 +112 * This class contains acceleration information +113 * @constructor +114 * @param {Number} x The force applied by the device in the x-axis. +115 * @param {Number} y The force applied by the device in the y-axis. +116 * @param {Number} z The force applied by the device in the z-axis. +117 */ +118 function Acceleration(x, y, z) { +119 /** +120 * The force applied by the device in the x-axis. +121 */ +122 this.x = x; +123 /** +124 * The force applied by the device in the y-axis. +125 */ +126 this.y = y; +127 /** +128 * The force applied by the device in the z-axis. +129 */ +130 this.z = z; +131 /** +132 * The time that the acceleration was obtained. +133 */ +134 this.timestamp = new Date().getTime(); +135 } +136 +137 /** +138 * This class specifies the options for requesting acceleration data. +139 * @constructor +140 */ +141 function AccelerationOptions() { +142 /** +143 * The timeout after which if acceleration data cannot be obtained the errorCallback +144 * is called. +145 */ +146 this.timeout = 10000; +147 } +148 +149 +150 /** +151 * This class provides access to device accelerometer data. +152 * @constructor +153 */ +154 function Accelerometer() { +155 /** +156 * The last known acceleration. +157 */ +158 this.lastAcceleration = null; +159 } +160 +161 /** +162 * Asynchronously aquires the current acceleration. +163 * @param {Function} successCallback The function to call when the acceleration +164 * data is available +165 * @param {Function} errorCallback The function to call when there is an error +166 * getting the acceleration data. +167 * @param {AccelerationOptions} options The options for getting the accelerometer data +168 * such as timeout. +169 */ +170 Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) { +171 // If the acceleration is available then call success +172 // If the acceleration is not available then call error +173 +174 // Created for iPhone, Iphone passes back _accel obj litteral +175 if (typeof successCallback == "function") { +176 var accel = new Acceleration(_accel.x,_accel.y,_accel.z); +177 Accelerometer.lastAcceleration = accel; +178 successCallback(accel); +179 } +180 } +181 +182 /** +183 * Asynchronously aquires the acceleration repeatedly at a given interval. +184 * @param {Function} successCallback The function to call each time the acceleration +185 * data is available +186 * @param {Function} errorCallback The function to call when there is an error +187 * getting the acceleration data. +188 * @param {AccelerationOptions} options The options for getting the accelerometer data +189 * such as timeout. +190 */ +191 +192 Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) { +193 this.getCurrentAcceleration(successCallback, errorCallback, options); +194 // TODO: add the interval id to a list so we can clear all watches +195 var frequency = (options != undefined)? options.frequency : 10000; +196 return setInterval(function() { +197 navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options); +198 }, frequency); +199 } +200 +201 /** +202 * Clears the specified accelerometer watch. +203 * @param {String} watchId The ID of the watch returned from #watchAcceleration. +204 */ +205 Accelerometer.prototype.clearWatch = function(watchId) { +206 clearInterval(watchId); +207 } +208 +209 PhoneGap.addConstructor(function() { +210 if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer(); +211 }); +212 +213 +214 +215 216 /** -217 * Asynchronously aquires the acceleration repeatedly at a given interval. -218 * @param {Function} successCallback The function to call each time the acceleration -219 * data is available -220 * @param {Function} errorCallback The function to call when there is an error -221 * getting the acceleration data. -222 * @param {AccelerationOptions} options The options for getting the accelerometer data -223 * such as timeout. -224 */ -225 -226 Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) { -227 this.getCurrentAcceleration(successCallback, errorCallback, options); -228 // TODO: add the interval id to a list so we can clear all watches -229 var frequency = (options != undefined)? options.frequency : 10000; -230 return setInterval(function() { -231 navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options); -232 }, frequency); -233 } -234 -235 /** -236 * Clears the specified accelerometer watch. -237 * @param {String} watchId The ID of the watch returned from #watchAcceleration. -238 */ -239 Accelerometer.prototype.clearWatch = function(watchId) { -240 clearInterval(watchId); +217 * This class provides access to the device media, interfaces to both sound and video +218 * @constructor +219 */ +220 function Media(src) { +221 this.src = src; +222 } +223 +224 Media.prototype.play = function() { +225 } +226 +227 Media.prototype.pause = function() { +228 } +229 +230 Media.prototype.stop = function() { +231 } +232 +233 +234 /** +235 * This class contains information about any Media errors. +236 * @constructor +237 */ +238 function MediaError() { +239 this.code = null, +240 this.message = ""; 241 } 242 -243 PhoneGap.addConstructor(function() { -244 if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer(); -245 }); -246 -247 +243 MediaError.MEDIA_ERR_ABORTED = 1; +244 MediaError.MEDIA_ERR_NETWORK = 2; +245 MediaError.MEDIA_ERR_DECODE = 3; +246 MediaError.MEDIA_ERR_NONE_SUPPORTED = 4; +247 248 -249 -250 /** -251 * This class provides access to the device media, interfaces to both sound and video -252 * @constructor -253 */ -254 function Media(src) { -255 this.src = src; -256 } -257 -258 Media.prototype.play = function() { -259 } -260 -261 Media.prototype.pause = function() { -262 } -263 -264 Media.prototype.stop = function() { -265 } -266 -267 -268 /** -269 * This class contains information about any Media errors. -270 * @constructor -271 */ -272 function MediaError() { -273 this.code = null, -274 this.message = ""; -275 } -276 -277 MediaError.MEDIA_ERR_ABORTED = 1; -278 MediaError.MEDIA_ERR_NETWORK = 2; -279 MediaError.MEDIA_ERR_DECODE = 3; -280 MediaError.MEDIA_ERR_NONE_SUPPORTED = 4; -281 -282 -283 //if (typeof navigator.audio == "undefined") navigator.audio = new Media(src); -284 -285 +249 //if (typeof navigator.audio == "undefined") navigator.audio = new Media(src); +250 +251 +252 /** +253 * This class provides access to the device camera. +254 * @constructor +255 */ +256 function Camera() { +257 +258 } +259 +260 /** +261 * +262 * @param {Function} successCallback +263 * @param {Function} errorCallback +264 * @param {Object} options +265 */ +266 Camera.prototype.getPicture = function(successCallback, errorCallback, options) { +267 +268 } +269 +270 PhoneGap.addConstructor(function() { +271 if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); +272 }); +273 +274 +275 +276 /** +277 * This class provides access to the device contacts. +278 * @constructor +279 */ +280 function Contact() { +281 this.name = ""; +282 this.phone = ""; +283 this.address = ""; +284 } +285 286 /** -287 * This class provides access to the device camera. -288 * @constructor -289 */ -290 function Camera() { -291 -292 } -293 -294 /** -295 * -296 * @param {Function} successCallback -297 * @param {Function} errorCallback -298 * @param {Object} options -299 */ -300 Camera.prototype.getPicture = function(successCallback, errorCallback, options) { -301 -302 } -303 -304 PhoneGap.addConstructor(function() { -305 if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); -306 }); -307 -308 -309 -310 /** -311 * This class provides access to the device contacts. -312 * @constructor -313 */ -314 function Contact() { -315 this.name = ""; -316 this.phone = ""; -317 this.address = ""; -318 } -319 -320 /** -321 * -322 * @param {Object} successCallback -323 * @param {Object} errorCallback -324 * @param {Object} options -325 */ -326 Contact.prototype.get = function(successCallback, errorCallback, options) { -327 -328 } -329 -330 -331 function ContactManager() { -332 // Dummy object to hold array of contacts -333 this.contacts = []; -334 this.timestap = new Date().getTime(); -335 } -336 -337 ContactManager.prototype.get = function(successCallback, errorCallback, options) { -338 // Interface -339 } -340 -341 PhoneGap.addConstructor(function() { -342 if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager(); -343 }); -344 -345 -346 -347 /** -348 * This class exposes mobile phone interface controls to JavaScript, such as -349 * native alerts, tab and tool bars, etc. -350 * @constructor -351 */ -352 function UIControls() { -353 } -354 -355 PhoneGap.addConstructor(function() { -356 window.uicontrols = new UIControls(); -357 }); -358 -359 -360 -361 /** -362 * This class provides access to the debugging console. -363 * @constructor -364 */ -365 function DebugConsole() { -366 } -367 -368 /** -369 * Utility function for rendering and indenting strings, or serializing -370 * objects to a string capable of being printed to the console. -371 * @param {Object|String} message The string or object to convert to an indented string -372 * @private -373 */ -374 DebugConsole.prototype.processMessage = function(message) { -375 if (typeof(message) != 'object') { -376 return encodeURIComponent(message); -377 } else { -378 /** -379 * @function -380 * @ignore -381 */ -382 function indent(str) { -383 return str.replace(/^/mg, " "); -384 } -385 /** -386 * @function -387 * @ignore -388 */ -389 function makeStructured(obj) { -390 var str = ""; -391 for (var i in obj) { -392 try { -393 if (typeof(obj[i]) == 'object') { -394 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; -395 } else { -396 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; -397 } -398 } catch(e) { -399 str += i + " = EXCEPTION: " + e.message + "\n"; -400 } -401 } -402 return str; -403 } -404 return encodeURIComponent("Object:\n" + makeStructured(message)); -405 } -406 }; -407 -408 /** -409 * Print a normal log message to the console -410 * @param {Object|String} message Message or object to print to the console -411 */ -412 DebugConsole.prototype.log = function(message) { -413 }; +287 * +288 * @param {Object} successCallback +289 * @param {Object} errorCallback +290 * @param {Object} options +291 */ +292 Contact.prototype.get = function(successCallback, errorCallback, options) { +293 +294 } +295 +296 +297 function ContactManager() { +298 // Dummy object to hold array of contacts +299 this.contacts = []; +300 this.timestap = new Date().getTime(); +301 } +302 +303 ContactManager.prototype.get = function(successCallback, errorCallback, options) { +304 // Interface +305 } +306 +307 PhoneGap.addConstructor(function() { +308 if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager(); +309 }); +310 +311 +312 +313 /** +314 * This class exposes mobile phone interface controls to JavaScript, such as +315 * native alerts, tab and tool bars, etc. +316 * @constructor +317 */ +318 function UIControls() { +319 } +320 +321 PhoneGap.addConstructor(function() { +322 window.uicontrols = new UIControls(); +323 }); +324 +325 +326 +327 /** +328 * This class provides access to the debugging console. +329 * @constructor +330 */ +331 function DebugConsole() { +332 } +333 +334 /** +335 * Utility function for rendering and indenting strings, or serializing +336 * objects to a string capable of being printed to the console. +337 * @param {Object|String} message The string or object to convert to an indented string +338 * @private +339 */ +340 DebugConsole.prototype.processMessage = function(message) { +341 if (typeof(message) != 'object') { +342 return encodeURIComponent(message); +343 } else { +344 /** +345 * @function +346 * @ignore +347 */ +348 function indent(str) { +349 return str.replace(/^/mg, " "); +350 } +351 /** +352 * @function +353 * @ignore +354 */ +355 function makeStructured(obj) { +356 var str = ""; +357 for (var i in obj) { +358 try { +359 if (typeof(obj[i]) == 'object') { +360 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; +361 } else { +362 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; +363 } +364 } catch(e) { +365 str += i + " = EXCEPTION: " + e.message + "\n"; +366 } +367 } +368 return str; +369 } +370 return encodeURIComponent("Object:\n" + makeStructured(message)); +371 } +372 }; +373 +374 /** +375 * Print a normal log message to the console +376 * @param {Object|String} message Message or object to print to the console +377 */ +378 DebugConsole.prototype.log = function(message) { +379 }; +380 +381 /** +382 * Print a warning message to the console +383 * @param {Object|String} message Message or object to print to the console +384 */ +385 DebugConsole.prototype.warn = function(message) { +386 }; +387 +388 /** +389 * Print an error message to the console +390 * @param {Object|String} message Message or object to print to the console +391 */ +392 DebugConsole.prototype.error = function(message) { +393 }; +394 +395 PhoneGap.addConstructor(function() { +396 window.debug = new DebugConsole(); +397 }); +398 +399 +400 +401 /** +402 * This class provides generic read and write access to the mobile device file system. +403 */ +404 function File() { +405 /** +406 * The data of a file. +407 */ +408 this.data = ""; +409 /** +410 * The name of the file. +411 */ +412 this.name = ""; +413 } 414 415 /** -416 * Print a warning message to the console -417 * @param {Object|String} message Message or object to print to the console -418 */ -419 DebugConsole.prototype.warn = function(message) { -420 }; -421 -422 /** -423 * Print an error message to the console -424 * @param {Object|String} message Message or object to print to the console -425 */ -426 DebugConsole.prototype.error = function(message) { -427 }; -428 -429 PhoneGap.addConstructor(function() { -430 window.debug = new DebugConsole(); -431 }); -432 -433 -434 -435 /** -436 * This class provides generic read and write access to the mobile device file system. -437 */ -438 function File() { -439 /** -440 * The data of a file. -441 */ -442 this.data = ""; -443 /** -444 * The name of the file. -445 */ -446 this.name = ""; -447 } -448 -449 /** -450 * Reads a file from the mobile device. This function is asyncronous. -451 * @param {String} fileName The name (including the path) to the file on the mobile device. -452 * The file name will likely be device dependant. -453 * @param {Function} successCallback The function to call when the file is successfully read. -454 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. -455 */ -456 File.prototype.read = function(fileName, successCallback, errorCallback) { -457 -458 } -459 -460 /** -461 * Writes a file to the mobile device. -462 * @param {File} file The file to write to the device. -463 */ -464 File.prototype.write = function(file) { -465 -466 } -467 -468 PhoneGap.addConstructor(function() { -469 if (typeof navigator.file == "undefined") navigator.file = new File(); -470 }); +416 * Reads a file from the mobile device. This function is asyncronous. +417 * @param {String} fileName The name (including the path) to the file on the mobile device. +418 * The file name will likely be device dependant. +419 * @param {Function} successCallback The function to call when the file is successfully read. +420 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. +421 */ +422 File.prototype.read = function(fileName, successCallback, errorCallback) { +423 +424 } +425 +426 /** +427 * Writes a file to the mobile device. +428 * @param {File} file The file to write to the device. +429 */ +430 File.prototype.write = function(file) { +431 +432 } +433 +434 PhoneGap.addConstructor(function() { +435 if (typeof navigator.file == "undefined") navigator.file = new File(); +436 }); +437 +438 +439 +440 /** +441 * This class provides access to device GPS data. +442 * @constructor +443 */ +444 function Geolocation() { +445 /** +446 * The last known GPS position. +447 */ +448 this.lastPosition = null; +449 this.lastError = null; +450 this.callbacks = { +451 onLocationChanged: [], +452 onError: [] +453 }; +454 }; +455 +456 /** +457 * Asynchronously aquires the current position. +458 * @param {Function} successCallback The function to call when the position +459 * data is available +460 * @param {Function} errorCallback The function to call when there is an error +461 * getting the position data. +462 * @param {PositionOptions} options The options for getting the position data +463 * such as timeout. +464 */ +465 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { +466 var referenceTime = 0; +467 if (this.lastPosition) +468 referenceTime = this.lastPosition.timeout; +469 else +470 this.start(options); 471 -472 -473 -474 /** -475 * This class provides access to device GPS data. -476 * @constructor -477 */ -478 function Geolocation() { -479 /** -480 * The last known GPS position. -481 */ -482 this.lastPosition = null; -483 this.lastError = null; -484 this.callbacks = { -485 onLocationChanged: [], -486 onError: [] -487 }; -488 }; -489 -490 /** -491 * Asynchronously aquires the current position. -492 * @param {Function} successCallback The function to call when the position -493 * data is available -494 * @param {Function} errorCallback The function to call when there is an error -495 * getting the position data. -496 * @param {PositionOptions} options The options for getting the position data -497 * such as timeout. -498 */ -499 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { -500 var referenceTime = 0; -501 if (this.lastPosition) -502 referenceTime = this.lastPosition.timeout; -503 else -504 this.start(options); -505 -506 var timeout = 20000; -507 var interval = 500; -508 if (typeof(options) == 'object' && options.interval) -509 interval = options.interval; -510 -511 if (typeof(successCallback) != 'function') -512 successCallback = function() {}; -513 if (typeof(errorCallback) != 'function') -514 errorCallback = function() {}; -515 -516 var dis = this; -517 var delay = 0; -518 var timer = setInterval(function() { -519 delay += interval; +472 var timeout = 20000; +473 var interval = 500; +474 if (typeof(options) == 'object' && options.interval) +475 interval = options.interval; +476 +477 if (typeof(successCallback) != 'function') +478 successCallback = function() {}; +479 if (typeof(errorCallback) != 'function') +480 errorCallback = function() {}; +481 +482 var dis = this; +483 var delay = 0; +484 var timer = setInterval(function() { +485 delay += interval; +486 +487 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { +488 successCallback(dis.lastPosition); +489 clearInterval(timer); +490 } else if (delay >= timeout) { +491 errorCallback(); +492 clearInterval(timer); +493 } +494 }, interval); +495 }; +496 +497 /** +498 * Asynchronously aquires the position repeatedly at a given interval. +499 * @param {Function} successCallback The function to call each time the position +500 * data is available +501 * @param {Function} errorCallback The function to call when there is an error +502 * getting the position data. +503 * @param {PositionOptions} options The options for getting the position data +504 * such as timeout and the frequency of the watch. +505 */ +506 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { +507 // Invoke the appropriate callback with a new Position object every time the implementation +508 // determines that the position of the hosting device has changed. +509 +510 this.getCurrentPosition(successCallback, errorCallback, options); +511 var frequency = 10000; +512 if (typeof(options) == 'object' && options.frequency) +513 frequency = options.frequency; +514 +515 var that = this; +516 return setInterval(function() { +517 that.getCurrentPosition(successCallback, errorCallback, options); +518 }, frequency); +519 }; 520 -521 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { -522 successCallback(dis.lastPosition); -523 clearInterval(timer); -524 } else if (delay >= timeout) { -525 errorCallback(); -526 clearInterval(timer); -527 } -528 }, interval); -529 }; -530 -531 /** -532 * Asynchronously aquires the position repeatedly at a given interval. -533 * @param {Function} successCallback The function to call each time the position -534 * data is available -535 * @param {Function} errorCallback The function to call when there is an error -536 * getting the position data. -537 * @param {PositionOptions} options The options for getting the position data -538 * such as timeout and the frequency of the watch. -539 */ -540 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { -541 // Invoke the appropriate callback with a new Position object every time the implementation -542 // determines that the position of the hosting device has changed. -543 -544 this.getCurrentPosition(successCallback, errorCallback, options); -545 var frequency = 10000; -546 if (typeof(options) == 'object' && options.frequency) -547 frequency = options.frequency; -548 -549 var that = this; -550 return setInterval(function() { -551 that.getCurrentPosition(successCallback, errorCallback, options); -552 }, frequency); -553 }; -554 -555 -556 /** -557 * Clears the specified position watch. -558 * @param {String} watchId The ID of the watch returned from #watchPosition. -559 */ -560 Geolocation.prototype.clearWatch = function(watchId) { -561 clearInterval(watchId); -562 }; -563 -564 /** -565 * Called by the geolocation framework when the current location is found. -566 * @param {PositionOptions} position The current position. -567 */ -568 Geolocation.prototype.setLocation = function(position) { -569 this.lastPosition = position; -570 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { -571 var f = this.callbacks.onLocationChanged.shift(); -572 f(position); -573 } -574 }; -575 -576 /** -577 * Called by the geolocation framework when an error occurs while looking up the current position. -578 * @param {String} message The text of the error message. -579 */ -580 Geolocation.prototype.setError = function(message) { -581 this.lastError = message; -582 for (var i = 0; i < this.callbacks.onError.length; i++) { -583 var f = this.callbacks.onError.shift(); -584 f(message); -585 } -586 }; +521 +522 /** +523 * Clears the specified position watch. +524 * @param {String} watchId The ID of the watch returned from #watchPosition. +525 */ +526 Geolocation.prototype.clearWatch = function(watchId) { +527 clearInterval(watchId); +528 }; +529 +530 /** +531 * Called by the geolocation framework when the current location is found. +532 * @param {PositionOptions} position The current position. +533 */ +534 Geolocation.prototype.setLocation = function(position) { +535 this.lastPosition = position; +536 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { +537 var f = this.callbacks.onLocationChanged.shift(); +538 f(position); +539 } +540 }; +541 +542 /** +543 * Called by the geolocation framework when an error occurs while looking up the current position. +544 * @param {String} message The text of the error message. +545 */ +546 Geolocation.prototype.setError = function(message) { +547 this.lastError = message; +548 for (var i = 0; i < this.callbacks.onError.length; i++) { +549 var f = this.callbacks.onError.shift(); +550 f(message); +551 } +552 }; +553 +554 PhoneGap.addConstructor(function() { +555 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); +556 }); +557 +558 +559 +560 /** +561 * This class provides access to native mapping applications on the device. +562 */ +563 function Map() { +564 +565 } +566 +567 /** +568 * Shows a native map on the device with pins at the given positions. +569 * @param {Array} positions +570 */ +571 Map.prototype.show = function(positions) { +572 +573 } +574 +575 PhoneGap.addConstructor(function() { +576 if (typeof navigator.map == "undefined") navigator.map = new Map(); +577 }); +578 +579 +580 +581 /** +582 * This class provides access to notifications on the device. +583 */ +584 function Notification() { +585 +586 } 587 -588 PhoneGap.addConstructor(function() { -589 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); -590 }); -591 -592 -593 -594 /** -595 * This class provides access to native mapping applications on the device. -596 */ -597 function Map() { -598 -599 } -600 -601 /** -602 * Shows a native map on the device with pins at the given positions. -603 * @param {Array} positions -604 */ -605 Map.prototype.show = function(positions) { -606 -607 } -608 -609 PhoneGap.addConstructor(function() { -610 if (typeof navigator.map == "undefined") navigator.map = new Map(); -611 }); -612 -613 -614 -615 /** -616 * This class provides access to notifications on the device. -617 */ -618 function Notification() { -619 -620 } -621 -622 /** -623 * Open a native alert dialog, with a customizable title and button text. -624 * @param {String} message Message to print in the body of the alert -625 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) -626 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) -627 */ -628 Notification.prototype.alert = function(message, title, buttonLabel) { -629 // Default is to use a browser alert; this will use "index.html" as the title though -630 alert(message); -631 }; -632 -633 /** -634 * Start spinning the activity indicator on the statusbar -635 */ -636 Notification.prototype.activityStart = function() { -637 }; +588 /** +589 * Open a native alert dialog, with a customizable title and button text. +590 * @param {String} message Message to print in the body of the alert +591 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) +592 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) +593 */ +594 Notification.prototype.alert = function(message, title, buttonLabel) { +595 // Default is to use a browser alert; this will use "index.html" as the title though +596 alert(message); +597 }; +598 +599 /** +600 * Start spinning the activity indicator on the statusbar +601 */ +602 Notification.prototype.activityStart = function() { +603 }; +604 +605 /** +606 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +607 */ +608 Notification.prototype.activityStop = function() { +609 }; +610 +611 /** +612 * Causes the device to blink a status LED. +613 * @param {Integer} count The number of blinks. +614 * @param {String} colour The colour of the light. +615 */ +616 Notification.prototype.blink = function(count, colour) { +617 +618 }; +619 +620 /** +621 * Causes the device to vibrate. +622 * @param {Integer} mills The number of milliseconds to vibrate for. +623 */ +624 Notification.prototype.vibrate = function(mills) { +625 +626 }; +627 +628 /** +629 * Causes the device to beep. +630 * @param {Integer} count The number of beeps. +631 * @param {Integer} volume The volume of the beep. +632 */ +633 Notification.prototype.beep = function(count, volume) { +634 +635 }; +636 +637 // TODO: of course on Blackberry and Android there notifications in the UI as well 638 -639 /** -640 * Stop spinning the activity indicator on the statusbar, if it's currently spinning -641 */ -642 Notification.prototype.activityStop = function() { -643 }; -644 +639 PhoneGap.addConstructor(function() { +640 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +641 }); +642 +643 +644 645 /** -646 * Causes the device to blink a status LED. -647 * @param {Integer} count The number of blinks. -648 * @param {String} colour The colour of the light. -649 */ -650 Notification.prototype.blink = function(count, colour) { -651 -652 }; -653 -654 /** -655 * Causes the device to vibrate. -656 * @param {Integer} mills The number of milliseconds to vibrate for. -657 */ -658 Notification.prototype.vibrate = function(mills) { -659 -660 }; -661 -662 /** -663 * Causes the device to beep. -664 * @param {Integer} count The number of beeps. -665 * @param {Integer} volume The volume of the beep. -666 */ -667 Notification.prototype.beep = function(count, volume) { -668 -669 }; -670 -671 // TODO: of course on Blackberry and Android there notifications in the UI as well -672 -673 PhoneGap.addConstructor(function() { -674 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); -675 }); -676 -677 -678 -679 /** -680 * This class provides access to the device orientation. -681 * @constructor -682 */ -683 function Orientation() { -684 /** -685 * The last known orientation. -686 */ -687 this.lastOrientation = null; -688 } -689 -690 /** -691 * Asynchronously aquires the current orientation. -692 * @param {Function} successCallback The function to call when the orientation -693 * is known. -694 * @param {Function} errorCallback The function to call when there is an error -695 * getting the orientation. -696 */ -697 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { -698 // If the position is available then call success -699 // If the position is not available then call error -700 } -701 -702 /** -703 * Asynchronously aquires the orientation repeatedly at a given interval. -704 * @param {Function} successCallback The function to call each time the orientation -705 * data is available. -706 * @param {Function} errorCallback The function to call when there is an error -707 * getting the orientation data. +646 * This class provides access to the device orientation. +647 * @constructor +648 */ +649 function Orientation() { +650 /** +651 * The last known orientation. +652 */ +653 this.lastOrientation = null; +654 } +655 +656 /** +657 * Asynchronously aquires the current orientation. +658 * @param {Function} successCallback The function to call when the orientation +659 * is known. +660 * @param {Function} errorCallback The function to call when there is an error +661 * getting the orientation. +662 */ +663 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { +664 // If the position is available then call success +665 // If the position is not available then call error +666 } +667 +668 /** +669 * Asynchronously aquires the orientation repeatedly at a given interval. +670 * @param {Function} successCallback The function to call each time the orientation +671 * data is available. +672 * @param {Function} errorCallback The function to call when there is an error +673 * getting the orientation data. +674 */ +675 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { +676 // Invoke the appropriate callback with a new Position object every time the implementation +677 // determines that the position of the hosting device has changed. +678 this.getCurrentPosition(successCallback, errorCallback); +679 return setInterval(function() { +680 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); +681 }, 10000); +682 } +683 +684 /** +685 * Clears the specified orientation watch. +686 * @param {String} watchId The ID of the watch returned from #watchOrientation. +687 */ +688 Orientation.prototype.clearWatch = function(watchId) { +689 clearInterval(watchId); +690 } +691 +692 PhoneGap.addConstructor(function() { +693 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); +694 }); +695 +696 +697 +698 /** +699 * This class contains position information. +700 * @param {Object} lat +701 * @param {Object} lng +702 * @param {Object} acc +703 * @param {Object} alt +704 * @param {Object} altacc +705 * @param {Object} head +706 * @param {Object} vel +707 * @constructor 708 */ -709 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { -710 // Invoke the appropriate callback with a new Position object every time the implementation -711 // determines that the position of the hosting device has changed. -712 this.getCurrentPosition(successCallback, errorCallback); -713 return setInterval(function() { -714 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); -715 }, 10000); -716 } -717 -718 /** -719 * Clears the specified orientation watch. -720 * @param {String} watchId The ID of the watch returned from #watchOrientation. -721 */ -722 Orientation.prototype.clearWatch = function(watchId) { -723 clearInterval(watchId); -724 } -725 -726 PhoneGap.addConstructor(function() { -727 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); -728 }); -729 -730 -731 -732 /** -733 * This class contains position information. -734 * @param {Object} lat -735 * @param {Object} lng -736 * @param {Object} acc -737 * @param {Object} alt -738 * @param {Object} altacc -739 * @param {Object} head -740 * @param {Object} vel -741 * @constructor -742 */ -743 function Position(lat, lng, acc, alt, altacc, head, vel) { -744 /** -745 * The latitude of the position. -746 */ -747 this.latitude = lat; -748 /** -749 * The longitude of the position, -750 */ -751 this.longitude = lng; -752 /** -753 * The accuracy of the position. -754 */ -755 this.accuracy = acc; -756 /** -757 * The altitude of the position. -758 */ -759 this.altitude = alt; -760 /** -761 * The altitude accuracy of the position. -762 */ -763 this.altitudeAccuracy = altacc; -764 /** -765 * The direction the device is moving at the position. -766 */ -767 this.heading = head; -768 /** -769 * The velocity with which the device is moving at the position. -770 */ -771 this.velocity = vel; -772 /** -773 * The time that the position was obtained. -774 */ -775 this.timestamp = new Date().getTime(); -776 } -777 -778 /** -779 * This class specifies the options for requesting position data. -780 * @constructor -781 */ -782 function PositionOptions() { -783 /** -784 * Specifies the desired position accuracy. -785 */ -786 this.enableHighAccuracy = true; -787 /** -788 * The timeout after which if position data cannot be obtained the errorCallback -789 * is called. -790 */ -791 this.timeout = 10000; -792 } -793 -794 /** -795 * This class contains information about any GSP errors. -796 * @constructor -797 */ -798 function PositionError() { -799 this.code = null; -800 this.message = ""; -801 } -802 -803 PositionError.UNKNOWN_ERROR = 0; -804 PositionError.PERMISSION_DENIED = 1; -805 PositionError.POSITION_UNAVAILABLE = 2; -806 PositionError.TIMEOUT = 3; -807 -808 -809 +709 function Position(lat, lng, acc, alt, altacc, head, vel) { +710 /** +711 * The latitude of the position. +712 */ +713 this.latitude = lat; +714 /** +715 * The longitude of the position, +716 */ +717 this.longitude = lng; +718 /** +719 * The accuracy of the position. +720 */ +721 this.accuracy = acc; +722 /** +723 * The altitude of the position. +724 */ +725 this.altitude = alt; +726 /** +727 * The altitude accuracy of the position. +728 */ +729 this.altitudeAccuracy = altacc; +730 /** +731 * The direction the device is moving at the position. +732 */ +733 this.heading = head; +734 /** +735 * The velocity with which the device is moving at the position. +736 */ +737 this.velocity = vel; +738 /** +739 * The time that the position was obtained. +740 */ +741 this.timestamp = new Date().getTime(); +742 } +743 +744 /** +745 * This class specifies the options for requesting position data. +746 * @constructor +747 */ +748 function PositionOptions() { +749 /** +750 * Specifies the desired position accuracy. +751 */ +752 this.enableHighAccuracy = true; +753 /** +754 * The timeout after which if position data cannot be obtained the errorCallback +755 * is called. +756 */ +757 this.timeout = 10000; +758 } +759 +760 /** +761 * This class contains information about any GSP errors. +762 * @constructor +763 */ +764 function PositionError() { +765 this.code = null; +766 this.message = ""; +767 } +768 +769 PositionError.UNKNOWN_ERROR = 0; +770 PositionError.PERMISSION_DENIED = 1; +771 PositionError.POSITION_UNAVAILABLE = 2; +772 PositionError.TIMEOUT = 3; +773 +774 +775 +776 /** +777 * This class provides access to the device SMS functionality. +778 * @constructor +779 */ +780 function Sms() { +781 +782 } +783 +784 /** +785 * Sends an SMS message. +786 * @param {Integer} number The phone number to send the message to. +787 * @param {String} message The contents of the SMS message to send. +788 * @param {Function} successCallback The function to call when the SMS message is sent. +789 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. +790 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. +791 */ +792 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { +793 +794 } +795 +796 PhoneGap.addConstructor(function() { +797 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); +798 }); +799 +800 +801 +802 /** +803 * This class provides access to the telephony features of the device. +804 * @constructor +805 */ +806 function Telephony() { +807 +808 } +809 810 /** -811 * This class provides access to the device SMS functionality. -812 * @constructor +811 * Calls the specifed number. +812 * @param {Integer} number The number to be called. 813 */ -814 function Sms() { -815 +814 Telephony.prototype.call = function(number) { +815 816 } 817 -818 /** -819 * Sends an SMS message. -820 * @param {Integer} number The phone number to send the message to. -821 * @param {String} message The contents of the SMS message to send. -822 * @param {Function} successCallback The function to call when the SMS message is sent. -823 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. -824 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. -825 */ -826 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { -827 -828 } -829 -830 PhoneGap.addConstructor(function() { -831 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); -832 }); -833 -834 -835 -836 /** -837 * This class provides access to the telephony features of the device. -838 * @constructor -839 */ -840 function Telephony() { -841 -842 } -843 -844 /** -845 * Calls the specifed number. -846 * @param {Integer} number The number to be called. -847 */ -848 Telephony.prototype.call = function(number) { -849 -850 } -851 -852 PhoneGap.addConstructor(function() { -853 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); -854 }); -855 -856 -857 \ No newline at end of file +818 PhoneGap.addConstructor(function() { +819 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); +820 }); +821 +822 +823 \ No newline at end of file From e1e928a36e65f21191c729c0f8dbabf3fc2afcd3 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Sun, 19 Apr 2009 17:25:08 -0700 Subject: [PATCH 03/10] Tab item callbacks fired when items are selected --- iphone/Classes/UIControls.m | 23 +- iphone/www/index.html | 22 +- iphone/www/phonegap.js | 2 +- javascripts/iphone/uicontrols.js | 29 + javascripts/uicontrols.js | 76 +- lib/android/phonegap-min.js | 2 +- lib/android/phonegap.js | 76 +- lib/blackberry/phonegap-min.js | 2 +- lib/blackberry/phonegap.js | 76 +- lib/iphone/phonegap-min.js | 2 +- lib/iphone/phonegap.js | 105 +- util/jsdoc-toolkit/out/jsdoc/files.html | 2 +- util/jsdoc-toolkit/out/jsdoc/index.html | 2 +- .../out/jsdoc/symbols/Acceleration.html | 2 +- .../jsdoc/symbols/AccelerationOptions.html | 2 +- .../out/jsdoc/symbols/Accelerometer.html | 2 +- .../out/jsdoc/symbols/Camera.html | 2 +- .../out/jsdoc/symbols/Contact.html | 2 +- .../out/jsdoc/symbols/DebugConsole.html | 2 +- .../out/jsdoc/symbols/Device.html | 2 +- .../out/jsdoc/symbols/Geolocation.html | 2 +- .../out/jsdoc/symbols/Media.html | 2 +- .../out/jsdoc/symbols/MediaError.html | 2 +- .../out/jsdoc/symbols/Orientation.html | 2 +- .../out/jsdoc/symbols/PhoneGap.html | 2 +- .../out/jsdoc/symbols/Position.html | 2 +- .../out/jsdoc/symbols/PositionError.html | 2 +- .../out/jsdoc/symbols/PositionOptions.html | 2 +- util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html | 2 +- .../out/jsdoc/symbols/Telephony.html | 2 +- .../out/jsdoc/symbols/UIControls.html | 394 +++++- .../out/jsdoc/symbols/_global_.html | 2 +- .../jsdoc/symbols/src/tmp_phonegap.js.html | 1058 +++++++++-------- 33 files changed, 1364 insertions(+), 543 deletions(-) diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 4ecf49c7..5538d573 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -24,13 +24,10 @@ -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView * Create a native tab bar at either the top or the bottom of the display. * @brief creates a tab bar * @param arguments unused - * @param options used to indicate options for where and how the tab bar should be placed - * - \c height integer indicating the height of the tab bar (default: \c 49) - * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom) + * @param options unused */ - (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"createTabBar"); tabBar = [UITabBar new]; [tabBar sizeToFit]; tabBar.delegate = self; @@ -46,11 +43,12 @@ - (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options * Show the tab bar after its been created. * @brief show the tab bar * @param arguments unused - * @param options unused + * @param options used to indicate options for where and how the tab bar should be placed + * - \c height integer indicating the height of the tab bar (default: \c 49) + * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom) */ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"showTabBar"); CGFloat height = 49.0f; BOOL atBottom = YES; @@ -65,7 +63,6 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options CGRect webViewBounds = webView.bounds; CGRect tabBarBounds; if (atBottom) { - NSLog(@"Positioning tabbar at bottom"); tabBarBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y + webViewBounds.size.height - height, @@ -79,7 +76,6 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options webViewBounds.size.height - height ); } else { - NSLog(@"Positioning tabbar at top"); tabBarBounds = CGRectMake( webViewBounds.origin.x, webViewBounds.origin.y, @@ -106,7 +102,6 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"hideTabBar"); tabBar.hidden = YES; } @@ -139,7 +134,6 @@ - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"createTabBarItem"); NSString *name = [arguments objectAtIndex:0]; NSString *title = [arguments objectAtIndex:1]; NSString *imageName = [arguments objectAtIndex:2]; @@ -147,7 +141,6 @@ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options UITabBarItem *item; if ([[imageName substringWithRange:NSMakeRange(0, 10)] isEqualTo:@"tabButton:"]) { - NSLog(@"Tab button!!"); UIBarButtonSystemItem systemItem; if ([imageName isEqualTo:@"tabButton:More"]) systemItem = UITabBarSystemItemMore; if ([imageName isEqualTo:@"tabButton:Favorites"]) systemItem = UITabBarSystemItemFavorites; @@ -186,7 +179,6 @@ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"updateTabBarItem"); NSString *name = [arguments objectAtIndex:0]; UITabBarItem *item = [tabBarItems objectForKey:name]; if (item) @@ -204,7 +196,6 @@ - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options { - NSLog(@"showTabBarItems"); int i, count = [arguments count]; NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:count]; for (i = 0; i < count; i++) { @@ -294,6 +285,12 @@ -(UIBarButtonSystemItem) getSystemItemFromString:(NSString*)imageName } */ +- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item +{ + NSString * jsCallBack = [NSString stringWithFormat:@"uicontrols.tabBarItemSelected(%d);", item.tag]; + [webView stringByEvaluatingJavaScriptFromString:jsCallBack]; +} + - (void)dealloc { if (tabBar) diff --git a/iphone/www/index.html b/iphone/www/index.html index 5f6acd35..846c424e 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -35,13 +35,21 @@ debug.log("beep"); navigator.notification.beep(2); try { - PhoneGap.exec("UIControls.createTabBar"); - PhoneGap.exec("UIControls.createTabBarItem", "toprated", "Top Rated", "tabButton:TopRated", 1); - PhoneGap.exec("UIControls.createTabBarItem", "recents", "Recents", "tabButton:Recents", 2); - PhoneGap.exec("UIControls.createTabBarItem", "history", "History", "tabButton:History", 3); - PhoneGap.exec("UIControls.createTabBarItem", "more", "More", "tabButton:More", 4); - PhoneGap.exec("UIControls.showTabBar"); - PhoneGap.exec("UIControls.showTabBarItems", "toprated", "recents", "history", "more"); + uicontrols.createTabBar(); + uicontrols.createTabBarItem("toprated", "Top Rated", "tabButton:TopRated", { onSelect: function() { + debug.log("Top Rated selected"); + }}); + uicontrols.createTabBarItem("recents", "Recents", "tabButton:Recents", { onSelect: function() { + debug.log("Recents selected"); + }}); + uicontrols.createTabBarItem("history", "History", "tabButton:History", { onSelect: function() { + debug.log("History selected"); + }}); + uicontrols.createTabBarItem("more", "More", "tabButton:More", { onSelect: function() { + debug.log("More selected"); + }}); + uicontrols.showTabBar(); + uicontrols.showTabBarItems("toprated", "recents", "history", "more"); } catch(e) { debug.log(e); } diff --git a/iphone/www/phonegap.js b/iphone/www/phonegap.js index f087e67a..fe90f530 100644 --- a/iphone/www/phonegap.js +++ b/iphone/www/phonegap.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;bTab Buttons + * - tabButton:More + * - tabButton:Favorites + * - tabButton:Featured + * - tabButton:TopRated + * - tabButton:Recents + * - tabButton:Contacts + * - tabButton:History + * - tabButton:Bookmarks + * - tabButton:Search + * - tabButton:Downloads + * - tabButton:MostRecent + * - tabButton:MostViewed + * @param {String} name internal name to refer to this tab by + * @param {String} [title] title text to show on the tab, or null if no text should be shown + * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown + * @param {Object} [options] Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ +UIControls.prototype.createTabBarItem = function(name, label, image, options) {}; + +/** + * Update an existing tab bar item to change its badge value. + * @param {String} name internal name used to represent this item when it was created + * @param {Object} options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ +UIControls.prototype.updateTabBarItem = function(name, options) {}; + +/** + * Show previously created items on the tab bar + * @param {String} arguments... the item names to be shown + * @param {Object} [options] dictionary of options, notable options including: + * - \c animate indicates that the items should animate onto the tab bar + * @see createTabBarItem + * @see createTabBar + */ +UIControls.prototype.showTabBarItems = function(tabs, options) {}; + +/** + * Function called when a tab bar item has been selected. + * @param {Number} tag the tag number for the item that has been selected + */ +UIControls.prototype.tabBarItemSelected = function(tag) { + if (typeof(this.tabBarCallbacks[tag]) == 'function') + this.tabBarCallbacks[tag](); +}; + PhoneGap.addConstructor(function() { window.uicontrols = new UIControls(); }); diff --git a/lib/android/phonegap-min.js b/lib/android/phonegap-min.js index bee31676..ad14a169 100644 --- a/lib/android/phonegap-min.js +++ b/lib/android/phonegap-min.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){}PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;bTab Buttons + * - tabButton:More + * - tabButton:Favorites + * - tabButton:Featured + * - tabButton:TopRated + * - tabButton:Recents + * - tabButton:Contacts + * - tabButton:History + * - tabButton:Bookmarks + * - tabButton:Search + * - tabButton:Downloads + * - tabButton:MostRecent + * - tabButton:MostViewed + * @param {String} name internal name to refer to this tab by + * @param {String} [title] title text to show on the tab, or null if no text should be shown + * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown + * @param {Object} [options] Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.createTabBarItem = function(name, label, image, options) {}; + + /** + * Update an existing tab bar item to change its badge value. + * @param {String} name internal name used to represent this item when it was created + * @param {Object} options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.updateTabBarItem = function(name, options) {}; + + /** + * Show previously created items on the tab bar + * @param {String} arguments... the item names to be shown + * @param {Object} [options] dictionary of options, notable options including: + * - \c animate indicates that the items should animate onto the tab bar + * @see createTabBarItem + * @see createTabBar + */ + UIControls.prototype.showTabBarItems = function(tabs, options) {}; + + /** + * Function called when a tab bar item has been selected. + * @param {Number} tag the tag number for the item that has been selected + */ + UIControls.prototype.tabBarItemSelected = function(tag) { + if (typeof(this.tabBarCallbacks[tag]) == 'function') + this.tabBarCallbacks[tag](); + }; + PhoneGap.addConstructor(function() { window.uicontrols = new UIControls(); }); diff --git a/lib/blackberry/phonegap-min.js b/lib/blackberry/phonegap-min.js index 55d5795e..8f5f1cd5 100644 --- a/lib/blackberry/phonegap-min.js +++ b/lib/blackberry/phonegap-min.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){}PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;bTab Buttons + * - tabButton:More + * - tabButton:Favorites + * - tabButton:Featured + * - tabButton:TopRated + * - tabButton:Recents + * - tabButton:Contacts + * - tabButton:History + * - tabButton:Bookmarks + * - tabButton:Search + * - tabButton:Downloads + * - tabButton:MostRecent + * - tabButton:MostViewed + * @param {String} name internal name to refer to this tab by + * @param {String} [title] title text to show on the tab, or null if no text should be shown + * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown + * @param {Object} [options] Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.createTabBarItem = function(name, label, image, options) {}; + + /** + * Update an existing tab bar item to change its badge value. + * @param {String} name internal name used to represent this item when it was created + * @param {Object} options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.updateTabBarItem = function(name, options) {}; + + /** + * Show previously created items on the tab bar + * @param {String} arguments... the item names to be shown + * @param {Object} [options] dictionary of options, notable options including: + * - \c animate indicates that the items should animate onto the tab bar + * @see createTabBarItem + * @see createTabBar + */ + UIControls.prototype.showTabBarItems = function(tabs, options) {}; + + /** + * Function called when a tab bar item has been selected. + * @param {Number} tag the tag number for the item that has been selected + */ + UIControls.prototype.tabBarItemSelected = function(tag) { + if (typeof(this.tabBarCallbacks[tag]) == 'function') + this.tabBarCallbacks[tag](); + }; + PhoneGap.addConstructor(function() { window.uicontrols = new UIControls(); }); diff --git a/lib/iphone/phonegap-min.js b/lib/iphone/phonegap-min.js index f087e67a..fe90f530 100644 --- a/lib/iphone/phonegap-min.js +++ b/lib/iphone/phonegap-min.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;bTab Buttons + * - tabButton:More + * - tabButton:Favorites + * - tabButton:Featured + * - tabButton:TopRated + * - tabButton:Recents + * - tabButton:Contacts + * - tabButton:History + * - tabButton:Bookmarks + * - tabButton:Search + * - tabButton:Downloads + * - tabButton:MostRecent + * - tabButton:MostViewed + * @param {String} name internal name to refer to this tab by + * @param {String} [title] title text to show on the tab, or null if no text should be shown + * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown + * @param {Object} [options] Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.createTabBarItem = function(name, label, image, options) {}; + + /** + * Update an existing tab bar item to change its badge value. + * @param {String} name internal name used to represent this item when it was created + * @param {Object} options Options for customizing the individual tab item + * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden + */ + UIControls.prototype.updateTabBarItem = function(name, options) {}; + + /** + * Show previously created items on the tab bar + * @param {String} arguments... the item names to be shown + * @param {Object} [options] dictionary of options, notable options including: + * - \c animate indicates that the items should animate onto the tab bar + * @see createTabBarItem + * @see createTabBar + */ + UIControls.prototype.showTabBarItems = function(tabs, options) {}; + + /** + * Function called when a tab bar item has been selected. + * @param {Number} tag the tag number for the item that has been selected + */ + UIControls.prototype.tabBarItemSelected = function(tag) { + if (typeof(this.tabBarCallbacks[tag]) == 'function') + this.tabBarCallbacks[tag](); + }; + PhoneGap.addConstructor(function() { window.uicontrols = new UIControls(); }); + UIControls.prototype.createTabBar = function() { + PhoneGap.exec("UIControls.createTabBar"); + }; + + UIControls.prototype.showTabBar = function(options) { + PhoneGap.exec("UIControls.showTabBar", options); + }; + UIControls.prototype.hideTabBar = function(animate) { + PhoneGap.exec("UIControls.hideTabBar", { animate: animate }); + }; + + UIControls.prototype.createTabBarItem = function(name, label, image, options) { + var tag = this.tabBarTag++; + if (typeof(options['onSelect']) == 'function') + this.tabBarCallbacks[tag] = options.onSelect; + PhoneGap.exec("UIControls.createTabBarItem", name, label, image, tag, options); + }; + + UIControls.prototype.updateTabBarItem = function(name, options) { + PhoneGap.exec("UIControls.updateTabBarItem", name, options); + }; + + UIControls.prototype.showTabBarItems = function() { + var parameters = [ "UIControls.showTabBarItems" ]; + for (var i = 0; i < arguments.length; i++) { + parameters.push(arguments[i]); + } + PhoneGap.exec.apply(this, parameters); + }; diff --git a/util/jsdoc-toolkit/out/jsdoc/files.html b/util/jsdoc-toolkit/out/jsdoc/files.html index 5a487505..221e3cc6 100644 --- a/util/jsdoc-toolkit/out/jsdoc/files.html +++ b/util/jsdoc-toolkit/out/jsdoc/files.html @@ -246,7 +246,7 @@

tmp/phonegap.js

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/util/jsdoc-toolkit/out/jsdoc/index.html index 5abe9687..091ca9d5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/util/jsdoc-toolkit/out/jsdoc/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html index 1c3470a1..3528266e 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html index 007690bb..386e0ced 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html index 55ec9a5b..e3f2f752 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html index e6dd1c83..e43bf7d2 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html index 99981e33..8b53f12d 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html index 0a138642..0f0d2f6a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html index e41d7485..9fe8934f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html index e22dbed5..6e507c1a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html index 78e0b515..3612d7e9 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html index fb684ed1..563bb46f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html index 0333f624..b10f4f76 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html index b7a407f9..9d3fd5c2 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html index bbd7db27..ba34e0ed 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html index fbd2fa62..c715631d 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html index 67152d34..4de3f6b6 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html index 777a4a13..f61ec6bb 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html index 2bec0154..523a3559 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html index 23edaff0..37cbd868 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html @@ -268,7 +268,7 @@

UIControls()
This class exposes mobile phone interface controls to JavaScript, such as -native alerts, tab and tool bars, etc.
+native tab and tool bars, etc. @@ -280,6 +280,87 @@

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  + +
Create a native tab bar that can have tab buttons added to it which can respond to events.
+
  +
createTabBarItem(name, title, image, options) +
+
Create a new tab bar item for use on a previously created tab bar.
+
  +
hideTabBar(animate) +
+
Hide a tab bar.
+
  +
showTabBar(options) +
+
Show a tab bar.
+
  +
showTabBarItems(options) +
+
Show previously created items on the tab bar
+
  + +
Function called when a tab bar item has been selected.
+
  +
updateTabBarItem(name, options) +
+
Update an existing tab bar item to change its badge value.
+
+ + + + @@ -296,7 +377,7 @@

This class exposes mobile phone interface controls to JavaScript, such as -native alerts, tab and tool bars, etc. +native tab and tool bars, etc.
@@ -319,6 +400,313 @@

+
+ Method Detail +
+ + +
+ + + createTabBar() + +
+
+ Create a native tab bar that can have tab buttons added to it which can respond to events. + + +
+ + + + + + + + + + + +
+ + +
+ + + createTabBarItem(name, title, image, options) + +
+
+ Create a new tab bar item for use on a previously created tab bar. Use ::showTabBarItems to show the new item on the tab bar. + +If the supplied image name is one of the labels listed below, then this method will construct a tab button +using the standard system buttons. Note that if you use one of the system images, that the \c title you supply will be ignored. + +Tab Buttons + - tabButton:More + - tabButton:Favorites + - tabButton:Featured + - tabButton:TopRated + - tabButton:Recents + - tabButton:Contacts + - tabButton:History + - tabButton:Bookmarks + - tabButton:Search + - tabButton:Downloads + - tabButton:MostRecent + - tabButton:MostViewed + + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
internal name to refer to this tab by
+ +
+ {String} title + Optional +
+
title text to show on the tab, or null if no text should be shown
+ +
+ {String} image + Optional +
+
image filename or internal identifier to show, or null if now image should be shown
+ +
+ {Object} options + Optional +
+
Options for customizing the individual tab item + - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden
+ +
+ + + + + + + + +
+ + +
+ + + hideTabBar(animate) + +
+
+ Hide a tab bar. The tab bar has to be created first. + + +
+ + + + +
+
Parameters:
+ +
+ animate + +
+
+ +
+ + + + + + + + +
+ + +
+ + + showTabBar(options) + +
+
+ Show a tab bar. The tab bar has to be created first. + + +
+ + + + +
+
Parameters:
+ +
+ {Object} options + Optional +
+
Options indicating how the tab bar should be shown: +- \c height integer indicating the height of the tab bar (default: \c 49) +- \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom)
+ +
+ + + + + + + + +
+ + +
+ + + showTabBarItems(options) + +
+
+ Show previously created items on the tab bar + + +
+ + + + +
+
Parameters:
+ +
+ {String} arguments... + +
+
the item names to be shown
+ +
+ {Object} options + Optional +
+
dictionary of options, notable options including: + - \c animate indicates that the items should animate onto the tab bar
+ +
+ + + + + + + +
+
See:
+ +
createTabBarItem
+ +
createTabBar
+ +
+ + +
+ + +
+ + + tabBarItemSelected(tag) + +
+
+ Function called when a tab bar item has been selected. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} tag + +
+
the tag number for the item that has been selected
+ +
+ + + + + + + + +
+ + +
+ + + updateTabBarItem(name, options) + +
+
+ Update an existing tab bar item to change its badge value. + + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
internal name used to represent this item when it was created
+ +
+ {Object} options + +
+
Options for customizing the individual tab item + - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden
+ +
+ + + + + + + + + + + @@ -330,7 +718,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:51 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html index 50c749a5..69410cca 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 13:58:50 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html index 734ec09d..4593247d 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html @@ -319,512 +319,586 @@ 312 313 /** 314 * This class exposes mobile phone interface controls to JavaScript, such as -315 * native alerts, tab and tool bars, etc. +315 * native tab and tool bars, etc. 316 * @constructor 317 */ 318 function UIControls() { -319 } -320 -321 PhoneGap.addConstructor(function() { -322 window.uicontrols = new UIControls(); -323 }); -324 -325 -326 -327 /** -328 * This class provides access to the debugging console. -329 * @constructor -330 */ -331 function DebugConsole() { -332 } -333 -334 /** -335 * Utility function for rendering and indenting strings, or serializing -336 * objects to a string capable of being printed to the console. -337 * @param {Object|String} message The string or object to convert to an indented string -338 * @private -339 */ -340 DebugConsole.prototype.processMessage = function(message) { -341 if (typeof(message) != 'object') { -342 return encodeURIComponent(message); -343 } else { -344 /** -345 * @function -346 * @ignore -347 */ -348 function indent(str) { -349 return str.replace(/^/mg, " "); -350 } -351 /** -352 * @function -353 * @ignore -354 */ -355 function makeStructured(obj) { -356 var str = ""; -357 for (var i in obj) { -358 try { -359 if (typeof(obj[i]) == 'object') { -360 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; -361 } else { -362 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; -363 } -364 } catch(e) { -365 str += i + " = EXCEPTION: " + e.message + "\n"; -366 } -367 } -368 return str; -369 } -370 return encodeURIComponent("Object:\n" + makeStructured(message)); -371 } -372 }; -373 -374 /** -375 * Print a normal log message to the console -376 * @param {Object|String} message Message or object to print to the console -377 */ -378 DebugConsole.prototype.log = function(message) { -379 }; -380 -381 /** -382 * Print a warning message to the console -383 * @param {Object|String} message Message or object to print to the console -384 */ -385 DebugConsole.prototype.warn = function(message) { -386 }; -387 -388 /** -389 * Print an error message to the console -390 * @param {Object|String} message Message or object to print to the console -391 */ -392 DebugConsole.prototype.error = function(message) { +319 this.tabBarTag = 0; +320 this.tabBarCallbacks = {}; +321 } +322 +323 /** +324 * Create a native tab bar that can have tab buttons added to it which can respond to events. +325 */ +326 UIControls.prototype.createTabBar = function() {}; +327 +328 /** +329 * Show a tab bar. The tab bar has to be created first. +330 * @param {Object} [options] Options indicating how the tab bar should be shown: +331 * - \c height integer indicating the height of the tab bar (default: \c 49) +332 * - \c position specifies whether the tab bar will be placed at the \c top or \c bottom of the screen (default: \c bottom) +333 */ +334 UIControls.prototype.showTabBar = function(options) {}; +335 +336 /** +337 * Hide a tab bar. The tab bar has to be created first. +338 */ +339 UIControls.prototype.hideTabBar = function(animate) {}; +340 +341 /** +342 * Create a new tab bar item for use on a previously created tab bar. Use ::showTabBarItems to show the new item on the tab bar. +343 * +344 * If the supplied image name is one of the labels listed below, then this method will construct a tab button +345 * using the standard system buttons. Note that if you use one of the system images, that the \c title you supply will be ignored. +346 * +347 * <b>Tab Buttons</b> +348 * - tabButton:More +349 * - tabButton:Favorites +350 * - tabButton:Featured +351 * - tabButton:TopRated +352 * - tabButton:Recents +353 * - tabButton:Contacts +354 * - tabButton:History +355 * - tabButton:Bookmarks +356 * - tabButton:Search +357 * - tabButton:Downloads +358 * - tabButton:MostRecent +359 * - tabButton:MostViewed +360 * @param {String} name internal name to refer to this tab by +361 * @param {String} [title] title text to show on the tab, or null if no text should be shown +362 * @param {String} [image] image filename or internal identifier to show, or null if now image should be shown +363 * @param {Object} [options] Options for customizing the individual tab item +364 * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden +365 */ +366 UIControls.prototype.createTabBarItem = function(name, label, image, options) {}; +367 +368 /** +369 * Update an existing tab bar item to change its badge value. +370 * @param {String} name internal name used to represent this item when it was created +371 * @param {Object} options Options for customizing the individual tab item +372 * - \c badge value to display in the optional circular badge on the item; if null or unspecified, the badge will be hidden +373 */ +374 UIControls.prototype.updateTabBarItem = function(name, options) {}; +375 +376 /** +377 * Show previously created items on the tab bar +378 * @param {String} arguments... the item names to be shown +379 * @param {Object} [options] dictionary of options, notable options including: +380 * - \c animate indicates that the items should animate onto the tab bar +381 * @see createTabBarItem +382 * @see createTabBar +383 */ +384 UIControls.prototype.showTabBarItems = function(tabs, options) {}; +385 +386 /** +387 * Function called when a tab bar item has been selected. +388 * @param {Number} tag the tag number for the item that has been selected +389 */ +390 UIControls.prototype.tabBarItemSelected = function(tag) { +391 if (typeof(this.tabBarCallbacks[tag]) == 'function') +392 this.tabBarCallbacks[tag](); 393 }; 394 395 PhoneGap.addConstructor(function() { -396 window.debug = new DebugConsole(); +396 window.uicontrols = new UIControls(); 397 }); 398 399 400 401 /** -402 * This class provides generic read and write access to the mobile device file system. -403 */ -404 function File() { -405 /** -406 * The data of a file. -407 */ -408 this.data = ""; -409 /** -410 * The name of the file. -411 */ -412 this.name = ""; -413 } -414 -415 /** -416 * Reads a file from the mobile device. This function is asyncronous. -417 * @param {String} fileName The name (including the path) to the file on the mobile device. -418 * The file name will likely be device dependant. -419 * @param {Function} successCallback The function to call when the file is successfully read. -420 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. -421 */ -422 File.prototype.read = function(fileName, successCallback, errorCallback) { -423 -424 } -425 -426 /** -427 * Writes a file to the mobile device. -428 * @param {File} file The file to write to the device. -429 */ -430 File.prototype.write = function(file) { -431 -432 } -433 -434 PhoneGap.addConstructor(function() { -435 if (typeof navigator.file == "undefined") navigator.file = new File(); -436 }); -437 -438 -439 -440 /** -441 * This class provides access to device GPS data. -442 * @constructor -443 */ -444 function Geolocation() { -445 /** -446 * The last known GPS position. -447 */ -448 this.lastPosition = null; -449 this.lastError = null; -450 this.callbacks = { -451 onLocationChanged: [], -452 onError: [] -453 }; -454 }; -455 -456 /** -457 * Asynchronously aquires the current position. -458 * @param {Function} successCallback The function to call when the position -459 * data is available -460 * @param {Function} errorCallback The function to call when there is an error -461 * getting the position data. -462 * @param {PositionOptions} options The options for getting the position data -463 * such as timeout. -464 */ -465 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { -466 var referenceTime = 0; -467 if (this.lastPosition) -468 referenceTime = this.lastPosition.timeout; -469 else -470 this.start(options); -471 -472 var timeout = 20000; -473 var interval = 500; -474 if (typeof(options) == 'object' && options.interval) -475 interval = options.interval; -476 -477 if (typeof(successCallback) != 'function') -478 successCallback = function() {}; -479 if (typeof(errorCallback) != 'function') -480 errorCallback = function() {}; -481 -482 var dis = this; -483 var delay = 0; -484 var timer = setInterval(function() { -485 delay += interval; -486 -487 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { -488 successCallback(dis.lastPosition); -489 clearInterval(timer); -490 } else if (delay >= timeout) { -491 errorCallback(); -492 clearInterval(timer); -493 } -494 }, interval); -495 }; -496 -497 /** -498 * Asynchronously aquires the position repeatedly at a given interval. -499 * @param {Function} successCallback The function to call each time the position -500 * data is available -501 * @param {Function} errorCallback The function to call when there is an error -502 * getting the position data. -503 * @param {PositionOptions} options The options for getting the position data -504 * such as timeout and the frequency of the watch. -505 */ -506 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { -507 // Invoke the appropriate callback with a new Position object every time the implementation -508 // determines that the position of the hosting device has changed. -509 -510 this.getCurrentPosition(successCallback, errorCallback, options); -511 var frequency = 10000; -512 if (typeof(options) == 'object' && options.frequency) -513 frequency = options.frequency; -514 -515 var that = this; -516 return setInterval(function() { -517 that.getCurrentPosition(successCallback, errorCallback, options); -518 }, frequency); -519 }; -520 -521 -522 /** -523 * Clears the specified position watch. -524 * @param {String} watchId The ID of the watch returned from #watchPosition. -525 */ -526 Geolocation.prototype.clearWatch = function(watchId) { -527 clearInterval(watchId); +402 * This class provides access to the debugging console. +403 * @constructor +404 */ +405 function DebugConsole() { +406 } +407 +408 /** +409 * Utility function for rendering and indenting strings, or serializing +410 * objects to a string capable of being printed to the console. +411 * @param {Object|String} message The string or object to convert to an indented string +412 * @private +413 */ +414 DebugConsole.prototype.processMessage = function(message) { +415 if (typeof(message) != 'object') { +416 return encodeURIComponent(message); +417 } else { +418 /** +419 * @function +420 * @ignore +421 */ +422 function indent(str) { +423 return str.replace(/^/mg, " "); +424 } +425 /** +426 * @function +427 * @ignore +428 */ +429 function makeStructured(obj) { +430 var str = ""; +431 for (var i in obj) { +432 try { +433 if (typeof(obj[i]) == 'object') { +434 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; +435 } else { +436 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; +437 } +438 } catch(e) { +439 str += i + " = EXCEPTION: " + e.message + "\n"; +440 } +441 } +442 return str; +443 } +444 return encodeURIComponent("Object:\n" + makeStructured(message)); +445 } +446 }; +447 +448 /** +449 * Print a normal log message to the console +450 * @param {Object|String} message Message or object to print to the console +451 */ +452 DebugConsole.prototype.log = function(message) { +453 }; +454 +455 /** +456 * Print a warning message to the console +457 * @param {Object|String} message Message or object to print to the console +458 */ +459 DebugConsole.prototype.warn = function(message) { +460 }; +461 +462 /** +463 * Print an error message to the console +464 * @param {Object|String} message Message or object to print to the console +465 */ +466 DebugConsole.prototype.error = function(message) { +467 }; +468 +469 PhoneGap.addConstructor(function() { +470 window.debug = new DebugConsole(); +471 }); +472 +473 +474 +475 /** +476 * This class provides generic read and write access to the mobile device file system. +477 */ +478 function File() { +479 /** +480 * The data of a file. +481 */ +482 this.data = ""; +483 /** +484 * The name of the file. +485 */ +486 this.name = ""; +487 } +488 +489 /** +490 * Reads a file from the mobile device. This function is asyncronous. +491 * @param {String} fileName The name (including the path) to the file on the mobile device. +492 * The file name will likely be device dependant. +493 * @param {Function} successCallback The function to call when the file is successfully read. +494 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. +495 */ +496 File.prototype.read = function(fileName, successCallback, errorCallback) { +497 +498 } +499 +500 /** +501 * Writes a file to the mobile device. +502 * @param {File} file The file to write to the device. +503 */ +504 File.prototype.write = function(file) { +505 +506 } +507 +508 PhoneGap.addConstructor(function() { +509 if (typeof navigator.file == "undefined") navigator.file = new File(); +510 }); +511 +512 +513 +514 /** +515 * This class provides access to device GPS data. +516 * @constructor +517 */ +518 function Geolocation() { +519 /** +520 * The last known GPS position. +521 */ +522 this.lastPosition = null; +523 this.lastError = null; +524 this.callbacks = { +525 onLocationChanged: [], +526 onError: [] +527 }; 528 }; 529 530 /** -531 * Called by the geolocation framework when the current location is found. -532 * @param {PositionOptions} position The current position. -533 */ -534 Geolocation.prototype.setLocation = function(position) { -535 this.lastPosition = position; -536 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { -537 var f = this.callbacks.onLocationChanged.shift(); -538 f(position); -539 } -540 }; -541 -542 /** -543 * Called by the geolocation framework when an error occurs while looking up the current position. -544 * @param {String} message The text of the error message. -545 */ -546 Geolocation.prototype.setError = function(message) { -547 this.lastError = message; -548 for (var i = 0; i < this.callbacks.onError.length; i++) { -549 var f = this.callbacks.onError.shift(); -550 f(message); -551 } -552 }; -553 -554 PhoneGap.addConstructor(function() { -555 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); -556 }); -557 -558 -559 -560 /** -561 * This class provides access to native mapping applications on the device. -562 */ -563 function Map() { -564 -565 } -566 -567 /** -568 * Shows a native map on the device with pins at the given positions. -569 * @param {Array} positions -570 */ -571 Map.prototype.show = function(positions) { -572 -573 } -574 -575 PhoneGap.addConstructor(function() { -576 if (typeof navigator.map == "undefined") navigator.map = new Map(); -577 }); -578 -579 -580 -581 /** -582 * This class provides access to notifications on the device. -583 */ -584 function Notification() { -585 -586 } -587 -588 /** -589 * Open a native alert dialog, with a customizable title and button text. -590 * @param {String} message Message to print in the body of the alert -591 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) -592 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) -593 */ -594 Notification.prototype.alert = function(message, title, buttonLabel) { -595 // Default is to use a browser alert; this will use "index.html" as the title though -596 alert(message); -597 }; -598 -599 /** -600 * Start spinning the activity indicator on the statusbar -601 */ -602 Notification.prototype.activityStart = function() { -603 }; -604 -605 /** -606 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +531 * Asynchronously aquires the current position. +532 * @param {Function} successCallback The function to call when the position +533 * data is available +534 * @param {Function} errorCallback The function to call when there is an error +535 * getting the position data. +536 * @param {PositionOptions} options The options for getting the position data +537 * such as timeout. +538 */ +539 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { +540 var referenceTime = 0; +541 if (this.lastPosition) +542 referenceTime = this.lastPosition.timeout; +543 else +544 this.start(options); +545 +546 var timeout = 20000; +547 var interval = 500; +548 if (typeof(options) == 'object' && options.interval) +549 interval = options.interval; +550 +551 if (typeof(successCallback) != 'function') +552 successCallback = function() {}; +553 if (typeof(errorCallback) != 'function') +554 errorCallback = function() {}; +555 +556 var dis = this; +557 var delay = 0; +558 var timer = setInterval(function() { +559 delay += interval; +560 +561 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { +562 successCallback(dis.lastPosition); +563 clearInterval(timer); +564 } else if (delay >= timeout) { +565 errorCallback(); +566 clearInterval(timer); +567 } +568 }, interval); +569 }; +570 +571 /** +572 * Asynchronously aquires the position repeatedly at a given interval. +573 * @param {Function} successCallback The function to call each time the position +574 * data is available +575 * @param {Function} errorCallback The function to call when there is an error +576 * getting the position data. +577 * @param {PositionOptions} options The options for getting the position data +578 * such as timeout and the frequency of the watch. +579 */ +580 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { +581 // Invoke the appropriate callback with a new Position object every time the implementation +582 // determines that the position of the hosting device has changed. +583 +584 this.getCurrentPosition(successCallback, errorCallback, options); +585 var frequency = 10000; +586 if (typeof(options) == 'object' && options.frequency) +587 frequency = options.frequency; +588 +589 var that = this; +590 return setInterval(function() { +591 that.getCurrentPosition(successCallback, errorCallback, options); +592 }, frequency); +593 }; +594 +595 +596 /** +597 * Clears the specified position watch. +598 * @param {String} watchId The ID of the watch returned from #watchPosition. +599 */ +600 Geolocation.prototype.clearWatch = function(watchId) { +601 clearInterval(watchId); +602 }; +603 +604 /** +605 * Called by the geolocation framework when the current location is found. +606 * @param {PositionOptions} position The current position. 607 */ -608 Notification.prototype.activityStop = function() { -609 }; -610 -611 /** -612 * Causes the device to blink a status LED. -613 * @param {Integer} count The number of blinks. -614 * @param {String} colour The colour of the light. -615 */ -616 Notification.prototype.blink = function(count, colour) { -617 -618 }; -619 -620 /** -621 * Causes the device to vibrate. -622 * @param {Integer} mills The number of milliseconds to vibrate for. -623 */ -624 Notification.prototype.vibrate = function(mills) { -625 -626 }; +608 Geolocation.prototype.setLocation = function(position) { +609 this.lastPosition = position; +610 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { +611 var f = this.callbacks.onLocationChanged.shift(); +612 f(position); +613 } +614 }; +615 +616 /** +617 * Called by the geolocation framework when an error occurs while looking up the current position. +618 * @param {String} message The text of the error message. +619 */ +620 Geolocation.prototype.setError = function(message) { +621 this.lastError = message; +622 for (var i = 0; i < this.callbacks.onError.length; i++) { +623 var f = this.callbacks.onError.shift(); +624 f(message); +625 } +626 }; 627 -628 /** -629 * Causes the device to beep. -630 * @param {Integer} count The number of beeps. -631 * @param {Integer} volume The volume of the beep. -632 */ -633 Notification.prototype.beep = function(count, volume) { -634 -635 }; -636 -637 // TODO: of course on Blackberry and Android there notifications in the UI as well -638 -639 PhoneGap.addConstructor(function() { -640 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); -641 }); -642 -643 -644 -645 /** -646 * This class provides access to the device orientation. -647 * @constructor -648 */ -649 function Orientation() { -650 /** -651 * The last known orientation. -652 */ -653 this.lastOrientation = null; -654 } -655 -656 /** -657 * Asynchronously aquires the current orientation. -658 * @param {Function} successCallback The function to call when the orientation -659 * is known. -660 * @param {Function} errorCallback The function to call when there is an error -661 * getting the orientation. -662 */ -663 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { -664 // If the position is available then call success -665 // If the position is not available then call error -666 } -667 -668 /** -669 * Asynchronously aquires the orientation repeatedly at a given interval. -670 * @param {Function} successCallback The function to call each time the orientation -671 * data is available. -672 * @param {Function} errorCallback The function to call when there is an error -673 * getting the orientation data. -674 */ -675 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { -676 // Invoke the appropriate callback with a new Position object every time the implementation -677 // determines that the position of the hosting device has changed. -678 this.getCurrentPosition(successCallback, errorCallback); -679 return setInterval(function() { -680 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); -681 }, 10000); -682 } -683 -684 /** -685 * Clears the specified orientation watch. -686 * @param {String} watchId The ID of the watch returned from #watchOrientation. -687 */ -688 Orientation.prototype.clearWatch = function(watchId) { -689 clearInterval(watchId); -690 } -691 -692 PhoneGap.addConstructor(function() { -693 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); -694 }); -695 -696 -697 -698 /** -699 * This class contains position information. -700 * @param {Object} lat -701 * @param {Object} lng -702 * @param {Object} acc -703 * @param {Object} alt -704 * @param {Object} altacc -705 * @param {Object} head -706 * @param {Object} vel -707 * @constructor -708 */ -709 function Position(lat, lng, acc, alt, altacc, head, vel) { -710 /** -711 * The latitude of the position. -712 */ -713 this.latitude = lat; -714 /** -715 * The longitude of the position, -716 */ -717 this.longitude = lng; -718 /** -719 * The accuracy of the position. -720 */ -721 this.accuracy = acc; -722 /** -723 * The altitude of the position. -724 */ -725 this.altitude = alt; -726 /** -727 * The altitude accuracy of the position. -728 */ -729 this.altitudeAccuracy = altacc; -730 /** -731 * The direction the device is moving at the position. -732 */ -733 this.heading = head; -734 /** -735 * The velocity with which the device is moving at the position. -736 */ -737 this.velocity = vel; -738 /** -739 * The time that the position was obtained. -740 */ -741 this.timestamp = new Date().getTime(); -742 } -743 -744 /** -745 * This class specifies the options for requesting position data. -746 * @constructor -747 */ -748 function PositionOptions() { -749 /** -750 * Specifies the desired position accuracy. -751 */ -752 this.enableHighAccuracy = true; -753 /** -754 * The timeout after which if position data cannot be obtained the errorCallback -755 * is called. -756 */ -757 this.timeout = 10000; -758 } -759 -760 /** -761 * This class contains information about any GSP errors. -762 * @constructor -763 */ -764 function PositionError() { -765 this.code = null; -766 this.message = ""; -767 } -768 -769 PositionError.UNKNOWN_ERROR = 0; -770 PositionError.PERMISSION_DENIED = 1; -771 PositionError.POSITION_UNAVAILABLE = 2; -772 PositionError.TIMEOUT = 3; -773 -774 -775 -776 /** -777 * This class provides access to the device SMS functionality. -778 * @constructor -779 */ -780 function Sms() { -781 -782 } -783 -784 /** -785 * Sends an SMS message. -786 * @param {Integer} number The phone number to send the message to. -787 * @param {String} message The contents of the SMS message to send. -788 * @param {Function} successCallback The function to call when the SMS message is sent. -789 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. -790 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. -791 */ -792 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { -793 -794 } -795 -796 PhoneGap.addConstructor(function() { -797 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); -798 }); -799 -800 -801 -802 /** -803 * This class provides access to the telephony features of the device. -804 * @constructor -805 */ -806 function Telephony() { -807 -808 } -809 -810 /** -811 * Calls the specifed number. -812 * @param {Integer} number The number to be called. -813 */ -814 Telephony.prototype.call = function(number) { -815 -816 } +628 PhoneGap.addConstructor(function() { +629 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); +630 }); +631 +632 +633 +634 /** +635 * This class provides access to native mapping applications on the device. +636 */ +637 function Map() { +638 +639 } +640 +641 /** +642 * Shows a native map on the device with pins at the given positions. +643 * @param {Array} positions +644 */ +645 Map.prototype.show = function(positions) { +646 +647 } +648 +649 PhoneGap.addConstructor(function() { +650 if (typeof navigator.map == "undefined") navigator.map = new Map(); +651 }); +652 +653 +654 +655 /** +656 * This class provides access to notifications on the device. +657 */ +658 function Notification() { +659 +660 } +661 +662 /** +663 * Open a native alert dialog, with a customizable title and button text. +664 * @param {String} message Message to print in the body of the alert +665 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) +666 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) +667 */ +668 Notification.prototype.alert = function(message, title, buttonLabel) { +669 // Default is to use a browser alert; this will use "index.html" as the title though +670 alert(message); +671 }; +672 +673 /** +674 * Start spinning the activity indicator on the statusbar +675 */ +676 Notification.prototype.activityStart = function() { +677 }; +678 +679 /** +680 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +681 */ +682 Notification.prototype.activityStop = function() { +683 }; +684 +685 /** +686 * Causes the device to blink a status LED. +687 * @param {Integer} count The number of blinks. +688 * @param {String} colour The colour of the light. +689 */ +690 Notification.prototype.blink = function(count, colour) { +691 +692 }; +693 +694 /** +695 * Causes the device to vibrate. +696 * @param {Integer} mills The number of milliseconds to vibrate for. +697 */ +698 Notification.prototype.vibrate = function(mills) { +699 +700 }; +701 +702 /** +703 * Causes the device to beep. +704 * @param {Integer} count The number of beeps. +705 * @param {Integer} volume The volume of the beep. +706 */ +707 Notification.prototype.beep = function(count, volume) { +708 +709 }; +710 +711 // TODO: of course on Blackberry and Android there notifications in the UI as well +712 +713 PhoneGap.addConstructor(function() { +714 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +715 }); +716 +717 +718 +719 /** +720 * This class provides access to the device orientation. +721 * @constructor +722 */ +723 function Orientation() { +724 /** +725 * The last known orientation. +726 */ +727 this.lastOrientation = null; +728 } +729 +730 /** +731 * Asynchronously aquires the current orientation. +732 * @param {Function} successCallback The function to call when the orientation +733 * is known. +734 * @param {Function} errorCallback The function to call when there is an error +735 * getting the orientation. +736 */ +737 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { +738 // If the position is available then call success +739 // If the position is not available then call error +740 } +741 +742 /** +743 * Asynchronously aquires the orientation repeatedly at a given interval. +744 * @param {Function} successCallback The function to call each time the orientation +745 * data is available. +746 * @param {Function} errorCallback The function to call when there is an error +747 * getting the orientation data. +748 */ +749 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { +750 // Invoke the appropriate callback with a new Position object every time the implementation +751 // determines that the position of the hosting device has changed. +752 this.getCurrentPosition(successCallback, errorCallback); +753 return setInterval(function() { +754 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); +755 }, 10000); +756 } +757 +758 /** +759 * Clears the specified orientation watch. +760 * @param {String} watchId The ID of the watch returned from #watchOrientation. +761 */ +762 Orientation.prototype.clearWatch = function(watchId) { +763 clearInterval(watchId); +764 } +765 +766 PhoneGap.addConstructor(function() { +767 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); +768 }); +769 +770 +771 +772 /** +773 * This class contains position information. +774 * @param {Object} lat +775 * @param {Object} lng +776 * @param {Object} acc +777 * @param {Object} alt +778 * @param {Object} altacc +779 * @param {Object} head +780 * @param {Object} vel +781 * @constructor +782 */ +783 function Position(lat, lng, acc, alt, altacc, head, vel) { +784 /** +785 * The latitude of the position. +786 */ +787 this.latitude = lat; +788 /** +789 * The longitude of the position, +790 */ +791 this.longitude = lng; +792 /** +793 * The accuracy of the position. +794 */ +795 this.accuracy = acc; +796 /** +797 * The altitude of the position. +798 */ +799 this.altitude = alt; +800 /** +801 * The altitude accuracy of the position. +802 */ +803 this.altitudeAccuracy = altacc; +804 /** +805 * The direction the device is moving at the position. +806 */ +807 this.heading = head; +808 /** +809 * The velocity with which the device is moving at the position. +810 */ +811 this.velocity = vel; +812 /** +813 * The time that the position was obtained. +814 */ +815 this.timestamp = new Date().getTime(); +816 } 817 -818 PhoneGap.addConstructor(function() { -819 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); -820 }); -821 -822 -823 \ No newline at end of file +818 /** +819 * This class specifies the options for requesting position data. +820 * @constructor +821 */ +822 function PositionOptions() { +823 /** +824 * Specifies the desired position accuracy. +825 */ +826 this.enableHighAccuracy = true; +827 /** +828 * The timeout after which if position data cannot be obtained the errorCallback +829 * is called. +830 */ +831 this.timeout = 10000; +832 } +833 +834 /** +835 * This class contains information about any GSP errors. +836 * @constructor +837 */ +838 function PositionError() { +839 this.code = null; +840 this.message = ""; +841 } +842 +843 PositionError.UNKNOWN_ERROR = 0; +844 PositionError.PERMISSION_DENIED = 1; +845 PositionError.POSITION_UNAVAILABLE = 2; +846 PositionError.TIMEOUT = 3; +847 +848 +849 +850 /** +851 * This class provides access to the device SMS functionality. +852 * @constructor +853 */ +854 function Sms() { +855 +856 } +857 +858 /** +859 * Sends an SMS message. +860 * @param {Integer} number The phone number to send the message to. +861 * @param {String} message The contents of the SMS message to send. +862 * @param {Function} successCallback The function to call when the SMS message is sent. +863 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. +864 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. +865 */ +866 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { +867 +868 } +869 +870 PhoneGap.addConstructor(function() { +871 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); +872 }); +873 +874 +875 +876 /** +877 * This class provides access to the telephony features of the device. +878 * @constructor +879 */ +880 function Telephony() { +881 +882 } +883 +884 /** +885 * Calls the specifed number. +886 * @param {Integer} number The number to be called. +887 */ +888 Telephony.prototype.call = function(number) { +889 +890 } +891 +892 PhoneGap.addConstructor(function() { +893 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); +894 }); +895 +896 +897 \ No newline at end of file From a1bffb976f6de277d69ed2dcc86ff61a963d79fd Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Sun, 19 Apr 2009 17:52:10 -0700 Subject: [PATCH 04/10] Moved docs into javascripts directory and updated README file --- README.md | 19 ++++++++++++++++++- Rakefile | 2 +- .../out/jsdoc => javascripts/docs}/files.html | 2 +- .../out/jsdoc => javascripts/docs}/index.html | 2 +- .../docs}/symbols/Acceleration.html | 2 +- .../docs}/symbols/AccelerationOptions.html | 2 +- .../docs}/symbols/Accelerometer.html | 2 +- .../docs}/symbols/Camera.html | 2 +- .../docs}/symbols/Contact.html | 2 +- .../docs}/symbols/DebugConsole.html | 2 +- .../docs}/symbols/Device.html | 2 +- .../docs}/symbols/Geolocation.html | 2 +- .../docs}/symbols/Media.html | 2 +- .../docs}/symbols/MediaError.html | 2 +- .../docs}/symbols/Orientation.html | 2 +- .../docs}/symbols/PhoneGap.html | 2 +- .../docs}/symbols/Position.html | 2 +- .../docs}/symbols/PositionError.html | 2 +- .../docs}/symbols/PositionOptions.html | 2 +- .../docs}/symbols/Sms.html | 2 +- .../docs}/symbols/Telephony.html | 2 +- .../docs}/symbols/UIControls.html | 2 +- .../docs}/symbols/_global_.html | 2 +- .../docs}/symbols/src/tmp_phonegap.js.html | 0 24 files changed, 40 insertions(+), 23 deletions(-) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/files.html (97%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/index.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Acceleration.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/AccelerationOptions.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Accelerometer.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Camera.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Contact.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/DebugConsole.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Device.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Geolocation.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Media.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/MediaError.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Orientation.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/PhoneGap.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Position.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/PositionError.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/PositionOptions.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Sms.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/Telephony.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/UIControls.html (98%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/_global_.html (99%) rename {util/jsdoc-toolkit/out/jsdoc => javascripts/docs}/symbols/src/tmp_phonegap.js.html (100%) diff --git a/README.md b/README.md index 06767cb3..b890df53 100644 --- a/README.md +++ b/README.md @@ -34,22 +34,39 @@ API ### Device +Exposes properties of the phone, such as its device ID, model, and OS version number. + ### Location + +Gain access to the Latitude / Longitude of the device, and depending on the type of device, the course, speed, and altitude. ### Accelerometer + +Monitor the accelerometer on the device to detect orientation, shaking and other similar actions. ### Contacts +Query the phone addressbook to read the users contacts. + ### Orientation +Read the device layout orientation, e.g. landscape vs portrait. + ### Camera +Brings up the camera or photo browser on the phone to allow the user to upload a photo. + ### Vibrate +Triggers the vibration alert on the phone, if it is supported. + ### Sound +Play sound files (WAV, MP3, etc). + ### Telephony +Trigger and activate phone calls. XUI ------------------------------------------------------------- @@ -91,4 +108,4 @@ THE SOFTWARE. ------------------------------------------------------------- -*phonegap is a [nitobi](http://nitobi.com) sponsored project* \ No newline at end of file +*phonegap is a [nitobi](http://nitobi.com) sponsored project* diff --git a/Rakefile b/Rakefile index b167fa59..de9c67b2 100644 --- a/Rakefile +++ b/Rakefile @@ -22,7 +22,7 @@ def doc end FileUtils.mkdir_p "#{ LIBPATH }tmp" open(final,'w'){|f| f.puts( js )} - sh "java -jar util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }jsrun.jar util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }app#{ File::SEPARATOR }run.js -a -t=util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }templates#{ File::SEPARATOR }jsdoc tmp#{ File::SEPARATOR }phonegap.js" + sh "java -jar util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }jsrun.jar util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }app#{ File::SEPARATOR }run.js -a -d=javascripts/docs -t=util#{ File::SEPARATOR }jsdoc-toolkit#{ File::SEPARATOR }templates#{ File::SEPARATOR }jsdoc tmp#{ File::SEPARATOR }phonegap.js" end def build diff --git a/util/jsdoc-toolkit/out/jsdoc/files.html b/javascripts/docs/files.html similarity index 97% rename from util/jsdoc-toolkit/out/jsdoc/files.html rename to javascripts/docs/files.html index dec129a7..1dbeba60 100644 --- a/util/jsdoc-toolkit/out/jsdoc/files.html +++ b/javascripts/docs/files.html @@ -246,7 +246,7 @@

tmp/phonegap.js

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:53 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/javascripts/docs/index.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/index.html rename to javascripts/docs/index.html index 8e508015..3e9a6107 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/javascripts/docs/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:53 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/javascripts/docs/symbols/Acceleration.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html rename to javascripts/docs/symbols/Acceleration.html index cf04a953..8a303ea5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/javascripts/docs/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/javascripts/docs/symbols/AccelerationOptions.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html rename to javascripts/docs/symbols/AccelerationOptions.html index 1affeb7c..7f9243ff 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/javascripts/docs/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/javascripts/docs/symbols/Accelerometer.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html rename to javascripts/docs/symbols/Accelerometer.html index fd515f6d..baa2fb70 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/javascripts/docs/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/javascripts/docs/symbols/Camera.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html rename to javascripts/docs/symbols/Camera.html index 87358c74..6b0fb268 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/javascripts/docs/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/javascripts/docs/symbols/Contact.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html rename to javascripts/docs/symbols/Contact.html index 81c608de..2a108939 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/javascripts/docs/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/javascripts/docs/symbols/DebugConsole.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html rename to javascripts/docs/symbols/DebugConsole.html index c0647338..a3833ad0 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/javascripts/docs/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/javascripts/docs/symbols/Device.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Device.html rename to javascripts/docs/symbols/Device.html index 20fc8532..dee499dd 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/javascripts/docs/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/javascripts/docs/symbols/Geolocation.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html rename to javascripts/docs/symbols/Geolocation.html index 9e9b8e76..a2a534c4 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/javascripts/docs/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/javascripts/docs/symbols/Media.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Media.html rename to javascripts/docs/symbols/Media.html index 254b883c..7f8d1858 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/javascripts/docs/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/javascripts/docs/symbols/MediaError.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html rename to javascripts/docs/symbols/MediaError.html index a2939bc8..2fdc5990 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/javascripts/docs/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/javascripts/docs/symbols/Orientation.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html rename to javascripts/docs/symbols/Orientation.html index d4778b3b..14086d11 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/javascripts/docs/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/javascripts/docs/symbols/PhoneGap.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html rename to javascripts/docs/symbols/PhoneGap.html index 8b2f1ded..e316c06a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/javascripts/docs/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/javascripts/docs/symbols/Position.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Position.html rename to javascripts/docs/symbols/Position.html index 4919c7c8..f5a64bd9 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/javascripts/docs/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/javascripts/docs/symbols/PositionError.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html rename to javascripts/docs/symbols/PositionError.html index 9c1aceb6..23574189 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/javascripts/docs/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/javascripts/docs/symbols/PositionOptions.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html rename to javascripts/docs/symbols/PositionOptions.html index 1c028e98..327795f4 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/javascripts/docs/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/javascripts/docs/symbols/Sms.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html rename to javascripts/docs/symbols/Sms.html index a6ea2678..a00dde36 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/javascripts/docs/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:53 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/javascripts/docs/symbols/Telephony.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html rename to javascripts/docs/symbols/Telephony.html index 7db2cadb..a4ffa1fb 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/javascripts/docs/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:53 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/javascripts/docs/symbols/UIControls.html similarity index 98% rename from util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html rename to javascripts/docs/symbols/UIControls.html index ef1ed758..89222340 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/javascripts/docs/symbols/UIControls.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:10 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:53 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/javascripts/docs/symbols/_global_.html similarity index 99% rename from util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html rename to javascripts/docs/symbols/_global_.html index 4a32db6f..3a4ca917 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/javascripts/docs/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Thu Apr 16 2009 18:42:09 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:47:52 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/javascripts/docs/symbols/src/tmp_phonegap.js.html similarity index 100% rename from util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html rename to javascripts/docs/symbols/src/tmp_phonegap.js.html From 602c213a764887d7d83354120ed77a5df769f797 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Sun, 19 Apr 2009 18:19:45 -0700 Subject: [PATCH 05/10] Improved the demo to show the tabbar at start, and increment badge counters --- iphone/Classes/UIControls.m | 3 +- iphone/www/index.html | 100 +- iphone/www/master.css | 12 +- iphone/www/phonegap.js | 2 +- javascripts/iphone/notification.js | 8 +- javascripts/uicontrols.js | 5 + lib/android/phonegap-min.js | 2 +- lib/android/phonegap.js | 5 + lib/blackberry/phonegap-min.js | 2 +- lib/blackberry/phonegap.js | 5 + lib/iphone/phonegap-min.js | 2 +- lib/iphone/phonegap.js | 13 +- util/jsdoc-toolkit/out/jsdoc/files.html | 2 +- util/jsdoc-toolkit/out/jsdoc/index.html | 2 +- .../out/jsdoc/symbols/Acceleration.html | 2 +- .../jsdoc/symbols/AccelerationOptions.html | 2 +- .../out/jsdoc/symbols/Accelerometer.html | 2 +- .../out/jsdoc/symbols/Camera.html | 2 +- .../out/jsdoc/symbols/Contact.html | 2 +- .../out/jsdoc/symbols/DebugConsole.html | 2 +- .../out/jsdoc/symbols/Device.html | 2 +- .../out/jsdoc/symbols/Geolocation.html | 2 +- .../out/jsdoc/symbols/Media.html | 2 +- .../out/jsdoc/symbols/MediaError.html | 2 +- .../out/jsdoc/symbols/Orientation.html | 2 +- .../out/jsdoc/symbols/PhoneGap.html | 2 +- .../out/jsdoc/symbols/Position.html | 2 +- .../out/jsdoc/symbols/PositionError.html | 2 +- .../out/jsdoc/symbols/PositionOptions.html | 2 +- util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html | 2 +- .../out/jsdoc/symbols/Telephony.html | 2 +- .../out/jsdoc/symbols/UIControls.html | 36 +- .../out/jsdoc/symbols/_global_.html | 2 +- .../jsdoc/symbols/src/tmp_phonegap.js.html | 999 +++++++++--------- 34 files changed, 658 insertions(+), 576 deletions(-) diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 5538d573..3f4d6233 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -58,8 +58,7 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options atBottom = [[tabSettings objectForKey:@"position"] isEqualTo:@"bottom"]; } tabBar.hidden = NO; - - + CGRect webViewBounds = webView.bounds; CGRect tabBarBounds; if (atBottom) { diff --git a/iphone/www/index.html b/iphone/www/index.html index 846c424e..5bc25725 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -34,25 +34,6 @@ function beep(){ debug.log("beep"); navigator.notification.beep(2); - try { - uicontrols.createTabBar(); - uicontrols.createTabBarItem("toprated", "Top Rated", "tabButton:TopRated", { onSelect: function() { - debug.log("Top Rated selected"); - }}); - uicontrols.createTabBarItem("recents", "Recents", "tabButton:Recents", { onSelect: function() { - debug.log("Recents selected"); - }}); - uicontrols.createTabBarItem("history", "History", "tabButton:History", { onSelect: function() { - debug.log("History selected"); - }}); - uicontrols.createTabBarItem("more", "More", "tabButton:More", { onSelect: function() { - debug.log("More selected"); - }}); - uicontrols.showTabBar(); - uicontrols.showTabBarItems("toprated", "recents", "history", "more"); - } catch(e) { - debug.log(e); - } } function vibrate(){ @@ -89,36 +70,79 @@ return result; } + function setupToolbars() { + uicontrols.createTabBar(); + + var toprated = 0; + uicontrols.createTabBarItem("toprated", "Top Rated", "tabButton:TopRated", { + onSelect: function() { + navigator.notification.alert("Top Rated selected"); + uicontrols.updateTabBarItem("toprated", { badge: ++toprated }); + } + }); + + var recents = 0; + uicontrols.createTabBarItem("recents", "Recents", "tabButton:Recents", { + onSelect: function() { + navigator.notification.alert("Recents selected"); + uicontrols.updateTabBarItem("recents", { badge: ++recents }); + } + }); + + var history = 0; + uicontrols.createTabBarItem("history", "History", "tabButton:History", { + onSelect: function() { + navigator.notification.alert("History selected"); + uicontrols.updateTabBarItem("history", { badge: ++history }); + } + }); + + var more = 0; + uicontrols.createTabBarItem("more", "More", "tabButton:More", { + onSelect: function() { + navigator.notification.alert("More selected"); + uicontrols.updateTabBarItem("more", { badge: ++more }); + } + }); + uicontrols.showTabBar(); + uicontrols.showTabBarItems("toprated", "recents", "history", "more"); + } + function preventBehavior(e) { e.preventDefault(); }; PhoneGap.addConstructor(function(){ document.addEventListener("touchmove", preventBehavior, false); + setupToolbars(); deviceInfo(); }); -

Welcome to PhoneGap!

-

this file is located at iphone/www/index.html

-
-

Platform:  

-

Version:  

-

UUID:  

-
-
-
X:
 
-
Y:
 
-
Z:
 
-
- Watch Accelerometer - Get Location - Call 411 - Custom Alert - Beep - Vibrate - Get Fourth Contact +
+

Welcome to PhoneGap!

+

this file is located at iphone/www/index.html

+
+

Platform:  

+

Version:  

+

UUID:  

+
+
+
X:
 
+
Y:
 
+
Z:
 
+
+ Watch Accelerometer + Get Location + Call 411 + Custom Alert + Beep + Vibrate +
+ diff --git a/iphone/www/master.css b/iphone/www/master.css index 1d1bea20..c7ae5784 100755 --- a/iphone/www/master.css +++ b/iphone/www/master.css @@ -29,7 +29,7 @@ } /* Definition List */ - #stage.theme > dl{ + #Page1 > dl{ padding-top:10px; clear:both; margin:0; @@ -38,13 +38,13 @@ overflow:auto; } - #stage.theme > dl > dt{ + #Page1 > dl > dt{ font-weight:bold; float:left; margin-left:5px; } - #stage.theme > dl > dd{ + #Page1 > dl > dd{ width:45px; float:left; color:#a87; @@ -52,11 +52,11 @@ } /* Content Styling */ - #stage.theme > h1, #stage.theme > h2, #stage.theme > p{ + h1, h2, p{ margin:1em 0 .5em 13px; } - #stage.theme > h1{ + h1{ color:#eee; font-size:1.6em; text-align:center; @@ -65,7 +65,7 @@ padding:0; } - #stage.theme > h2{ + h2{ clear:both; margin:0; padding:3px; diff --git a/iphone/www/phonegap.js b/iphone/www/phonegap.js index fe90f530..f89fd4de 100644 --- a/iphone/www/phonegap.js +++ b/iphone/www/phonegap.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;btmp/phonegap.js

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/util/jsdoc-toolkit/out/jsdoc/index.html index 091ca9d5..9076ae62 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/util/jsdoc-toolkit/out/jsdoc/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html index 3528266e..ce4f74b2 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html index 386e0ced..e9e2f561 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html index e3f2f752..0282c8ea 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html index e43bf7d2..5e39ba28 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html index 8b53f12d..aabe08c9 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html index 0f0d2f6a..a725549f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html index 9fe8934f..d6903dfa 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html index 6e507c1a..16af68d3 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html index 3612d7e9..f9fe89c8 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html index 563bb46f..5e0b7c7c 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html index b10f4f76..214a6b20 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html index 9d3fd5c2..1eb488c4 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html index ba34e0ed..9fe53def 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html index c715631d..0dc2c69a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html index 4de3f6b6..68f9997e 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html index f61ec6bb..57bcbeaa 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html index 523a3559..3e611905 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html index 37cbd868..5a58a92a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html @@ -310,6 +310,15 @@

+ +   + + +
+ + +   @@ -499,6 +508,31 @@

+
+ + +
+ + + createToolBar() + +
+
+ + + +
+ + + + + + + + + + +
@@ -718,7 +752,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:28 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html index 69410cca..8585a3ae 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 17:23:27 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html index 4593247d..61adb216 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html @@ -399,506 +399,511 @@ 392 this.tabBarCallbacks[tag](); 393 }; 394 -395 PhoneGap.addConstructor(function() { -396 window.uicontrols = new UIControls(); -397 }); -398 -399 -400 -401 /** -402 * This class provides access to the debugging console. -403 * @constructor -404 */ -405 function DebugConsole() { -406 } -407 -408 /** -409 * Utility function for rendering and indenting strings, or serializing -410 * objects to a string capable of being printed to the console. -411 * @param {Object|String} message The string or object to convert to an indented string -412 * @private -413 */ -414 DebugConsole.prototype.processMessage = function(message) { -415 if (typeof(message) != 'object') { -416 return encodeURIComponent(message); -417 } else { -418 /** -419 * @function -420 * @ignore -421 */ -422 function indent(str) { -423 return str.replace(/^/mg, " "); -424 } -425 /** -426 * @function -427 * @ignore -428 */ -429 function makeStructured(obj) { -430 var str = ""; -431 for (var i in obj) { -432 try { -433 if (typeof(obj[i]) == 'object') { -434 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; -435 } else { -436 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; -437 } -438 } catch(e) { -439 str += i + " = EXCEPTION: " + e.message + "\n"; -440 } -441 } -442 return str; -443 } -444 return encodeURIComponent("Object:\n" + makeStructured(message)); -445 } -446 }; -447 -448 /** -449 * Print a normal log message to the console -450 * @param {Object|String} message Message or object to print to the console -451 */ -452 DebugConsole.prototype.log = function(message) { -453 }; -454 -455 /** -456 * Print a warning message to the console -457 * @param {Object|String} message Message or object to print to the console -458 */ -459 DebugConsole.prototype.warn = function(message) { -460 }; -461 -462 /** -463 * Print an error message to the console -464 * @param {Object|String} message Message or object to print to the console -465 */ -466 DebugConsole.prototype.error = function(message) { -467 }; -468 -469 PhoneGap.addConstructor(function() { -470 window.debug = new DebugConsole(); -471 }); -472 -473 -474 -475 /** -476 * This class provides generic read and write access to the mobile device file system. -477 */ -478 function File() { -479 /** -480 * The data of a file. -481 */ -482 this.data = ""; -483 /** -484 * The name of the file. -485 */ -486 this.name = ""; -487 } -488 -489 /** -490 * Reads a file from the mobile device. This function is asyncronous. -491 * @param {String} fileName The name (including the path) to the file on the mobile device. -492 * The file name will likely be device dependant. -493 * @param {Function} successCallback The function to call when the file is successfully read. -494 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. -495 */ -496 File.prototype.read = function(fileName, successCallback, errorCallback) { -497 -498 } -499 -500 /** -501 * Writes a file to the mobile device. -502 * @param {File} file The file to write to the device. -503 */ -504 File.prototype.write = function(file) { -505 -506 } -507 -508 PhoneGap.addConstructor(function() { -509 if (typeof navigator.file == "undefined") navigator.file = new File(); -510 }); -511 -512 -513 -514 /** -515 * This class provides access to device GPS data. -516 * @constructor -517 */ -518 function Geolocation() { -519 /** -520 * The last known GPS position. -521 */ -522 this.lastPosition = null; -523 this.lastError = null; -524 this.callbacks = { -525 onLocationChanged: [], -526 onError: [] -527 }; -528 }; -529 -530 /** -531 * Asynchronously aquires the current position. -532 * @param {Function} successCallback The function to call when the position -533 * data is available -534 * @param {Function} errorCallback The function to call when there is an error -535 * getting the position data. -536 * @param {PositionOptions} options The options for getting the position data -537 * such as timeout. -538 */ -539 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { -540 var referenceTime = 0; -541 if (this.lastPosition) -542 referenceTime = this.lastPosition.timeout; -543 else -544 this.start(options); -545 -546 var timeout = 20000; -547 var interval = 500; -548 if (typeof(options) == 'object' && options.interval) -549 interval = options.interval; +395 /** +396 */ +397 UIControls.prototype.createToolBar = function() { +398 }; +399 +400 PhoneGap.addConstructor(function() { +401 window.uicontrols = new UIControls(); +402 }); +403 +404 +405 +406 /** +407 * This class provides access to the debugging console. +408 * @constructor +409 */ +410 function DebugConsole() { +411 } +412 +413 /** +414 * Utility function for rendering and indenting strings, or serializing +415 * objects to a string capable of being printed to the console. +416 * @param {Object|String} message The string or object to convert to an indented string +417 * @private +418 */ +419 DebugConsole.prototype.processMessage = function(message) { +420 if (typeof(message) != 'object') { +421 return encodeURIComponent(message); +422 } else { +423 /** +424 * @function +425 * @ignore +426 */ +427 function indent(str) { +428 return str.replace(/^/mg, " "); +429 } +430 /** +431 * @function +432 * @ignore +433 */ +434 function makeStructured(obj) { +435 var str = ""; +436 for (var i in obj) { +437 try { +438 if (typeof(obj[i]) == 'object') { +439 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; +440 } else { +441 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; +442 } +443 } catch(e) { +444 str += i + " = EXCEPTION: " + e.message + "\n"; +445 } +446 } +447 return str; +448 } +449 return encodeURIComponent("Object:\n" + makeStructured(message)); +450 } +451 }; +452 +453 /** +454 * Print a normal log message to the console +455 * @param {Object|String} message Message or object to print to the console +456 */ +457 DebugConsole.prototype.log = function(message) { +458 }; +459 +460 /** +461 * Print a warning message to the console +462 * @param {Object|String} message Message or object to print to the console +463 */ +464 DebugConsole.prototype.warn = function(message) { +465 }; +466 +467 /** +468 * Print an error message to the console +469 * @param {Object|String} message Message or object to print to the console +470 */ +471 DebugConsole.prototype.error = function(message) { +472 }; +473 +474 PhoneGap.addConstructor(function() { +475 window.debug = new DebugConsole(); +476 }); +477 +478 +479 +480 /** +481 * This class provides generic read and write access to the mobile device file system. +482 */ +483 function File() { +484 /** +485 * The data of a file. +486 */ +487 this.data = ""; +488 /** +489 * The name of the file. +490 */ +491 this.name = ""; +492 } +493 +494 /** +495 * Reads a file from the mobile device. This function is asyncronous. +496 * @param {String} fileName The name (including the path) to the file on the mobile device. +497 * The file name will likely be device dependant. +498 * @param {Function} successCallback The function to call when the file is successfully read. +499 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. +500 */ +501 File.prototype.read = function(fileName, successCallback, errorCallback) { +502 +503 } +504 +505 /** +506 * Writes a file to the mobile device. +507 * @param {File} file The file to write to the device. +508 */ +509 File.prototype.write = function(file) { +510 +511 } +512 +513 PhoneGap.addConstructor(function() { +514 if (typeof navigator.file == "undefined") navigator.file = new File(); +515 }); +516 +517 +518 +519 /** +520 * This class provides access to device GPS data. +521 * @constructor +522 */ +523 function Geolocation() { +524 /** +525 * The last known GPS position. +526 */ +527 this.lastPosition = null; +528 this.lastError = null; +529 this.callbacks = { +530 onLocationChanged: [], +531 onError: [] +532 }; +533 }; +534 +535 /** +536 * Asynchronously aquires the current position. +537 * @param {Function} successCallback The function to call when the position +538 * data is available +539 * @param {Function} errorCallback The function to call when there is an error +540 * getting the position data. +541 * @param {PositionOptions} options The options for getting the position data +542 * such as timeout. +543 */ +544 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { +545 var referenceTime = 0; +546 if (this.lastPosition) +547 referenceTime = this.lastPosition.timeout; +548 else +549 this.start(options); 550 -551 if (typeof(successCallback) != 'function') -552 successCallback = function() {}; -553 if (typeof(errorCallback) != 'function') -554 errorCallback = function() {}; +551 var timeout = 20000; +552 var interval = 500; +553 if (typeof(options) == 'object' && options.interval) +554 interval = options.interval; 555 -556 var dis = this; -557 var delay = 0; -558 var timer = setInterval(function() { -559 delay += interval; +556 if (typeof(successCallback) != 'function') +557 successCallback = function() {}; +558 if (typeof(errorCallback) != 'function') +559 errorCallback = function() {}; 560 -561 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { -562 successCallback(dis.lastPosition); -563 clearInterval(timer); -564 } else if (delay >= timeout) { -565 errorCallback(); -566 clearInterval(timer); -567 } -568 }, interval); -569 }; -570 -571 /** -572 * Asynchronously aquires the position repeatedly at a given interval. -573 * @param {Function} successCallback The function to call each time the position -574 * data is available -575 * @param {Function} errorCallback The function to call when there is an error -576 * getting the position data. -577 * @param {PositionOptions} options The options for getting the position data -578 * such as timeout and the frequency of the watch. -579 */ -580 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { -581 // Invoke the appropriate callback with a new Position object every time the implementation -582 // determines that the position of the hosting device has changed. -583 -584 this.getCurrentPosition(successCallback, errorCallback, options); -585 var frequency = 10000; -586 if (typeof(options) == 'object' && options.frequency) -587 frequency = options.frequency; +561 var dis = this; +562 var delay = 0; +563 var timer = setInterval(function() { +564 delay += interval; +565 +566 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { +567 successCallback(dis.lastPosition); +568 clearInterval(timer); +569 } else if (delay >= timeout) { +570 errorCallback(); +571 clearInterval(timer); +572 } +573 }, interval); +574 }; +575 +576 /** +577 * Asynchronously aquires the position repeatedly at a given interval. +578 * @param {Function} successCallback The function to call each time the position +579 * data is available +580 * @param {Function} errorCallback The function to call when there is an error +581 * getting the position data. +582 * @param {PositionOptions} options The options for getting the position data +583 * such as timeout and the frequency of the watch. +584 */ +585 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { +586 // Invoke the appropriate callback with a new Position object every time the implementation +587 // determines that the position of the hosting device has changed. 588 -589 var that = this; -590 return setInterval(function() { -591 that.getCurrentPosition(successCallback, errorCallback, options); -592 }, frequency); -593 }; -594 -595 -596 /** -597 * Clears the specified position watch. -598 * @param {String} watchId The ID of the watch returned from #watchPosition. -599 */ -600 Geolocation.prototype.clearWatch = function(watchId) { -601 clearInterval(watchId); -602 }; -603 -604 /** -605 * Called by the geolocation framework when the current location is found. -606 * @param {PositionOptions} position The current position. -607 */ -608 Geolocation.prototype.setLocation = function(position) { -609 this.lastPosition = position; -610 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { -611 var f = this.callbacks.onLocationChanged.shift(); -612 f(position); -613 } -614 }; -615 -616 /** -617 * Called by the geolocation framework when an error occurs while looking up the current position. -618 * @param {String} message The text of the error message. -619 */ -620 Geolocation.prototype.setError = function(message) { -621 this.lastError = message; -622 for (var i = 0; i < this.callbacks.onError.length; i++) { -623 var f = this.callbacks.onError.shift(); -624 f(message); -625 } -626 }; -627 -628 PhoneGap.addConstructor(function() { -629 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); -630 }); -631 -632 -633 -634 /** -635 * This class provides access to native mapping applications on the device. -636 */ -637 function Map() { -638 -639 } -640 -641 /** -642 * Shows a native map on the device with pins at the given positions. -643 * @param {Array} positions -644 */ -645 Map.prototype.show = function(positions) { -646 -647 } -648 -649 PhoneGap.addConstructor(function() { -650 if (typeof navigator.map == "undefined") navigator.map = new Map(); -651 }); -652 -653 -654 -655 /** -656 * This class provides access to notifications on the device. -657 */ -658 function Notification() { -659 -660 } -661 -662 /** -663 * Open a native alert dialog, with a customizable title and button text. -664 * @param {String} message Message to print in the body of the alert -665 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) -666 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) -667 */ -668 Notification.prototype.alert = function(message, title, buttonLabel) { -669 // Default is to use a browser alert; this will use "index.html" as the title though -670 alert(message); -671 }; -672 -673 /** -674 * Start spinning the activity indicator on the statusbar -675 */ -676 Notification.prototype.activityStart = function() { -677 }; -678 -679 /** -680 * Stop spinning the activity indicator on the statusbar, if it's currently spinning -681 */ -682 Notification.prototype.activityStop = function() { -683 }; -684 -685 /** -686 * Causes the device to blink a status LED. -687 * @param {Integer} count The number of blinks. -688 * @param {String} colour The colour of the light. -689 */ -690 Notification.prototype.blink = function(count, colour) { -691 -692 }; -693 -694 /** -695 * Causes the device to vibrate. -696 * @param {Integer} mills The number of milliseconds to vibrate for. -697 */ -698 Notification.prototype.vibrate = function(mills) { -699 -700 }; -701 -702 /** -703 * Causes the device to beep. -704 * @param {Integer} count The number of beeps. -705 * @param {Integer} volume The volume of the beep. -706 */ -707 Notification.prototype.beep = function(count, volume) { -708 -709 }; -710 -711 // TODO: of course on Blackberry and Android there notifications in the UI as well -712 -713 PhoneGap.addConstructor(function() { -714 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); -715 }); -716 -717 -718 -719 /** -720 * This class provides access to the device orientation. -721 * @constructor -722 */ -723 function Orientation() { -724 /** -725 * The last known orientation. -726 */ -727 this.lastOrientation = null; -728 } -729 -730 /** -731 * Asynchronously aquires the current orientation. -732 * @param {Function} successCallback The function to call when the orientation -733 * is known. -734 * @param {Function} errorCallback The function to call when there is an error -735 * getting the orientation. -736 */ -737 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { -738 // If the position is available then call success -739 // If the position is not available then call error -740 } -741 -742 /** -743 * Asynchronously aquires the orientation repeatedly at a given interval. -744 * @param {Function} successCallback The function to call each time the orientation -745 * data is available. -746 * @param {Function} errorCallback The function to call when there is an error -747 * getting the orientation data. -748 */ -749 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { -750 // Invoke the appropriate callback with a new Position object every time the implementation -751 // determines that the position of the hosting device has changed. -752 this.getCurrentPosition(successCallback, errorCallback); -753 return setInterval(function() { -754 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); -755 }, 10000); -756 } -757 -758 /** -759 * Clears the specified orientation watch. -760 * @param {String} watchId The ID of the watch returned from #watchOrientation. -761 */ -762 Orientation.prototype.clearWatch = function(watchId) { -763 clearInterval(watchId); -764 } -765 -766 PhoneGap.addConstructor(function() { -767 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); -768 }); -769 -770 -771 -772 /** -773 * This class contains position information. -774 * @param {Object} lat -775 * @param {Object} lng -776 * @param {Object} acc -777 * @param {Object} alt -778 * @param {Object} altacc -779 * @param {Object} head -780 * @param {Object} vel -781 * @constructor -782 */ -783 function Position(lat, lng, acc, alt, altacc, head, vel) { -784 /** -785 * The latitude of the position. -786 */ -787 this.latitude = lat; -788 /** -789 * The longitude of the position, -790 */ -791 this.longitude = lng; -792 /** -793 * The accuracy of the position. -794 */ -795 this.accuracy = acc; -796 /** -797 * The altitude of the position. -798 */ -799 this.altitude = alt; -800 /** -801 * The altitude accuracy of the position. -802 */ -803 this.altitudeAccuracy = altacc; -804 /** -805 * The direction the device is moving at the position. -806 */ -807 this.heading = head; -808 /** -809 * The velocity with which the device is moving at the position. -810 */ -811 this.velocity = vel; -812 /** -813 * The time that the position was obtained. -814 */ -815 this.timestamp = new Date().getTime(); -816 } -817 -818 /** -819 * This class specifies the options for requesting position data. -820 * @constructor -821 */ -822 function PositionOptions() { -823 /** -824 * Specifies the desired position accuracy. -825 */ -826 this.enableHighAccuracy = true; -827 /** -828 * The timeout after which if position data cannot be obtained the errorCallback -829 * is called. +589 this.getCurrentPosition(successCallback, errorCallback, options); +590 var frequency = 10000; +591 if (typeof(options) == 'object' && options.frequency) +592 frequency = options.frequency; +593 +594 var that = this; +595 return setInterval(function() { +596 that.getCurrentPosition(successCallback, errorCallback, options); +597 }, frequency); +598 }; +599 +600 +601 /** +602 * Clears the specified position watch. +603 * @param {String} watchId The ID of the watch returned from #watchPosition. +604 */ +605 Geolocation.prototype.clearWatch = function(watchId) { +606 clearInterval(watchId); +607 }; +608 +609 /** +610 * Called by the geolocation framework when the current location is found. +611 * @param {PositionOptions} position The current position. +612 */ +613 Geolocation.prototype.setLocation = function(position) { +614 this.lastPosition = position; +615 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { +616 var f = this.callbacks.onLocationChanged.shift(); +617 f(position); +618 } +619 }; +620 +621 /** +622 * Called by the geolocation framework when an error occurs while looking up the current position. +623 * @param {String} message The text of the error message. +624 */ +625 Geolocation.prototype.setError = function(message) { +626 this.lastError = message; +627 for (var i = 0; i < this.callbacks.onError.length; i++) { +628 var f = this.callbacks.onError.shift(); +629 f(message); +630 } +631 }; +632 +633 PhoneGap.addConstructor(function() { +634 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); +635 }); +636 +637 +638 +639 /** +640 * This class provides access to native mapping applications on the device. +641 */ +642 function Map() { +643 +644 } +645 +646 /** +647 * Shows a native map on the device with pins at the given positions. +648 * @param {Array} positions +649 */ +650 Map.prototype.show = function(positions) { +651 +652 } +653 +654 PhoneGap.addConstructor(function() { +655 if (typeof navigator.map == "undefined") navigator.map = new Map(); +656 }); +657 +658 +659 +660 /** +661 * This class provides access to notifications on the device. +662 */ +663 function Notification() { +664 +665 } +666 +667 /** +668 * Open a native alert dialog, with a customizable title and button text. +669 * @param {String} message Message to print in the body of the alert +670 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) +671 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) +672 */ +673 Notification.prototype.alert = function(message, title, buttonLabel) { +674 // Default is to use a browser alert; this will use "index.html" as the title though +675 alert(message); +676 }; +677 +678 /** +679 * Start spinning the activity indicator on the statusbar +680 */ +681 Notification.prototype.activityStart = function() { +682 }; +683 +684 /** +685 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +686 */ +687 Notification.prototype.activityStop = function() { +688 }; +689 +690 /** +691 * Causes the device to blink a status LED. +692 * @param {Integer} count The number of blinks. +693 * @param {String} colour The colour of the light. +694 */ +695 Notification.prototype.blink = function(count, colour) { +696 +697 }; +698 +699 /** +700 * Causes the device to vibrate. +701 * @param {Integer} mills The number of milliseconds to vibrate for. +702 */ +703 Notification.prototype.vibrate = function(mills) { +704 +705 }; +706 +707 /** +708 * Causes the device to beep. +709 * @param {Integer} count The number of beeps. +710 * @param {Integer} volume The volume of the beep. +711 */ +712 Notification.prototype.beep = function(count, volume) { +713 +714 }; +715 +716 // TODO: of course on Blackberry and Android there notifications in the UI as well +717 +718 PhoneGap.addConstructor(function() { +719 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +720 }); +721 +722 +723 +724 /** +725 * This class provides access to the device orientation. +726 * @constructor +727 */ +728 function Orientation() { +729 /** +730 * The last known orientation. +731 */ +732 this.lastOrientation = null; +733 } +734 +735 /** +736 * Asynchronously aquires the current orientation. +737 * @param {Function} successCallback The function to call when the orientation +738 * is known. +739 * @param {Function} errorCallback The function to call when there is an error +740 * getting the orientation. +741 */ +742 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { +743 // If the position is available then call success +744 // If the position is not available then call error +745 } +746 +747 /** +748 * Asynchronously aquires the orientation repeatedly at a given interval. +749 * @param {Function} successCallback The function to call each time the orientation +750 * data is available. +751 * @param {Function} errorCallback The function to call when there is an error +752 * getting the orientation data. +753 */ +754 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { +755 // Invoke the appropriate callback with a new Position object every time the implementation +756 // determines that the position of the hosting device has changed. +757 this.getCurrentPosition(successCallback, errorCallback); +758 return setInterval(function() { +759 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); +760 }, 10000); +761 } +762 +763 /** +764 * Clears the specified orientation watch. +765 * @param {String} watchId The ID of the watch returned from #watchOrientation. +766 */ +767 Orientation.prototype.clearWatch = function(watchId) { +768 clearInterval(watchId); +769 } +770 +771 PhoneGap.addConstructor(function() { +772 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); +773 }); +774 +775 +776 +777 /** +778 * This class contains position information. +779 * @param {Object} lat +780 * @param {Object} lng +781 * @param {Object} acc +782 * @param {Object} alt +783 * @param {Object} altacc +784 * @param {Object} head +785 * @param {Object} vel +786 * @constructor +787 */ +788 function Position(lat, lng, acc, alt, altacc, head, vel) { +789 /** +790 * The latitude of the position. +791 */ +792 this.latitude = lat; +793 /** +794 * The longitude of the position, +795 */ +796 this.longitude = lng; +797 /** +798 * The accuracy of the position. +799 */ +800 this.accuracy = acc; +801 /** +802 * The altitude of the position. +803 */ +804 this.altitude = alt; +805 /** +806 * The altitude accuracy of the position. +807 */ +808 this.altitudeAccuracy = altacc; +809 /** +810 * The direction the device is moving at the position. +811 */ +812 this.heading = head; +813 /** +814 * The velocity with which the device is moving at the position. +815 */ +816 this.velocity = vel; +817 /** +818 * The time that the position was obtained. +819 */ +820 this.timestamp = new Date().getTime(); +821 } +822 +823 /** +824 * This class specifies the options for requesting position data. +825 * @constructor +826 */ +827 function PositionOptions() { +828 /** +829 * Specifies the desired position accuracy. 830 */ -831 this.timeout = 10000; -832 } -833 -834 /** -835 * This class contains information about any GSP errors. -836 * @constructor -837 */ -838 function PositionError() { -839 this.code = null; -840 this.message = ""; -841 } -842 -843 PositionError.UNKNOWN_ERROR = 0; -844 PositionError.PERMISSION_DENIED = 1; -845 PositionError.POSITION_UNAVAILABLE = 2; -846 PositionError.TIMEOUT = 3; +831 this.enableHighAccuracy = true; +832 /** +833 * The timeout after which if position data cannot be obtained the errorCallback +834 * is called. +835 */ +836 this.timeout = 10000; +837 } +838 +839 /** +840 * This class contains information about any GSP errors. +841 * @constructor +842 */ +843 function PositionError() { +844 this.code = null; +845 this.message = ""; +846 } 847 -848 -849 -850 /** -851 * This class provides access to the device SMS functionality. -852 * @constructor -853 */ -854 function Sms() { -855 -856 } -857 -858 /** -859 * Sends an SMS message. -860 * @param {Integer} number The phone number to send the message to. -861 * @param {String} message The contents of the SMS message to send. -862 * @param {Function} successCallback The function to call when the SMS message is sent. -863 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. -864 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. -865 */ -866 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { -867 -868 } -869 -870 PhoneGap.addConstructor(function() { -871 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); -872 }); -873 -874 -875 -876 /** -877 * This class provides access to the telephony features of the device. -878 * @constructor -879 */ -880 function Telephony() { -881 -882 } -883 -884 /** -885 * Calls the specifed number. -886 * @param {Integer} number The number to be called. -887 */ -888 Telephony.prototype.call = function(number) { -889 -890 } -891 -892 PhoneGap.addConstructor(function() { -893 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); -894 }); -895 -896 -897 \ No newline at end of file +848 PositionError.UNKNOWN_ERROR = 0; +849 PositionError.PERMISSION_DENIED = 1; +850 PositionError.POSITION_UNAVAILABLE = 2; +851 PositionError.TIMEOUT = 3; +852 +853 +854 +855 /** +856 * This class provides access to the device SMS functionality. +857 * @constructor +858 */ +859 function Sms() { +860 +861 } +862 +863 /** +864 * Sends an SMS message. +865 * @param {Integer} number The phone number to send the message to. +866 * @param {String} message The contents of the SMS message to send. +867 * @param {Function} successCallback The function to call when the SMS message is sent. +868 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. +869 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. +870 */ +871 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { +872 +873 } +874 +875 PhoneGap.addConstructor(function() { +876 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); +877 }); +878 +879 +880 +881 /** +882 * This class provides access to the telephony features of the device. +883 * @constructor +884 */ +885 function Telephony() { +886 +887 } +888 +889 /** +890 * Calls the specifed number. +891 * @param {Integer} number The number to be called. +892 */ +893 Telephony.prototype.call = function(number) { +894 +895 } +896 +897 PhoneGap.addConstructor(function() { +898 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); +899 }); +900 +901 +902 \ No newline at end of file From 2a981dc45274f04b8ee0e1dcf495d69b6859cd47 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Mon, 20 Apr 2009 08:26:30 -0700 Subject: [PATCH 06/10] Added the basics of toolbar support with a rudimentary title --- iphone/Classes/PhoneGapDelegate.m | 1 - iphone/Classes/UIControls.h | 19 +- iphone/Classes/UIControls.m | 109 ++ iphone/Settings.plist | 7 +- iphone/www/index.html | 3 +- iphone/www/phonegap.js | 2 +- javascripts/iphone/uicontrols.js | 8 + javascripts/uicontrols.js | 10 +- lib/android/phonegap-min.js | 2 +- lib/android/phonegap.js | 10 +- lib/blackberry/phonegap-min.js | 2 +- lib/blackberry/phonegap.js | 10 +- lib/iphone/phonegap-min.js | 2 +- lib/iphone/phonegap.js | 18 +- util/jsdoc-toolkit/out/jsdoc/files.html | 2 +- util/jsdoc-toolkit/out/jsdoc/index.html | 2 +- .../out/jsdoc/symbols/Acceleration.html | 2 +- .../jsdoc/symbols/AccelerationOptions.html | 2 +- .../out/jsdoc/symbols/Accelerometer.html | 2 +- .../out/jsdoc/symbols/Camera.html | 2 +- .../out/jsdoc/symbols/Contact.html | 2 +- .../out/jsdoc/symbols/DebugConsole.html | 2 +- .../out/jsdoc/symbols/Device.html | 2 +- .../out/jsdoc/symbols/Geolocation.html | 2 +- .../out/jsdoc/symbols/Media.html | 2 +- .../out/jsdoc/symbols/MediaError.html | 2 +- .../out/jsdoc/symbols/Orientation.html | 2 +- .../out/jsdoc/symbols/PhoneGap.html | 2 +- .../out/jsdoc/symbols/Position.html | 2 +- .../out/jsdoc/symbols/PositionError.html | 2 +- .../out/jsdoc/symbols/PositionOptions.html | 2 +- util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html | 2 +- .../out/jsdoc/symbols/Telephony.html | 2 +- .../out/jsdoc/symbols/UIControls.html | 51 +- .../out/jsdoc/symbols/_global_.html | 2 +- .../jsdoc/symbols/src/tmp_phonegap.js.html | 1002 +++++++++-------- 36 files changed, 756 insertions(+), 540 deletions(-) diff --git a/iphone/Classes/PhoneGapDelegate.m b/iphone/Classes/PhoneGapDelegate.m index 3c3f7d7c..7c2c07ea 100755 --- a/iphone/Classes/PhoneGapDelegate.m +++ b/iphone/Classes/PhoneGapDelegate.m @@ -33,7 +33,6 @@ -(id) getCommandInstance:(NSString*)className obj = [[NSClassFromString(className) alloc] initWithWebView:webView settings:classSettings]; else obj = [[NSClassFromString(className) alloc] initWithWebView:webView]; - NSLog(@"******* Object %@ created from scratch for %@", obj, className); [commandObjects setObject:obj forKey:className]; } diff --git a/iphone/Classes/UIControls.h b/iphone/Classes/UIControls.h index 8c99d966..614b2fa4 100644 --- a/iphone/Classes/UIControls.h +++ b/iphone/Classes/UIControls.h @@ -9,13 +9,17 @@ #import #import #import -#import +#import #import "PhoneGapCommand.h" @interface UIControls : PhoneGapCommand { UITabBar* tabBar; NSMutableDictionary* tabBarItems; + + UIToolbar* toolBar; + UIBarButtonItem* toolBarTitle; + NSMutableDictionary* toolBarItems; } /* Tab Bar methods @@ -24,10 +28,17 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options; - -/* Tab Bar Item methods - */ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; +/* Tool Bar methods + */ +- (void)createToolBar:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)createToolBarButton:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)createToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options; + + +//- (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options; +//- (void)setToolBarButtons:(NSArray*)arguments withDict:(NSDictionary*)options; + @end diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 3f4d6233..0c890d6b 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -16,6 +16,7 @@ -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView self = [super initWithWebView:theWebView]; if (self) { tabBarItems = [[NSMutableDictionary alloc] initWithCapacity:5]; + } return self; } @@ -49,6 +50,9 @@ - (void)createTabBar:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { + if (!tabBar) + [self createTabBar:nil options:nil]; + CGFloat height = 49.0f; BOOL atBottom = YES; @@ -101,6 +105,8 @@ - (void)showTabBar:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options { + if (!tabBar) + [self createTabBar:nil options:nil]; tabBar.hidden = YES; } @@ -133,6 +139,9 @@ - (void)hideTabBar:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { + if (!tabBar) + [self createTabBar:nil options:nil]; + NSString *name = [arguments objectAtIndex:0]; NSString *title = [arguments objectAtIndex:1]; NSString *imageName = [arguments objectAtIndex:2]; @@ -178,6 +187,9 @@ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options { + if (!tabBar) + [self createTabBar:nil options:nil]; + NSString *name = [arguments objectAtIndex:0]; UITabBarItem *item = [tabBarItems objectForKey:name]; if (item) @@ -195,6 +207,9 @@ - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options */ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options { + if (!tabBar) + [self createTabBar:nil options:nil]; + int i, count = [arguments count]; NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:count]; for (i = 0; i < count; i++) { @@ -290,6 +305,100 @@ - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item [webView stringByEvaluatingJavaScriptFromString:jsCallBack]; } +/*********************************************************************************/ +- (void)createToolBar:(NSArray*)arguments withDict:(NSDictionary*)options +{ + CGFloat height = 39.0f; + BOOL atTop = YES; + UIBarStyle style = UIBarStyleDefault; + + NSDictionary* toolBarSettings = [settings objectForKey:@"ToolBarSettings"]; + if (toolBarSettings) { + if ([toolBarSettings objectForKey:@"height"]) + height = [[toolBarSettings objectForKey:@"height"] floatValue]; + if ([toolBarSettings objectForKey:@"position"]) + atTop = [[toolBarSettings objectForKey:@"position"] isEqualTo:@"top"]; + + NSString *styleStr = [toolBarSettings objectForKey:@"style"]; + if ([styleStr isEqualTo:@"Default"]) + style = UIBarStyleDefault; + else if ([styleStr isEqualTo:@"BlackOpaque"]) + style = UIBarStyleBlackOpaque; + else if ([styleStr isEqualTo:@"BlackTranslucent"]) + style = UIBarStyleBlackTranslucent; + } + + CGRect webViewBounds = webView.bounds; + CGRect toolBarBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y, + webViewBounds.size.width, + height + ); + webViewBounds = CGRectMake( + webViewBounds.origin.x, + webViewBounds.origin.y + height, + webViewBounds.size.width, + webViewBounds.size.height - height + ); + toolBar = [[UIToolbar alloc] initWithFrame:toolBarBounds]; + [toolBar sizeToFit]; + toolBar.hidden = NO; + toolBar.multipleTouchEnabled = NO; + toolBar.autoresizesSubviews = YES; + toolBar.userInteractionEnabled = YES; + toolBar.barStyle = style; + + [toolBar setFrame:toolBarBounds]; + [webView setFrame:webViewBounds]; + + [self.webView.superview addSubview:toolBar]; +} + +/* +- (void)createToolBarButton:(NSArray*)arguments withDict:(NSDictionary*)options +{ +} + */ +/* +- (void)createToolBarItem:(NSArray*)arguments withDict:(NSDictionary*)options +{ + if (!toolBar) + [self createToolBar:nil options:nil]; + + NSString *name = [arguments objectAtIndex:0]; + NSString *title = [arguments objectAtIndex:1]; + NSString *style = [arguments objectAtIndex:2]; + UIBarButtonItemStyle styleRef = UIBarButtonItemStylePlain; + if ([style isEqualTo:@"plain"]) + styleRef = UIBarButtonItemStylePlain; + else if ([style isEqualTo:@"border"]) + styleRef = UIBarButtonItemStyleBordered; + else if ([style isEqualTo: + + + UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:title style:styleRef target:self action:@selector(clickedToolBarTitle)]; + [toolBarItems setObject:item forKey:name]; +} +*/ + +- (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options +{ + if (!toolBar) + [self createToolBar:nil withDict:nil]; + + NSString *title = [arguments objectAtIndex:0]; + if (!toolBarTitle) { + toolBarTitle = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStylePlain target:self action:@selector(toolBarTitleClicked)]; + } else { + toolBarTitle.title = title; + } + + NSArray *items = [[NSArray alloc] initWithObjects:toolBarTitle]; + [toolBar setItems:items]; +} + + - (void)dealloc { if (tabBar) diff --git a/iphone/Settings.plist b/iphone/Settings.plist index 61e1e940..e6725021 100755 --- a/iphone/Settings.plist +++ b/iphone/Settings.plist @@ -24,13 +24,18 @@ portrait UIControls - TabbarSettings + TabBarSettings height 49 position bottom + ToolBarSettings + + style + Default + diff --git a/iphone/www/index.html b/iphone/www/index.html index 5bc25725..56b29da4 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -106,6 +106,8 @@ }); uicontrols.showTabBar(); uicontrols.showTabBarItems("toprated", "recents", "history", "more"); + + uicontrols.setToolBarTitle("PhoneGap Demo"); } function preventBehavior(e) { @@ -122,7 +124,6 @@
-

Welcome to PhoneGap!

this file is located at iphone/www/index.html

Platform:  

diff --git a/iphone/www/phonegap.js b/iphone/www/phonegap.js index f89fd4de..dd9b8cdd 100644 --- a/iphone/www/phonegap.js +++ b/iphone/www/phonegap.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;btmp/phonegap.js

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/util/jsdoc-toolkit/out/jsdoc/index.html index 9076ae62..6afbe15a 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/util/jsdoc-toolkit/out/jsdoc/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html index ce4f74b2..b0cd3035 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html index e9e2f561..7f654d7d 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html index 0282c8ea..8b2b97ea 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html index 5e39ba28..3ae8b900 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html index aabe08c9..1d4185f5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html index a725549f..4fd3719e 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html index d6903dfa..ed2b4b34 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html index 16af68d3..d5fa4096 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html index f9fe89c8..c5c7f378 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html index 5e0b7c7c..2424f0e3 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html index 214a6b20..c6c1ba37 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html index 1eb488c4..6cd71d10 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html index 9fe53def..ccb02af2 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html index 0dc2c69a..f812fae5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html index 68f9997e..10142994 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html index 57bcbeaa..ce52a6fb 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html index 3e611905..85eb98be 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html index 5a58a92a..a87fe9f0 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html @@ -315,7 +315,7 @@

-
+
Create a toolbar.
@@ -328,6 +328,15 @@

+ +   + +
setToolBarTitle(title) +
+
Function called when a tab bar item has been selected.
+ + +   @@ -518,7 +527,7 @@

- + Create a toolbar.
@@ -569,6 +578,42 @@

+
+ + +
+ + + setToolBarTitle(title) + +
+
+ Function called when a tab bar item has been selected. + + +
+ + + + +
+
Parameters:
+ +
+ {String} title + +
+
the title to set within the toolbar
+ +
+ + + + + + + +
@@ -752,7 +797,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:35 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html index 8585a3ae..f6df7290 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 18:13:34 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html index 61adb216..2b76dec6 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html @@ -400,510 +400,516 @@ 393 }; 394 395 /** -396 */ -397 UIControls.prototype.createToolBar = function() { -398 }; +396 * Create a toolbar. +397 */ +398 UIControls.prototype.createToolBar = function() {}; 399 -400 PhoneGap.addConstructor(function() { -401 window.uicontrols = new UIControls(); -402 }); -403 -404 -405 -406 /** -407 * This class provides access to the debugging console. -408 * @constructor -409 */ -410 function DebugConsole() { -411 } -412 -413 /** -414 * Utility function for rendering and indenting strings, or serializing -415 * objects to a string capable of being printed to the console. -416 * @param {Object|String} message The string or object to convert to an indented string -417 * @private -418 */ -419 DebugConsole.prototype.processMessage = function(message) { -420 if (typeof(message) != 'object') { -421 return encodeURIComponent(message); -422 } else { -423 /** -424 * @function -425 * @ignore -426 */ -427 function indent(str) { -428 return str.replace(/^/mg, " "); -429 } -430 /** -431 * @function -432 * @ignore -433 */ -434 function makeStructured(obj) { -435 var str = ""; -436 for (var i in obj) { -437 try { -438 if (typeof(obj[i]) == 'object') { -439 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; -440 } else { -441 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; -442 } -443 } catch(e) { -444 str += i + " = EXCEPTION: " + e.message + "\n"; -445 } -446 } -447 return str; -448 } -449 return encodeURIComponent("Object:\n" + makeStructured(message)); -450 } -451 }; -452 -453 /** -454 * Print a normal log message to the console -455 * @param {Object|String} message Message or object to print to the console -456 */ -457 DebugConsole.prototype.log = function(message) { -458 }; -459 -460 /** -461 * Print a warning message to the console -462 * @param {Object|String} message Message or object to print to the console -463 */ -464 DebugConsole.prototype.warn = function(message) { -465 }; -466 -467 /** -468 * Print an error message to the console -469 * @param {Object|String} message Message or object to print to the console -470 */ -471 DebugConsole.prototype.error = function(message) { -472 }; -473 -474 PhoneGap.addConstructor(function() { -475 window.debug = new DebugConsole(); -476 }); -477 -478 -479 -480 /** -481 * This class provides generic read and write access to the mobile device file system. -482 */ -483 function File() { -484 /** -485 * The data of a file. -486 */ -487 this.data = ""; -488 /** -489 * The name of the file. -490 */ -491 this.name = ""; -492 } -493 -494 /** -495 * Reads a file from the mobile device. This function is asyncronous. -496 * @param {String} fileName The name (including the path) to the file on the mobile device. -497 * The file name will likely be device dependant. -498 * @param {Function} successCallback The function to call when the file is successfully read. -499 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. -500 */ -501 File.prototype.read = function(fileName, successCallback, errorCallback) { -502 -503 } -504 -505 /** -506 * Writes a file to the mobile device. -507 * @param {File} file The file to write to the device. -508 */ -509 File.prototype.write = function(file) { -510 -511 } -512 -513 PhoneGap.addConstructor(function() { -514 if (typeof navigator.file == "undefined") navigator.file = new File(); -515 }); -516 -517 -518 -519 /** -520 * This class provides access to device GPS data. -521 * @constructor -522 */ -523 function Geolocation() { -524 /** -525 * The last known GPS position. -526 */ -527 this.lastPosition = null; -528 this.lastError = null; -529 this.callbacks = { -530 onLocationChanged: [], -531 onError: [] -532 }; -533 }; -534 -535 /** -536 * Asynchronously aquires the current position. -537 * @param {Function} successCallback The function to call when the position -538 * data is available -539 * @param {Function} errorCallback The function to call when there is an error -540 * getting the position data. -541 * @param {PositionOptions} options The options for getting the position data -542 * such as timeout. -543 */ -544 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { -545 var referenceTime = 0; -546 if (this.lastPosition) -547 referenceTime = this.lastPosition.timeout; -548 else -549 this.start(options); -550 -551 var timeout = 20000; -552 var interval = 500; -553 if (typeof(options) == 'object' && options.interval) -554 interval = options.interval; -555 -556 if (typeof(successCallback) != 'function') -557 successCallback = function() {}; -558 if (typeof(errorCallback) != 'function') -559 errorCallback = function() {}; -560 -561 var dis = this; -562 var delay = 0; -563 var timer = setInterval(function() { -564 delay += interval; -565 -566 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { -567 successCallback(dis.lastPosition); -568 clearInterval(timer); -569 } else if (delay >= timeout) { -570 errorCallback(); -571 clearInterval(timer); -572 } -573 }, interval); -574 }; -575 -576 /** -577 * Asynchronously aquires the position repeatedly at a given interval. -578 * @param {Function} successCallback The function to call each time the position -579 * data is available -580 * @param {Function} errorCallback The function to call when there is an error -581 * getting the position data. -582 * @param {PositionOptions} options The options for getting the position data -583 * such as timeout and the frequency of the watch. -584 */ -585 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { -586 // Invoke the appropriate callback with a new Position object every time the implementation -587 // determines that the position of the hosting device has changed. -588 -589 this.getCurrentPosition(successCallback, errorCallback, options); -590 var frequency = 10000; -591 if (typeof(options) == 'object' && options.frequency) -592 frequency = options.frequency; -593 -594 var that = this; -595 return setInterval(function() { -596 that.getCurrentPosition(successCallback, errorCallback, options); -597 }, frequency); -598 }; -599 -600 -601 /** -602 * Clears the specified position watch. -603 * @param {String} watchId The ID of the watch returned from #watchPosition. -604 */ -605 Geolocation.prototype.clearWatch = function(watchId) { -606 clearInterval(watchId); -607 }; -608 -609 /** -610 * Called by the geolocation framework when the current location is found. -611 * @param {PositionOptions} position The current position. -612 */ -613 Geolocation.prototype.setLocation = function(position) { -614 this.lastPosition = position; -615 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { -616 var f = this.callbacks.onLocationChanged.shift(); -617 f(position); -618 } -619 }; -620 -621 /** -622 * Called by the geolocation framework when an error occurs while looking up the current position. -623 * @param {String} message The text of the error message. -624 */ -625 Geolocation.prototype.setError = function(message) { -626 this.lastError = message; -627 for (var i = 0; i < this.callbacks.onError.length; i++) { -628 var f = this.callbacks.onError.shift(); -629 f(message); -630 } -631 }; -632 -633 PhoneGap.addConstructor(function() { -634 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); -635 }); -636 -637 -638 -639 /** -640 * This class provides access to native mapping applications on the device. -641 */ -642 function Map() { -643 -644 } -645 -646 /** -647 * Shows a native map on the device with pins at the given positions. -648 * @param {Array} positions -649 */ -650 Map.prototype.show = function(positions) { -651 -652 } -653 -654 PhoneGap.addConstructor(function() { -655 if (typeof navigator.map == "undefined") navigator.map = new Map(); -656 }); -657 -658 -659 -660 /** -661 * This class provides access to notifications on the device. -662 */ -663 function Notification() { -664 -665 } -666 -667 /** -668 * Open a native alert dialog, with a customizable title and button text. -669 * @param {String} message Message to print in the body of the alert -670 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) -671 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) -672 */ -673 Notification.prototype.alert = function(message, title, buttonLabel) { -674 // Default is to use a browser alert; this will use "index.html" as the title though -675 alert(message); -676 }; -677 -678 /** -679 * Start spinning the activity indicator on the statusbar -680 */ -681 Notification.prototype.activityStart = function() { +400 /** +401 * Function called when a tab bar item has been selected. +402 * @param {String} title the title to set within the toolbar +403 */ +404 UIControls.prototype.setToolBarTitle = function(title) {}; +405 +406 PhoneGap.addConstructor(function() { +407 window.uicontrols = new UIControls(); +408 }); +409 +410 +411 +412 /** +413 * This class provides access to the debugging console. +414 * @constructor +415 */ +416 function DebugConsole() { +417 } +418 +419 /** +420 * Utility function for rendering and indenting strings, or serializing +421 * objects to a string capable of being printed to the console. +422 * @param {Object|String} message The string or object to convert to an indented string +423 * @private +424 */ +425 DebugConsole.prototype.processMessage = function(message) { +426 if (typeof(message) != 'object') { +427 return encodeURIComponent(message); +428 } else { +429 /** +430 * @function +431 * @ignore +432 */ +433 function indent(str) { +434 return str.replace(/^/mg, " "); +435 } +436 /** +437 * @function +438 * @ignore +439 */ +440 function makeStructured(obj) { +441 var str = ""; +442 for (var i in obj) { +443 try { +444 if (typeof(obj[i]) == 'object') { +445 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; +446 } else { +447 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; +448 } +449 } catch(e) { +450 str += i + " = EXCEPTION: " + e.message + "\n"; +451 } +452 } +453 return str; +454 } +455 return encodeURIComponent("Object:\n" + makeStructured(message)); +456 } +457 }; +458 +459 /** +460 * Print a normal log message to the console +461 * @param {Object|String} message Message or object to print to the console +462 */ +463 DebugConsole.prototype.log = function(message) { +464 }; +465 +466 /** +467 * Print a warning message to the console +468 * @param {Object|String} message Message or object to print to the console +469 */ +470 DebugConsole.prototype.warn = function(message) { +471 }; +472 +473 /** +474 * Print an error message to the console +475 * @param {Object|String} message Message or object to print to the console +476 */ +477 DebugConsole.prototype.error = function(message) { +478 }; +479 +480 PhoneGap.addConstructor(function() { +481 window.debug = new DebugConsole(); +482 }); +483 +484 +485 +486 /** +487 * This class provides generic read and write access to the mobile device file system. +488 */ +489 function File() { +490 /** +491 * The data of a file. +492 */ +493 this.data = ""; +494 /** +495 * The name of the file. +496 */ +497 this.name = ""; +498 } +499 +500 /** +501 * Reads a file from the mobile device. This function is asyncronous. +502 * @param {String} fileName The name (including the path) to the file on the mobile device. +503 * The file name will likely be device dependant. +504 * @param {Function} successCallback The function to call when the file is successfully read. +505 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. +506 */ +507 File.prototype.read = function(fileName, successCallback, errorCallback) { +508 +509 } +510 +511 /** +512 * Writes a file to the mobile device. +513 * @param {File} file The file to write to the device. +514 */ +515 File.prototype.write = function(file) { +516 +517 } +518 +519 PhoneGap.addConstructor(function() { +520 if (typeof navigator.file == "undefined") navigator.file = new File(); +521 }); +522 +523 +524 +525 /** +526 * This class provides access to device GPS data. +527 * @constructor +528 */ +529 function Geolocation() { +530 /** +531 * The last known GPS position. +532 */ +533 this.lastPosition = null; +534 this.lastError = null; +535 this.callbacks = { +536 onLocationChanged: [], +537 onError: [] +538 }; +539 }; +540 +541 /** +542 * Asynchronously aquires the current position. +543 * @param {Function} successCallback The function to call when the position +544 * data is available +545 * @param {Function} errorCallback The function to call when there is an error +546 * getting the position data. +547 * @param {PositionOptions} options The options for getting the position data +548 * such as timeout. +549 */ +550 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { +551 var referenceTime = 0; +552 if (this.lastPosition) +553 referenceTime = this.lastPosition.timeout; +554 else +555 this.start(options); +556 +557 var timeout = 20000; +558 var interval = 500; +559 if (typeof(options) == 'object' && options.interval) +560 interval = options.interval; +561 +562 if (typeof(successCallback) != 'function') +563 successCallback = function() {}; +564 if (typeof(errorCallback) != 'function') +565 errorCallback = function() {}; +566 +567 var dis = this; +568 var delay = 0; +569 var timer = setInterval(function() { +570 delay += interval; +571 +572 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { +573 successCallback(dis.lastPosition); +574 clearInterval(timer); +575 } else if (delay >= timeout) { +576 errorCallback(); +577 clearInterval(timer); +578 } +579 }, interval); +580 }; +581 +582 /** +583 * Asynchronously aquires the position repeatedly at a given interval. +584 * @param {Function} successCallback The function to call each time the position +585 * data is available +586 * @param {Function} errorCallback The function to call when there is an error +587 * getting the position data. +588 * @param {PositionOptions} options The options for getting the position data +589 * such as timeout and the frequency of the watch. +590 */ +591 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { +592 // Invoke the appropriate callback with a new Position object every time the implementation +593 // determines that the position of the hosting device has changed. +594 +595 this.getCurrentPosition(successCallback, errorCallback, options); +596 var frequency = 10000; +597 if (typeof(options) == 'object' && options.frequency) +598 frequency = options.frequency; +599 +600 var that = this; +601 return setInterval(function() { +602 that.getCurrentPosition(successCallback, errorCallback, options); +603 }, frequency); +604 }; +605 +606 +607 /** +608 * Clears the specified position watch. +609 * @param {String} watchId The ID of the watch returned from #watchPosition. +610 */ +611 Geolocation.prototype.clearWatch = function(watchId) { +612 clearInterval(watchId); +613 }; +614 +615 /** +616 * Called by the geolocation framework when the current location is found. +617 * @param {PositionOptions} position The current position. +618 */ +619 Geolocation.prototype.setLocation = function(position) { +620 this.lastPosition = position; +621 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { +622 var f = this.callbacks.onLocationChanged.shift(); +623 f(position); +624 } +625 }; +626 +627 /** +628 * Called by the geolocation framework when an error occurs while looking up the current position. +629 * @param {String} message The text of the error message. +630 */ +631 Geolocation.prototype.setError = function(message) { +632 this.lastError = message; +633 for (var i = 0; i < this.callbacks.onError.length; i++) { +634 var f = this.callbacks.onError.shift(); +635 f(message); +636 } +637 }; +638 +639 PhoneGap.addConstructor(function() { +640 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); +641 }); +642 +643 +644 +645 /** +646 * This class provides access to native mapping applications on the device. +647 */ +648 function Map() { +649 +650 } +651 +652 /** +653 * Shows a native map on the device with pins at the given positions. +654 * @param {Array} positions +655 */ +656 Map.prototype.show = function(positions) { +657 +658 } +659 +660 PhoneGap.addConstructor(function() { +661 if (typeof navigator.map == "undefined") navigator.map = new Map(); +662 }); +663 +664 +665 +666 /** +667 * This class provides access to notifications on the device. +668 */ +669 function Notification() { +670 +671 } +672 +673 /** +674 * Open a native alert dialog, with a customizable title and button text. +675 * @param {String} message Message to print in the body of the alert +676 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) +677 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) +678 */ +679 Notification.prototype.alert = function(message, title, buttonLabel) { +680 // Default is to use a browser alert; this will use "index.html" as the title though +681 alert(message); 682 }; 683 684 /** -685 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +685 * Start spinning the activity indicator on the statusbar 686 */ -687 Notification.prototype.activityStop = function() { +687 Notification.prototype.activityStart = function() { 688 }; 689 690 /** -691 * Causes the device to blink a status LED. -692 * @param {Integer} count The number of blinks. -693 * @param {String} colour The colour of the light. -694 */ -695 Notification.prototype.blink = function(count, colour) { -696 -697 }; -698 -699 /** -700 * Causes the device to vibrate. -701 * @param {Integer} mills The number of milliseconds to vibrate for. -702 */ -703 Notification.prototype.vibrate = function(mills) { -704 -705 }; -706 -707 /** -708 * Causes the device to beep. -709 * @param {Integer} count The number of beeps. -710 * @param {Integer} volume The volume of the beep. -711 */ -712 Notification.prototype.beep = function(count, volume) { -713 -714 }; -715 -716 // TODO: of course on Blackberry and Android there notifications in the UI as well -717 -718 PhoneGap.addConstructor(function() { -719 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); -720 }); +691 * Stop spinning the activity indicator on the statusbar, if it's currently spinning +692 */ +693 Notification.prototype.activityStop = function() { +694 }; +695 +696 /** +697 * Causes the device to blink a status LED. +698 * @param {Integer} count The number of blinks. +699 * @param {String} colour The colour of the light. +700 */ +701 Notification.prototype.blink = function(count, colour) { +702 +703 }; +704 +705 /** +706 * Causes the device to vibrate. +707 * @param {Integer} mills The number of milliseconds to vibrate for. +708 */ +709 Notification.prototype.vibrate = function(mills) { +710 +711 }; +712 +713 /** +714 * Causes the device to beep. +715 * @param {Integer} count The number of beeps. +716 * @param {Integer} volume The volume of the beep. +717 */ +718 Notification.prototype.beep = function(count, volume) { +719 +720 }; 721 -722 -723 -724 /** -725 * This class provides access to the device orientation. -726 * @constructor -727 */ -728 function Orientation() { -729 /** -730 * The last known orientation. -731 */ -732 this.lastOrientation = null; -733 } -734 -735 /** -736 * Asynchronously aquires the current orientation. -737 * @param {Function} successCallback The function to call when the orientation -738 * is known. -739 * @param {Function} errorCallback The function to call when there is an error -740 * getting the orientation. -741 */ -742 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { -743 // If the position is available then call success -744 // If the position is not available then call error -745 } -746 -747 /** -748 * Asynchronously aquires the orientation repeatedly at a given interval. -749 * @param {Function} successCallback The function to call each time the orientation -750 * data is available. -751 * @param {Function} errorCallback The function to call when there is an error -752 * getting the orientation data. -753 */ -754 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { -755 // Invoke the appropriate callback with a new Position object every time the implementation -756 // determines that the position of the hosting device has changed. -757 this.getCurrentPosition(successCallback, errorCallback); -758 return setInterval(function() { -759 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); -760 }, 10000); -761 } -762 -763 /** -764 * Clears the specified orientation watch. -765 * @param {String} watchId The ID of the watch returned from #watchOrientation. -766 */ -767 Orientation.prototype.clearWatch = function(watchId) { -768 clearInterval(watchId); -769 } -770 -771 PhoneGap.addConstructor(function() { -772 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); -773 }); -774 -775 -776 -777 /** -778 * This class contains position information. -779 * @param {Object} lat -780 * @param {Object} lng -781 * @param {Object} acc -782 * @param {Object} alt -783 * @param {Object} altacc -784 * @param {Object} head -785 * @param {Object} vel -786 * @constructor -787 */ -788 function Position(lat, lng, acc, alt, altacc, head, vel) { -789 /** -790 * The latitude of the position. -791 */ -792 this.latitude = lat; -793 /** -794 * The longitude of the position, -795 */ -796 this.longitude = lng; -797 /** -798 * The accuracy of the position. -799 */ -800 this.accuracy = acc; -801 /** -802 * The altitude of the position. -803 */ -804 this.altitude = alt; -805 /** -806 * The altitude accuracy of the position. -807 */ -808 this.altitudeAccuracy = altacc; -809 /** -810 * The direction the device is moving at the position. -811 */ -812 this.heading = head; -813 /** -814 * The velocity with which the device is moving at the position. -815 */ -816 this.velocity = vel; -817 /** -818 * The time that the position was obtained. -819 */ -820 this.timestamp = new Date().getTime(); -821 } -822 -823 /** -824 * This class specifies the options for requesting position data. -825 * @constructor -826 */ -827 function PositionOptions() { -828 /** -829 * Specifies the desired position accuracy. -830 */ -831 this.enableHighAccuracy = true; -832 /** -833 * The timeout after which if position data cannot be obtained the errorCallback -834 * is called. -835 */ -836 this.timeout = 10000; -837 } -838 -839 /** -840 * This class contains information about any GSP errors. -841 * @constructor -842 */ -843 function PositionError() { -844 this.code = null; -845 this.message = ""; -846 } -847 -848 PositionError.UNKNOWN_ERROR = 0; -849 PositionError.PERMISSION_DENIED = 1; -850 PositionError.POSITION_UNAVAILABLE = 2; -851 PositionError.TIMEOUT = 3; -852 -853 -854 -855 /** -856 * This class provides access to the device SMS functionality. -857 * @constructor -858 */ -859 function Sms() { -860 -861 } -862 -863 /** -864 * Sends an SMS message. -865 * @param {Integer} number The phone number to send the message to. -866 * @param {String} message The contents of the SMS message to send. -867 * @param {Function} successCallback The function to call when the SMS message is sent. -868 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. -869 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. -870 */ -871 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { -872 -873 } -874 -875 PhoneGap.addConstructor(function() { -876 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); -877 }); -878 -879 -880 -881 /** -882 * This class provides access to the telephony features of the device. -883 * @constructor -884 */ -885 function Telephony() { -886 -887 } -888 -889 /** -890 * Calls the specifed number. -891 * @param {Integer} number The number to be called. -892 */ -893 Telephony.prototype.call = function(number) { -894 -895 } -896 -897 PhoneGap.addConstructor(function() { -898 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); -899 }); -900 -901 -902 \ No newline at end of file +722 // TODO: of course on Blackberry and Android there notifications in the UI as well +723 +724 PhoneGap.addConstructor(function() { +725 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +726 }); +727 +728 +729 +730 /** +731 * This class provides access to the device orientation. +732 * @constructor +733 */ +734 function Orientation() { +735 /** +736 * The last known orientation. +737 */ +738 this.lastOrientation = null; +739 } +740 +741 /** +742 * Asynchronously aquires the current orientation. +743 * @param {Function} successCallback The function to call when the orientation +744 * is known. +745 * @param {Function} errorCallback The function to call when there is an error +746 * getting the orientation. +747 */ +748 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { +749 // If the position is available then call success +750 // If the position is not available then call error +751 } +752 +753 /** +754 * Asynchronously aquires the orientation repeatedly at a given interval. +755 * @param {Function} successCallback The function to call each time the orientation +756 * data is available. +757 * @param {Function} errorCallback The function to call when there is an error +758 * getting the orientation data. +759 */ +760 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { +761 // Invoke the appropriate callback with a new Position object every time the implementation +762 // determines that the position of the hosting device has changed. +763 this.getCurrentPosition(successCallback, errorCallback); +764 return setInterval(function() { +765 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); +766 }, 10000); +767 } +768 +769 /** +770 * Clears the specified orientation watch. +771 * @param {String} watchId The ID of the watch returned from #watchOrientation. +772 */ +773 Orientation.prototype.clearWatch = function(watchId) { +774 clearInterval(watchId); +775 } +776 +777 PhoneGap.addConstructor(function() { +778 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); +779 }); +780 +781 +782 +783 /** +784 * This class contains position information. +785 * @param {Object} lat +786 * @param {Object} lng +787 * @param {Object} acc +788 * @param {Object} alt +789 * @param {Object} altacc +790 * @param {Object} head +791 * @param {Object} vel +792 * @constructor +793 */ +794 function Position(lat, lng, acc, alt, altacc, head, vel) { +795 /** +796 * The latitude of the position. +797 */ +798 this.latitude = lat; +799 /** +800 * The longitude of the position, +801 */ +802 this.longitude = lng; +803 /** +804 * The accuracy of the position. +805 */ +806 this.accuracy = acc; +807 /** +808 * The altitude of the position. +809 */ +810 this.altitude = alt; +811 /** +812 * The altitude accuracy of the position. +813 */ +814 this.altitudeAccuracy = altacc; +815 /** +816 * The direction the device is moving at the position. +817 */ +818 this.heading = head; +819 /** +820 * The velocity with which the device is moving at the position. +821 */ +822 this.velocity = vel; +823 /** +824 * The time that the position was obtained. +825 */ +826 this.timestamp = new Date().getTime(); +827 } +828 +829 /** +830 * This class specifies the options for requesting position data. +831 * @constructor +832 */ +833 function PositionOptions() { +834 /** +835 * Specifies the desired position accuracy. +836 */ +837 this.enableHighAccuracy = true; +838 /** +839 * The timeout after which if position data cannot be obtained the errorCallback +840 * is called. +841 */ +842 this.timeout = 10000; +843 } +844 +845 /** +846 * This class contains information about any GSP errors. +847 * @constructor +848 */ +849 function PositionError() { +850 this.code = null; +851 this.message = ""; +852 } +853 +854 PositionError.UNKNOWN_ERROR = 0; +855 PositionError.PERMISSION_DENIED = 1; +856 PositionError.POSITION_UNAVAILABLE = 2; +857 PositionError.TIMEOUT = 3; +858 +859 +860 +861 /** +862 * This class provides access to the device SMS functionality. +863 * @constructor +864 */ +865 function Sms() { +866 +867 } +868 +869 /** +870 * Sends an SMS message. +871 * @param {Integer} number The phone number to send the message to. +872 * @param {String} message The contents of the SMS message to send. +873 * @param {Function} successCallback The function to call when the SMS message is sent. +874 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. +875 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. +876 */ +877 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { +878 +879 } +880 +881 PhoneGap.addConstructor(function() { +882 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); +883 }); +884 +885 +886 +887 /** +888 * This class provides access to the telephony features of the device. +889 * @constructor +890 */ +891 function Telephony() { +892 +893 } +894 +895 /** +896 * Calls the specifed number. +897 * @param {Integer} number The number to be called. +898 */ +899 Telephony.prototype.call = function(number) { +900 +901 } +902 +903 PhoneGap.addConstructor(function() { +904 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); +905 }); +906 +907 +908 \ No newline at end of file From ec2a015cd3572648c8f53c136816b9d3adc6ed1b Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Mon, 20 Apr 2009 09:03:44 -0700 Subject: [PATCH 07/10] Centered the toolbar title and made it not crash when you click it --- iphone/Classes/UIControls.h | 6 +++++- iphone/Classes/UIControls.m | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/iphone/Classes/UIControls.h b/iphone/Classes/UIControls.h index 614b2fa4..6334a8a7 100644 --- a/iphone/Classes/UIControls.h +++ b/iphone/Classes/UIControls.h @@ -34,9 +34,13 @@ /* Tool Bar methods */ - (void)createToolBar:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)toolBarTitleClicked; + +/* - (void)createToolBarButton:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)createToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options; - +*/ //- (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options; //- (void)setToolBarButtons:(NSArray*)arguments withDict:(NSDictionary*)options; diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index 0c890d6b..d04e3744 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -394,10 +394,16 @@ - (void)setToolBarTitle:(NSArray*)arguments withDict:(NSDictionary*)options toolBarTitle.title = title; } - NSArray *items = [[NSArray alloc] initWithObjects:toolBarTitle]; + UIBarButtonItem *space1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; + UIBarButtonItem *space2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; + NSArray *items = [[NSArray alloc] initWithObjects:space1, toolBarTitle, space2, nil]; [toolBar setItems:items]; } +- (void)toolBarTitleClicked +{ + NSLog(@"Toolbar clicked"); +} - (void)dealloc { From 110b103a486e04de447753a3d939f95f0e6fd957 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Mon, 20 Apr 2009 22:37:06 -0700 Subject: [PATCH 08/10] When the statusbar is hidden, resize the webview to match --- iphone/Classes/PhoneGapDelegate.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/iphone/Classes/PhoneGapDelegate.m b/iphone/Classes/PhoneGapDelegate.m index d6ec7a89..f70b19e9 100755 --- a/iphone/Classes/PhoneGapDelegate.m +++ b/iphone/Classes/PhoneGapDelegate.m @@ -175,7 +175,14 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application topStatusBarStyle = UIStatusBarStyleDefault; } if ([topStatusBar isEqualToString:@"none"]) { + int toolbarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; + CGRect webViewBounds = webView.bounds; + [webView setFrame:CGRectMake(webViewBounds.origin.x, + webViewBounds.origin.y - toolbarHeight, + webViewBounds.size.width, + webViewBounds.size.height + toolbarHeight + )]; } else { [[UIApplication sharedApplication] setStatusBarStyle:topStatusBarStyle animated:NO]; } From 69c5ced238619814e6ccb5c6327d324f58dab446 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Tue, 21 Apr 2009 12:57:35 -0700 Subject: [PATCH 09/10] Created a facility to have individual application settings auto-dumped to JavaScript via the JSON SDK --- iphone/Classes/PhoneGapDelegate.h | 2 +- iphone/Classes/PhoneGapDelegate.m | 34 ++++- .../JSON/iphoneos.sdk/SDKSettings.plist | 49 +++++++ .../usr/local/include/JSON/JSON.h | 44 ++++++ .../usr/local/include/JSON/NSObject+SBJSON.h | 60 ++++++++ .../usr/local/include/JSON/NSString+SBJSON.h | 41 ++++++ .../usr/local/include/JSON/SBJSON.h | 137 ++++++++++++++++++ .../JSON/iphoneos.sdk/usr/local/lib/libjson.a | Bin 0 -> 88304 bytes .../iphonesimulator.sdk/SDKSettings.plist | 35 +++++ .../usr/local/include/JSON/JSON.h | 44 ++++++ .../usr/local/include/JSON/NSObject+SBJSON.h | 60 ++++++++ .../usr/local/include/JSON/NSString+SBJSON.h | 41 ++++++ .../usr/local/include/JSON/SBJSON.h | 137 ++++++++++++++++++ .../usr/local/lib/libjson.a | Bin 0 -> 74064 bytes .../macosx.sdk/usr/local/include/JSON/JSON.h | 44 ++++++ .../usr/local/include/JSON/NSObject+SBJSON.h | 60 ++++++++ .../usr/local/include/JSON/NSString+SBJSON.h | 41 ++++++ .../usr/local/include/JSON/SBJSON.h | 137 ++++++++++++++++++ .../JSON/macosx.sdk/usr/local/lib/libjson.a | Bin 0 -> 361768 bytes iphone/PhoneGap.plist | 41 ++++++ iphone/PhoneGap.xcodeproj/project.pbxproj | 28 +++- iphone/Settings.plist | 37 +---- 22 files changed, 1026 insertions(+), 46 deletions(-) create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/SDKSettings.plist create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/JSON.h create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSObject+SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSString+SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphoneos.sdk/usr/local/lib/libjson.a create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/SDKSettings.plist create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/JSON.h create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSObject+SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSString+SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/SBJSON.h create mode 100644 iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/lib/libjson.a create mode 100644 iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/JSON.h create mode 100644 iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSObject+SBJSON.h create mode 100644 iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSString+SBJSON.h create mode 100644 iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/SBJSON.h create mode 100644 iphone/Frameworks/JSON/macosx.sdk/usr/local/lib/libjson.a create mode 100755 iphone/PhoneGap.plist mode change 100755 => 100644 iphone/Settings.plist diff --git a/iphone/Classes/PhoneGapDelegate.h b/iphone/Classes/PhoneGapDelegate.h index 94003609..591012dd 100755 --- a/iphone/Classes/PhoneGapDelegate.h +++ b/iphone/Classes/PhoneGapDelegate.h @@ -1,7 +1,7 @@ - #import #import #import +#import #import "Location.h" #import "Device.h" diff --git a/iphone/Classes/PhoneGapDelegate.m b/iphone/Classes/PhoneGapDelegate.m index 7c2c07ea..e40b90ec 100755 --- a/iphone/Classes/PhoneGapDelegate.m +++ b/iphone/Classes/PhoneGapDelegate.m @@ -46,14 +46,14 @@ -(id) getCommandInstance:(NSString*)className - (void)applicationDidFinishLaunching:(UIApplication *)application { /* - * Settings.plist + * PhoneGap.plist * - * This block of code navigates to the Settings.plist in the Config Group and reads the XML into an Hash (Dictionary) + * This block of code navigates to the PhoneGap.plist in the Config Group and reads the XML into an Hash (Dictionary) * */ NSString *errorDesc = nil; NSPropertyListFormat format; - NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"plist"]; + NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"PhoneGap" ofType:@"plist"]; NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML @@ -123,7 +123,7 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application ]]; /* - * detectNumber - If we want to Automagically convery phone numbers to links - Set in Settings.plist + * detectNumber - If we want to Automagically convery phone numbers to links - Set in PhoneGap.plist * Value should be BOOL (YES|NO) */ webView.detectsPhoneNumbers = [detectNumber boolValue]; @@ -161,7 +161,7 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application /* * rotateOrientation - This option is only enabled when AutoRotate is enabled. If the phone is still rotated * when AutoRotate is disabled, this will control what orientations will be rotated to. If you wish your app to - * only use landscape or portrait orientations, change the value in Settings.plist to indicate that. + * only use landscape or portrait orientations, change the value in PhoneGap.plist to indicate that. * Value should be one of: any, portrait, landscape */ [viewController setRotateOrientation:rotateOrientation]; @@ -220,7 +220,29 @@ - (void)webViewDidStartLoad:(UIWebView *)theWebView { /* * This is the Device.platform information */ - [theWebView stringByEvaluatingJavaScriptFromString:[[Device alloc] init]]; + NSString *deviceStr = [[Device alloc] init]; + + /* Settings.plist + * Read the optional Settings.plist file and push these user-defined settings down into the web application. + * This can be useful for supplying build-time configuration variables down to the app to change its behaviour, + * such as specifying Full / Lite version, or localization (English vs German, for instance). + */ + NSString *errorDesc = nil; + NSPropertyListFormat format; + NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"plist"]; + NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; + NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization + propertyListFromData:plistXML + mutabilityOption:NSPropertyListMutableContainersAndLeaves + format:&format errorDescription:&errorDesc]; + if ([temp respondsToSelector:@selector(JSONFragment)]) { + NSString *initString = [[NSString alloc] initWithFormat:@"%@\nwindow.Settings = %@;", deviceStr, [temp JSONFragment]]; + NSLog(@"%@", initString); + [theWebView stringByEvaluatingJavaScriptFromString:initString]; + [initString release]; + } else { + [theWebView stringByEvaluatingJavaScriptFromString:deviceStr]; + } } - (void)webViewDidFinishLoad:(UIWebView *)theWebView { diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/SDKSettings.plist b/iphone/Frameworks/JSON/iphoneos.sdk/SDKSettings.plist new file mode 100644 index 00000000..4307f277 --- /dev/null +++ b/iphone/Frameworks/JSON/iphoneos.sdk/SDKSettings.plist @@ -0,0 +1,49 @@ + + + + + AlternateSDK + jsoniphonesimulator2.0 + CanonicalName + jsoniphoneos2.0 + CustomProperties + + DefaultProperties + + AD_HOC_CODE_SIGNING_ALLOWED + NO + CODE_SIGN_ENTITLEMENTS + + CODE_SIGN_RESOURCE_RULES_PATH + $(SDKROOT)/ResourceRules.plist + DEAD_CODE_STRIPPING + YES + ENTITLEMENTS_REQUIRED + YES + GCC_THUMB_SUPPORT + YES + IPHONEOS_DEPLOYMENT_TARGET + 2.0 + MACOSX_DEPLOYMENT_TARGET + 10.5 + PLATFORM_NAME + iphoneos + + DisplayName + Device - iPhone OS 2.0 + FamilyIdentifier + iphoneos + FamilyName + iPhone OS + IsBaseSDK + NO + MaximumOSDeploymentTarget + 10.5 + MinimalDisplayName + Device + MinimumSupportedToolsVersion + 3.1 + Version + 2.0 + + diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/JSON.h b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/JSON.h new file mode 100644 index 00000000..54b26f82 --- /dev/null +++ b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/JSON.h @@ -0,0 +1,44 @@ +/* +Copyright (c) 2007, Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** +@mainpage A strict JSON parser and generator for Objective-C + +JSON (JavaScript Object Notation) is a lightweight data-interchange +format. This framework provides two apis for parsing and generating +JSON. One standard object-based and a higher level api consisting of +categories added to existing Objective-C classes. + +Learn more on the http://code.google.com/p/json-framework project site. +*/ + +#import +#import +#import + diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSObject+SBJSON.h b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSObject+SBJSON.h new file mode 100644 index 00000000..038ea8e3 --- /dev/null +++ b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSObject+SBJSON.h @@ -0,0 +1,60 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + + +/// Adds JSON generation to NSObject subclasses +@interface NSObject (NSObject_SBJSON) + +/** + @brief Returns a string containing the receiver encoded as a JSON fragment. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + @li NSString + @li NSNumber (also used for booleans) + @li NSNull + */ +- (NSString *)JSONFragment; + +/** + @brief Returns a string containing the receiver encoded in JSON. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + */ +- (NSString *)JSONRepresentation; + +@end + diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSString+SBJSON.h b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSString+SBJSON.h new file mode 100644 index 00000000..69cfa4fd --- /dev/null +++ b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/NSString+SBJSON.h @@ -0,0 +1,41 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +/// Adds JSON parsing to NSString +@interface NSString (NSString_SBJSON) + +/// Returns the object represented in the receiver, or nil on error. +- (id)JSONFragmentValue; + +/// Returns the dictionary or array represented in the receiver, or nil on error. +- (id)JSONValue; + +@end diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/SBJSON.h b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/SBJSON.h new file mode 100644 index 00000000..c931d464 --- /dev/null +++ b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/include/JSON/SBJSON.h @@ -0,0 +1,137 @@ +/* +Copyright (C) 2008 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +extern NSString * SBJSONErrorDomain; + +enum { + EUNSUPPORTED = 1, + EPARSENUM, + EPARSE, + EFRAGMENT, + ECTRL, + EUNICODE, + EDEPTH, + EESCAPE, + ETRAILCOMMA, + ETRAILGARBAGE, + EEOF, + EINPUT +}; + +/** +@brief A strict JSON parser and generator + +This is the parser and generator underlying the categories added to +NSString and various other objects. + +Objective-C types are mapped to JSON types and back in the following way: + +@li NSNull -> Null -> NSNull +@li NSString -> String -> NSMutableString +@li NSArray -> Array -> NSMutableArray +@li NSDictionary -> Object -> NSMutableDictionary +@li NSNumber (-initWithBool:) -> Boolean -> NSNumber -initWithBool: +@li NSNumber -> Number -> NSDecimalNumber + +In JSON the keys of an object must be strings. NSDictionary keys need +not be, but attempting to convert an NSDictionary with non-string keys +into JSON will throw an exception. + +NSNumber instances created with the +numberWithBool: method are +converted into the JSON boolean "true" and "false" values, and vice +versa. Any other NSNumber instances are converted to a JSON number the +way you would expect. JSON numbers turn into NSDecimalNumber instances, +as we can thus avoid any loss of precision. + +Strictly speaking correctly formed JSON text must have exactly +one top-level container. (Either an Array or an Object.) Scalars, +i.e. nulls, numbers, booleans and strings, are not valid JSON on their own. +It can be quite convenient to pretend that such fragments are valid +JSON however, and this class lets you do so. + +This class does its best to be as strict as possible, both in what it +accepts and what it generates. (Other than the above mentioned support +for JSON fragments.) For example, it does not support trailing commas +in arrays or objects. Nor does it support embedded comments, or +anything else not in the JSON specification. + +*/ +@interface SBJSON : NSObject { + BOOL humanReadable; + BOOL sortKeys; + NSUInteger maxDepth; + +@private + // Used temporarily during scanning/generation + NSUInteger depth; + const char *c; +} + +/// Whether we are generating human-readable (multiline) JSON +/** + Set whether or not to generate human-readable JSON. The default is NO, which produces + JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable + JSON with linebreaks after each array value and dictionary key/value pair, indented two + spaces per nesting level. + */ +@property BOOL humanReadable; + +/// Whether or not to sort the dictionary keys in the output +/** The default is to not sort the keys. */ +@property BOOL sortKeys; + +/// The maximum depth the parser will go to +/** Defaults to 512. */ +@property NSUInteger maxDepth; + +/// Return JSON representation of an array or dictionary +- (NSString*)stringWithObject:(id)value error:(NSError**)error; + +/// Return JSON representation of any legal JSON value +- (NSString*)stringWithFragment:(id)value error:(NSError**)error; + +/// Return the object represented by the given string +- (id)objectWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return the fragment represented by the given string +- (id)fragmentWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return JSON representation (or fragment) for the given object +- (NSString*)stringWithObject:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +/// Parse the string and return the represented object (or scalar) +- (id)objectWithString:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +@end diff --git a/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/lib/libjson.a b/iphone/Frameworks/JSON/iphoneos.sdk/usr/local/lib/libjson.a new file mode 100644 index 0000000000000000000000000000000000000000..9f8c01fa5d7850549b9d0105b81bf18cfb736c36 GIT binary patch literal 88304 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 + + + + CanonicalName + jsoniphonesimulator2.0 + CustomProperties + + DefaultProperties + + GCC_PRODUCT_TYPE_PREPROCESSOR_DEFINITIONS + __IPHONE_OS_VERSION_MIN_REQUIRED=20000 + MACOSX_DEPLOYMENT_TARGET + 10.5 + PLATFORM_NAME + iphonesimulator + + DisplayName + Simulator - iPhone OS 2.0 + FamilyIdentifier + iphoneos + FamilyName + iPhone OS + MaximumDeploymentTarget + 10.5 + MinimalDisplayName + Simulator + MinimumSupportedToolsVersion + 3.1 + Version + 2.0 + isBaseSDK + NO + + diff --git a/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/JSON.h b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/JSON.h new file mode 100644 index 00000000..54b26f82 --- /dev/null +++ b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/JSON.h @@ -0,0 +1,44 @@ +/* +Copyright (c) 2007, Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** +@mainpage A strict JSON parser and generator for Objective-C + +JSON (JavaScript Object Notation) is a lightweight data-interchange +format. This framework provides two apis for parsing and generating +JSON. One standard object-based and a higher level api consisting of +categories added to existing Objective-C classes. + +Learn more on the http://code.google.com/p/json-framework project site. +*/ + +#import +#import +#import + diff --git a/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSObject+SBJSON.h b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSObject+SBJSON.h new file mode 100644 index 00000000..038ea8e3 --- /dev/null +++ b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSObject+SBJSON.h @@ -0,0 +1,60 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + + +/// Adds JSON generation to NSObject subclasses +@interface NSObject (NSObject_SBJSON) + +/** + @brief Returns a string containing the receiver encoded as a JSON fragment. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + @li NSString + @li NSNumber (also used for booleans) + @li NSNull + */ +- (NSString *)JSONFragment; + +/** + @brief Returns a string containing the receiver encoded in JSON. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + */ +- (NSString *)JSONRepresentation; + +@end + diff --git a/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSString+SBJSON.h b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSString+SBJSON.h new file mode 100644 index 00000000..69cfa4fd --- /dev/null +++ b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/NSString+SBJSON.h @@ -0,0 +1,41 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +/// Adds JSON parsing to NSString +@interface NSString (NSString_SBJSON) + +/// Returns the object represented in the receiver, or nil on error. +- (id)JSONFragmentValue; + +/// Returns the dictionary or array represented in the receiver, or nil on error. +- (id)JSONValue; + +@end diff --git a/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/SBJSON.h b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/SBJSON.h new file mode 100644 index 00000000..c931d464 --- /dev/null +++ b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/include/JSON/SBJSON.h @@ -0,0 +1,137 @@ +/* +Copyright (C) 2008 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +extern NSString * SBJSONErrorDomain; + +enum { + EUNSUPPORTED = 1, + EPARSENUM, + EPARSE, + EFRAGMENT, + ECTRL, + EUNICODE, + EDEPTH, + EESCAPE, + ETRAILCOMMA, + ETRAILGARBAGE, + EEOF, + EINPUT +}; + +/** +@brief A strict JSON parser and generator + +This is the parser and generator underlying the categories added to +NSString and various other objects. + +Objective-C types are mapped to JSON types and back in the following way: + +@li NSNull -> Null -> NSNull +@li NSString -> String -> NSMutableString +@li NSArray -> Array -> NSMutableArray +@li NSDictionary -> Object -> NSMutableDictionary +@li NSNumber (-initWithBool:) -> Boolean -> NSNumber -initWithBool: +@li NSNumber -> Number -> NSDecimalNumber + +In JSON the keys of an object must be strings. NSDictionary keys need +not be, but attempting to convert an NSDictionary with non-string keys +into JSON will throw an exception. + +NSNumber instances created with the +numberWithBool: method are +converted into the JSON boolean "true" and "false" values, and vice +versa. Any other NSNumber instances are converted to a JSON number the +way you would expect. JSON numbers turn into NSDecimalNumber instances, +as we can thus avoid any loss of precision. + +Strictly speaking correctly formed JSON text must have exactly +one top-level container. (Either an Array or an Object.) Scalars, +i.e. nulls, numbers, booleans and strings, are not valid JSON on their own. +It can be quite convenient to pretend that such fragments are valid +JSON however, and this class lets you do so. + +This class does its best to be as strict as possible, both in what it +accepts and what it generates. (Other than the above mentioned support +for JSON fragments.) For example, it does not support trailing commas +in arrays or objects. Nor does it support embedded comments, or +anything else not in the JSON specification. + +*/ +@interface SBJSON : NSObject { + BOOL humanReadable; + BOOL sortKeys; + NSUInteger maxDepth; + +@private + // Used temporarily during scanning/generation + NSUInteger depth; + const char *c; +} + +/// Whether we are generating human-readable (multiline) JSON +/** + Set whether or not to generate human-readable JSON. The default is NO, which produces + JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable + JSON with linebreaks after each array value and dictionary key/value pair, indented two + spaces per nesting level. + */ +@property BOOL humanReadable; + +/// Whether or not to sort the dictionary keys in the output +/** The default is to not sort the keys. */ +@property BOOL sortKeys; + +/// The maximum depth the parser will go to +/** Defaults to 512. */ +@property NSUInteger maxDepth; + +/// Return JSON representation of an array or dictionary +- (NSString*)stringWithObject:(id)value error:(NSError**)error; + +/// Return JSON representation of any legal JSON value +- (NSString*)stringWithFragment:(id)value error:(NSError**)error; + +/// Return the object represented by the given string +- (id)objectWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return the fragment represented by the given string +- (id)fragmentWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return JSON representation (or fragment) for the given object +- (NSString*)stringWithObject:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +/// Parse the string and return the represented object (or scalar) +- (id)objectWithString:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +@end diff --git a/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/lib/libjson.a b/iphone/Frameworks/JSON/iphonesimulator.sdk/usr/local/lib/libjson.a new file mode 100644 index 0000000000000000000000000000000000000000..d127448f3658135223be97fefc69366737ab1875 GIT binary patch literal 74064 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ⓈE!q`fB2k1o(`tOAPE70wH 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 MI$eMNjFhkc0&$9aGynhq literal 0 HcmV?d00001 diff --git a/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/JSON.h b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/JSON.h new file mode 100644 index 00000000..54b26f82 --- /dev/null +++ b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/JSON.h @@ -0,0 +1,44 @@ +/* +Copyright (c) 2007, Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** +@mainpage A strict JSON parser and generator for Objective-C + +JSON (JavaScript Object Notation) is a lightweight data-interchange +format. This framework provides two apis for parsing and generating +JSON. One standard object-based and a higher level api consisting of +categories added to existing Objective-C classes. + +Learn more on the http://code.google.com/p/json-framework project site. +*/ + +#import +#import +#import + diff --git a/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSObject+SBJSON.h b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSObject+SBJSON.h new file mode 100644 index 00000000..038ea8e3 --- /dev/null +++ b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSObject+SBJSON.h @@ -0,0 +1,60 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + + +/// Adds JSON generation to NSObject subclasses +@interface NSObject (NSObject_SBJSON) + +/** + @brief Returns a string containing the receiver encoded as a JSON fragment. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + @li NSString + @li NSNumber (also used for booleans) + @li NSNull + */ +- (NSString *)JSONFragment; + +/** + @brief Returns a string containing the receiver encoded in JSON. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + */ +- (NSString *)JSONRepresentation; + +@end + diff --git a/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSString+SBJSON.h b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSString+SBJSON.h new file mode 100644 index 00000000..69cfa4fd --- /dev/null +++ b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/NSString+SBJSON.h @@ -0,0 +1,41 @@ +/* +Copyright (C) 2007 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +/// Adds JSON parsing to NSString +@interface NSString (NSString_SBJSON) + +/// Returns the object represented in the receiver, or nil on error. +- (id)JSONFragmentValue; + +/// Returns the dictionary or array represented in the receiver, or nil on error. +- (id)JSONValue; + +@end diff --git a/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/SBJSON.h b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/SBJSON.h new file mode 100644 index 00000000..c931d464 --- /dev/null +++ b/iphone/Frameworks/JSON/macosx.sdk/usr/local/include/JSON/SBJSON.h @@ -0,0 +1,137 @@ +/* +Copyright (C) 2008 Stig Brautaset. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#import + +extern NSString * SBJSONErrorDomain; + +enum { + EUNSUPPORTED = 1, + EPARSENUM, + EPARSE, + EFRAGMENT, + ECTRL, + EUNICODE, + EDEPTH, + EESCAPE, + ETRAILCOMMA, + ETRAILGARBAGE, + EEOF, + EINPUT +}; + +/** +@brief A strict JSON parser and generator + +This is the parser and generator underlying the categories added to +NSString and various other objects. + +Objective-C types are mapped to JSON types and back in the following way: + +@li NSNull -> Null -> NSNull +@li NSString -> String -> NSMutableString +@li NSArray -> Array -> NSMutableArray +@li NSDictionary -> Object -> NSMutableDictionary +@li NSNumber (-initWithBool:) -> Boolean -> NSNumber -initWithBool: +@li NSNumber -> Number -> NSDecimalNumber + +In JSON the keys of an object must be strings. NSDictionary keys need +not be, but attempting to convert an NSDictionary with non-string keys +into JSON will throw an exception. + +NSNumber instances created with the +numberWithBool: method are +converted into the JSON boolean "true" and "false" values, and vice +versa. Any other NSNumber instances are converted to a JSON number the +way you would expect. JSON numbers turn into NSDecimalNumber instances, +as we can thus avoid any loss of precision. + +Strictly speaking correctly formed JSON text must have exactly +one top-level container. (Either an Array or an Object.) Scalars, +i.e. nulls, numbers, booleans and strings, are not valid JSON on their own. +It can be quite convenient to pretend that such fragments are valid +JSON however, and this class lets you do so. + +This class does its best to be as strict as possible, both in what it +accepts and what it generates. (Other than the above mentioned support +for JSON fragments.) For example, it does not support trailing commas +in arrays or objects. Nor does it support embedded comments, or +anything else not in the JSON specification. + +*/ +@interface SBJSON : NSObject { + BOOL humanReadable; + BOOL sortKeys; + NSUInteger maxDepth; + +@private + // Used temporarily during scanning/generation + NSUInteger depth; + const char *c; +} + +/// Whether we are generating human-readable (multiline) JSON +/** + Set whether or not to generate human-readable JSON. The default is NO, which produces + JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable + JSON with linebreaks after each array value and dictionary key/value pair, indented two + spaces per nesting level. + */ +@property BOOL humanReadable; + +/// Whether or not to sort the dictionary keys in the output +/** The default is to not sort the keys. */ +@property BOOL sortKeys; + +/// The maximum depth the parser will go to +/** Defaults to 512. */ +@property NSUInteger maxDepth; + +/// Return JSON representation of an array or dictionary +- (NSString*)stringWithObject:(id)value error:(NSError**)error; + +/// Return JSON representation of any legal JSON value +- (NSString*)stringWithFragment:(id)value error:(NSError**)error; + +/// Return the object represented by the given string +- (id)objectWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return the fragment represented by the given string +- (id)fragmentWithString:(NSString*)jsonrep error:(NSError**)error; + +/// Return JSON representation (or fragment) for the given object +- (NSString*)stringWithObject:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +/// Parse the string and return the represented object (or scalar) +- (id)objectWithString:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + +@end diff --git a/iphone/Frameworks/JSON/macosx.sdk/usr/local/lib/libjson.a b/iphone/Frameworks/JSON/macosx.sdk/usr/local/lib/libjson.a new file mode 100644 index 0000000000000000000000000000000000000000..3072d81a9bf3f88aabe655f75293593294ad02fb GIT binary patch literal 361768 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

h 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%0DSC_Jb>WdFc|y6+uI? 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 literal 0 HcmV?d00001 diff --git a/iphone/PhoneGap.plist b/iphone/PhoneGap.plist new file mode 100755 index 00000000..e6725021 --- /dev/null +++ b/iphone/PhoneGap.plist @@ -0,0 +1,41 @@ + + + + + Callback + http://localhost/iphone/ + Offline + + DetectPhoneNumber + + TopStatusBar + default + TopActivityIndicator + gray + EnableLocation + + EnableAcceleration + + AutoRotate + + StartOrientation + portrait + RotateOrientation + portrait + UIControls + + TabBarSettings + + height + 49 + position + bottom + + ToolBarSettings + + style + Default + + + + diff --git a/iphone/PhoneGap.xcodeproj/project.pbxproj b/iphone/PhoneGap.xcodeproj/project.pbxproj index 6b98b5d2..857cdb75 100755 --- a/iphone/PhoneGap.xcodeproj/project.pbxproj +++ b/iphone/PhoneGap.xcodeproj/project.pbxproj @@ -12,13 +12,14 @@ 1B1B4FBE0F94571B00ECD4E6 /* PhoneGapCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B4FBD0F94571B00ECD4E6 /* PhoneGapCommand.m */; }; 1B1B53830F98070D00ECD4E6 /* Notification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B53820F98070D00ECD4E6 /* Notification.m */; }; 1B64D89A0F6C73C700D12F7F /* DebugConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B64D8990F6C73C700D12F7F /* DebugConsole.m */; }; + 1BB1F7D20F9E1BE2002A28DA /* Settings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1BB1F7D10F9E1BE2002A28DA /* Settings.plist */; }; 1D3623260D0F684500981E51 /* PhoneGapDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* PhoneGapDelegate.m */; }; 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 47DC5AEE0F4BDEDB00FB54CE /* beep.wav in Resources */ = {isa = PBXBuildFile; fileRef = 47DC5AED0F4BDEDB00FB54CE /* beep.wav */; }; - 47DC7FB30EFADF9E00D0B526 /* Settings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 47DC7FB20EFADF9E00D0B526 /* Settings.plist */; }; + 47DC7FB30EFADF9E00D0B526 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = 47DC7FB20EFADF9E00D0B526 /* PhoneGap.plist */; }; 47F565210F3AC95D001DFBDB /* Image.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F565200F3AC95D001DFBDB /* Image.m */; }; 47FAB6A90EF751E2005F55AB /* PhoneGapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAB6A80EF751E2005F55AB /* PhoneGapViewController.m */; }; 47FAB72A0EF7A663005F55AB /* Sound.m in Sources */ = {isa = PBXBuildFile; fileRef = 47FAB7290EF7A663005F55AB /* Sound.m */; }; @@ -46,6 +47,7 @@ 1B1B53820F98070D00ECD4E6 /* Notification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Notification.m; sourceTree = ""; }; 1B64D8980F6C73C700D12F7F /* DebugConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugConsole.h; sourceTree = ""; }; 1B64D8990F6C73C700D12F7F /* DebugConsole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugConsole.m; sourceTree = ""; }; + 1BB1F7D10F9E1BE2002A28DA /* Settings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Settings.plist; sourceTree = ""; }; 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* PhoneGapDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneGapDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* PhoneGapDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneGapDelegate.m; sourceTree = ""; }; @@ -55,7 +57,7 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../main.m; sourceTree = ""; }; 474A7F820EFAD6580020DD7F /* PhoneGap_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneGap_Prefix.pch; sourceTree = ""; }; 47DC5AED0F4BDEDB00FB54CE /* beep.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = beep.wav; sourceTree = ""; }; - 47DC7FB20EFADF9E00D0B526 /* Settings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Settings.plist; sourceTree = ""; }; + 47DC7FB20EFADF9E00D0B526 /* PhoneGap.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; 47F5651F0F3AC95D001DFBDB /* Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; 47F565200F3AC95D001DFBDB /* Image.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Image.m; sourceTree = ""; }; 47FAB6A70EF751E2005F55AB /* PhoneGapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneGapViewController.h; sourceTree = ""; }; @@ -199,7 +201,8 @@ AA13D3080F20286200B18061 /* Config */ = { isa = PBXGroup; children = ( - 47DC7FB20EFADF9E00D0B526 /* Settings.plist */, + 1BB1F7D10F9E1BE2002A28DA /* Settings.plist */, + 47DC7FB20EFADF9E00D0B526 /* PhoneGap.plist */, 8D1107310486CEB800E47090 /* Info.plist */, ); name = Config; @@ -251,9 +254,10 @@ 825DFB5E0E464E6C000D0A5D /* README.md in Resources */, 8204F3D30E5CB4DC00F2DAA1 /* icon.png in Resources */, 824041C10E942F0E002F3376 /* Default.png in Resources */, - 47DC7FB30EFADF9E00D0B526 /* Settings.plist in Resources */, + 47DC7FB30EFADF9E00D0B526 /* PhoneGap.plist in Resources */, AA13D3420F202D0400B18061 /* www in Resources */, 47DC5AEE0F4BDEDB00FB54CE /* beep.wav in Resources */, + 1BB1F7D20F9E1BE2002A28DA /* Settings.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -287,6 +291,7 @@ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ADDITIONAL_SDKS = "$(SRCROOT)/Frameworks/JSON/$(PLATFORM_NAME).sdk"; ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -298,6 +303,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = PhoneGap_Prefix.pch; INFOPLIST_FILE = Info.plist; + OTHER_LDFLAGS = ( + "-ObjC", + "-ljson", + ); PRODUCT_NAME = PhoneGap; }; name = Debug; @@ -305,6 +314,7 @@ 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ADDITIONAL_SDKS = "$(SRCROOT)/Frameworks/JSON/$(PLATFORM_NAME).sdk"; ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -340,6 +350,7 @@ B74E58190EC6C9AC00215614 /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { + ADDITIONAL_SDKS = "$(SRCROOT)/Frameworks/JSON/$(PLATFORM_NAME).sdk"; ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -351,6 +362,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Glass_Prefix.pch; INFOPLIST_FILE = Info.plist; + OTHER_LDFLAGS = ( + "-ObjC", + "-ljson", + ); PRODUCT_NAME = Glass; PROVISIONING_PROFILE = "B02DE0E6-FD92-4854-9B69-3C191831ABA5"; }; @@ -376,12 +391,17 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ADDITIONAL_SDKS = "$(SRCROOT)/Frameworks/JSON/$(PLATFORM_NAME).sdk"; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CODE_SIGN_IDENTITY = "iPhone Developer: Brant Vasilieff"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Brant Vasilieff"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + OTHER_LDFLAGS = ( + "-ObjC", + "-ljson", + ); PREBINDING = NO; PROVISIONING_PROFILE = "880150E2-809D-4BBE-B91E-244F2A6F59A0"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "880150E2-809D-4BBE-B91E-244F2A6F59A0"; diff --git a/iphone/Settings.plist b/iphone/Settings.plist old mode 100755 new mode 100644 index e6725021..d3fceafc --- a/iphone/Settings.plist +++ b/iphone/Settings.plist @@ -2,40 +2,7 @@ - Callback - http://localhost/iphone/ - Offline - - DetectPhoneNumber - - TopStatusBar - default - TopActivityIndicator - gray - EnableLocation - - EnableAcceleration - - AutoRotate - - StartOrientation - portrait - RotateOrientation - portrait - UIControls - - TabBarSettings - - height - 49 - position - bottom - - ToolBarSettings - - style - Default - - + version + 1 From e2011834662a11d07bc8ea9b8b2083225e507d79 Mon Sep 17 00:00:00 2001 From: Michael Nachbaur Date: Fri, 24 Apr 2009 08:10:48 -0700 Subject: [PATCH 10/10] Added UIControls.selectTabBarItem and its associated documentation --- iphone/Classes/UIControls.h | 1 + iphone/Classes/UIControls.m | 22 +- iphone/www/index.html | 17 +- iphone/www/phonegap.js | 2 +- javascripts/iphone/uicontrols.js | 6 +- javascripts/uicontrols.js | 8 + lib/android/phonegap-min.js | 2 +- lib/android/phonegap.js | 8 + lib/blackberry/phonegap-min.js | 2 +- lib/blackberry/phonegap.js | 8 + lib/iphone/phonegap-min.js | 2 +- lib/iphone/phonegap.js | 14 +- util/jsdoc-toolkit/out/jsdoc/files.html | 2 +- util/jsdoc-toolkit/out/jsdoc/index.html | 2 +- .../out/jsdoc/symbols/Acceleration.html | 2 +- .../jsdoc/symbols/AccelerationOptions.html | 2 +- .../out/jsdoc/symbols/Accelerometer.html | 2 +- .../out/jsdoc/symbols/Camera.html | 2 +- .../out/jsdoc/symbols/Contact.html | 2 +- .../out/jsdoc/symbols/DebugConsole.html | 2 +- .../out/jsdoc/symbols/Device.html | 2 +- .../out/jsdoc/symbols/Geolocation.html | 2 +- .../out/jsdoc/symbols/Media.html | 2 +- .../out/jsdoc/symbols/MediaError.html | 2 +- .../out/jsdoc/symbols/Orientation.html | 2 +- .../out/jsdoc/symbols/PhoneGap.html | 2 +- .../out/jsdoc/symbols/Position.html | 2 +- .../out/jsdoc/symbols/PositionError.html | 2 +- .../out/jsdoc/symbols/PositionOptions.html | 2 +- util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html | 2 +- .../out/jsdoc/symbols/Telephony.html | 2 +- .../out/jsdoc/symbols/UIControls.html | 56 +- .../out/jsdoc/symbols/_global_.html | 2 +- .../jsdoc/symbols/src/tmp_phonegap.js.html | 974 +++++++++--------- 34 files changed, 648 insertions(+), 514 deletions(-) diff --git a/iphone/Classes/UIControls.h b/iphone/Classes/UIControls.h index 6334a8a7..c31119e8 100644 --- a/iphone/Classes/UIControls.h +++ b/iphone/Classes/UIControls.h @@ -30,6 +30,7 @@ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; - (void)updateTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; +- (void)selectTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options; /* Tool Bar methods */ diff --git a/iphone/Classes/UIControls.m b/iphone/Classes/UIControls.m index d04e3744..41f8db56 100644 --- a/iphone/Classes/UIControls.m +++ b/iphone/Classes/UIControls.m @@ -209,7 +209,7 @@ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options { if (!tabBar) [self createTabBar:nil options:nil]; - + int i, count = [arguments count]; NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:count]; for (i = 0; i < count; i++) { @@ -225,6 +225,26 @@ - (void)showTabBarItems:(NSArray*)arguments withDict:(NSDictionary*)options [tabBar setItems:items animated:animateItems]; } +/** + * Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item. + * @brief manually select a tab bar item + * @param arguments the name of the tab bar item to select + * @see createTabBarItem + * @see showTabBarItems + */ +- (void)selectTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options +{ + if (!tabBar) + [self createTabBar:nil options:nil]; + + NSString *itemName = [arguments objectAtIndex:0]; + UITabBarItem *item = [tabBarItems objectForKey:itemName]; + if (item) + tabBar.selectedItem = item; + else + tabBar.selectedItem = nil; +} + /* * - Tool Buttons * - toolButton:Done diff --git a/iphone/www/index.html b/iphone/www/index.html index 56b29da4..8c857863 100755 --- a/iphone/www/index.html +++ b/iphone/www/index.html @@ -97,13 +97,24 @@ } }); - var more = 0; + var more = false; uicontrols.createTabBarItem("more", "More", "tabButton:More", { onSelect: function() { - navigator.notification.alert("More selected"); - uicontrols.updateTabBarItem("more", { badge: ++more }); + if (more) { + uicontrols.showTabBarItems("search", "downloads", "more"); + } else { + uicontrols.showTabBarItems("toprated", "recents", "history", "more"); + } + uicontrols.selectTabBarItem(null); + more = !more; } }); + + try { + uicontrols.createTabBarItem("search", "Search", "tabButton:Search"); + uicontrols.createTabBarItem("downloads", "Downloads", "tabButton:Downloads"); + } catch(e) { debug.log(e) } + uicontrols.showTabBar(); uicontrols.showTabBarItems("toprated", "recents", "history", "more"); diff --git a/iphone/www/phonegap.js b/iphone/www/phonegap.js index dd9b8cdd..71f49976 100644 --- a/iphone/www/phonegap.js +++ b/iphone/www/phonegap.js @@ -1 +1 @@ -if(typeof(DeviceInfo)!="object"){DeviceInfo={}}PhoneGap={queue:{ready:true,commands:[],timer:null},_constructors:[]};PhoneGap.available=DeviceInfo.uuid!=undefined;PhoneGap.addConstructor=function(a){var b=document.readyState;if(b!="loaded"&&b!="complete"){PhoneGap._constructors.push(a)}else{a()}};(function(){var a=setInterval(function(){var c=document.readyState;if(c!="loaded"&&c!="complete"){return}clearInterval(a);while(PhoneGap._constructors.length>0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.selectTabBarItem=function(a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});function Acceleration(a,c,b){this.x=a;this.y=c;this.z=b;this.timestamp=new Date().getTime()}function AccelerationOptions(){this.timeout=10000}function Accelerometer(){this.lastAcceleration=null}Accelerometer.prototype.getCurrentAcceleration=function(a,b,c){if(typeof a=="function"){var d=new Acceleration(_accel.x,_accel.y,_accel.z);Accelerometer.lastAcceleration=d;a(d)}};Accelerometer.prototype.watchAcceleration=function(a,b,c){this.getCurrentAcceleration(a,b,c);var d=(c!=undefined)?c.frequency:10000;return setInterval(function(){navigator.accelerometer.getCurrentAcceleration(a,b,c)},d)};Accelerometer.prototype.clearWatch=function(a){clearInterval(a)};PhoneGap.addConstructor(function(){if(typeof navigator.accelerometer=="undefined"){navigator.accelerometer=new Accelerometer()}});function Media(a){this.src=a}Media.prototype.play=function(){};Media.prototype.pause=function(){};Media.prototype.stop=function(){};function MediaError(){this.code=null,this.message=""}MediaError.MEDIA_ERR_ABORTED=1;MediaError.MEDIA_ERR_NETWORK=2;MediaError.MEDIA_ERR_DECODE=3;MediaError.MEDIA_ERR_NONE_SUPPORTED=4;function Camera(){}Camera.prototype.getPicture=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.camera=="undefined"){navigator.camera=new Camera()}});function Contact(){this.name="";this.phone="";this.address=""}Contact.prototype.get=function(a,b,c){};function ContactManager(){this.contacts=[];this.timestap=new Date().getTime()}ContactManager.prototype.get=function(a,b,c){};PhoneGap.addConstructor(function(){if(typeof navigator.ContactManager=="undefined"){navigator.ContactManager=new ContactManager()}});function UIControls(){this.tabBarTag=0;this.tabBarCallbacks={}}UIControls.prototype.createTabBar=function(){};UIControls.prototype.showTabBar=function(a){};UIControls.prototype.hideTabBar=function(a){};UIControls.prototype.createTabBarItem=function(c,b,d,a){};UIControls.prototype.updateTabBarItem=function(b,a){};UIControls.prototype.showTabBarItems=function(b,a){};UIControls.prototype.selectTabBarItem=function(a){};UIControls.prototype.tabBarItemSelected=function(a){if(typeof(this.tabBarCallbacks[a])=="function"){this.tabBarCallbacks[a]()}};UIControls.prototype.createToolBar=function(){};UIControls.prototype.setToolBarTitle=function(a){};PhoneGap.addConstructor(function(){window.uicontrols=new UIControls()});function DebugConsole(){}DebugConsole.prototype.processMessage=function(b){if(typeof(b)!="object"){return encodeURIComponent(b)}else{function a(d){return d.replace(/^/mg," ")}function c(g){var h="";for(var d in g){try{if(typeof(g[d])=="object"){h+=d+":\n"+a(c(g[d]))+"\n"}else{h+=d+" = "+a(String(g[d])).replace(/^ /,"")+"\n"}}catch(f){h+=d+" = EXCEPTION: "+f.message+"\n"}}return h}return encodeURIComponent("Object:\n"+c(b))}};DebugConsole.prototype.log=function(a){};DebugConsole.prototype.warn=function(a){};DebugConsole.prototype.error=function(a){};PhoneGap.addConstructor(function(){window.debug=new DebugConsole()});function File(){this.data="";this.name=""}File.prototype.read=function(c,a,b){};File.prototype.write=function(a){};PhoneGap.addConstructor(function(){if(typeof navigator.file=="undefined"){navigator.file=new File()}});File.prototype.read=function(c,a,b){document.cookie='bb_command={command:8,args:{name:"'+c+'"}}';navigator.file.successCallback=a;navigator.file.errorCallback=b;navigator.file.readTimeout=window.setInterval("navigator.file._readReady()",1000)};File.prototype._readReady=function(){var cookies=document.cookie.split(";");for(var i=0;i0){successCallback(file)}}}}};File.prototype.write=function(b,a){document.cookie='bb_command={command:9,args:{name:"'+b+'",data:"'+a+'"}}'};function Geolocation(){this.lastPosition=null;this.lastError=null;this.callbacks={onLocationChanged:[],onError:[]}}Geolocation.prototype.getCurrentPosition=function(c,f,i){var g=0;if(this.lastPosition){g=this.lastPosition.timeout}else{this.start(i)}var h=20000;var b=500;if(typeof(i)=="object"&&i.interval){b=i.interval}if(typeof(c)!="function"){c=function(){}}if(typeof(f)!="function"){f=function(){}}var d=this;var e=0;var a=setInterval(function(){e+=b;if(typeof(d.lastPosition)=="object"&&d.lastPosition.timestamp>g){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;b0){var b=PhoneGap._constructors.shift();try{b()}catch(d){if(typeof(debug.log)=="function"){debug.log("Failed to run constructor: "+d.message)}else{alert("Failed to run constructor: "+d.message)}}}},1)})();PhoneGap.exec=function(){PhoneGap.queue.commands.push(arguments);if(PhoneGap.queue.timer==null){PhoneGap.queue.timer=setInterval(PhoneGap.run_command,10)}};PhoneGap.run_command=function(){};function Device(){this.available=PhoneGap.available;this.model=null;this.version=null;this.gap=null;this.uuid=null;try{if(window.DroidGap!=undefined&&window.DroidGap.exists()){this.available=true;this.isAndroid=true;this.uuid=window.DroidGap.getUuid();this.gapVersion=window.DroidGap.getVersion()}else{this.model=DeviceInfo.platform;this.version=DeviceInfo.version;this.gap=DeviceInfo.gap;this.uuid=DeviceInfo.uuid}}catch(a){this.available=false}}PhoneGap.addConstructor(function(){navigator.device=window.device=new Device()});PhoneGap.run_command=function(){if(!PhoneGap.available){return}PhoneGap.queue.ready=false;var d=PhoneGap.queue.commands.shift();if(PhoneGap.queue.commands.length==0){clearInterval(PhoneGap.queue.timer);PhoneGap.queue.timer=null}var f=[];var g=null;for(var e=1;eg){c(d.lastPosition);clearInterval(a)}else{if(e>=h){f();clearInterval(a)}}},b)};Geolocation.prototype.watchPosition=function(a,b,c){this.getCurrentPosition(a,b,c);var e=10000;if(typeof(c)=="object"&&c.frequency){e=c.frequency}var d=this;return setInterval(function(){d.getCurrentPosition(a,b,c)},e)};Geolocation.prototype.clearWatch=function(a){clearInterval(a)};Geolocation.prototype.setLocation=function(a){this.lastPosition=a;for(var b=0;btmp/phonegap.js

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/index.html b/util/jsdoc-toolkit/out/jsdoc/index.html index 6afbe15a..8f447739 100644 --- a/util/jsdoc-toolkit/out/jsdoc/index.html +++ b/util/jsdoc-toolkit/out/jsdoc/index.html @@ -348,7 +348,7 @@

UIControls

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
\ No newline at end of file diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html index b0cd3035..0721ed4b 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Acceleration.html @@ -502,7 +502,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html index 7f654d7d..d8ef10de 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/AccelerationOptions.html @@ -385,7 +385,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html index 8b2b97ea..f3191203 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Accelerometer.html @@ -571,7 +571,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html index 3ae8b900..779111b0 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Camera.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html index 1d4185f5..17c9a01f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Contact.html @@ -408,7 +408,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html index 4fd3719e..81fbb322 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/DebugConsole.html @@ -486,7 +486,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html index ed2b4b34..7dd0dc85 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Device.html @@ -330,7 +330,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html index d5fa4096..89aad77f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Geolocation.html @@ -661,7 +661,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html index c5c7f378..eef38596 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Media.html @@ -464,7 +464,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html index 2424f0e3..89a2a4f5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/MediaError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html index c6c1ba37..ba19efe6 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Orientation.html @@ -557,7 +557,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html index 6cd71d10..d1340035 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PhoneGap.html @@ -510,7 +510,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html index ccb02af2..8b5addc3 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Position.html @@ -654,7 +654,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html index f812fae5..db1104a7 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionError.html @@ -328,7 +328,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html index 10142994..075f9686 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/PositionOptions.html @@ -417,7 +417,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html index ce52a6fb..f544adf5 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Sms.html @@ -420,7 +420,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html index 85eb98be..627eaa54 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/Telephony.html @@ -396,7 +396,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html index a87fe9f0..192e0e53 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/UIControls.html @@ -328,6 +328,15 @@

+ +   + +
selectTabBarItem(tabName) +
+
Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item.
+ + +   @@ -578,6 +587,51 @@

+
+ + +
+ + + selectTabBarItem(tabName) + +
+
+ Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item. + + +
+ + + + +
+
Parameters:
+ +
+ {String} tabName + +
+
the name of the tab to select, or null if all tabs should be deselected
+ +
+ + + + + + + +
+
See:
+ +
createTabBarItem
+ +
showTabBarItems
+ +
+ +
@@ -797,7 +851,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:58 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html index f6df7290..8ddc820f 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -616,7 +616,7 @@

- Documentation generated by JsDoc Toolkit 2.1.0 on Sun Apr 19 2009 21:34:57 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.1.0 on Fri Apr 24 2009 08:08:15 GMT-0700 (PDT)
diff --git a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html index 2b76dec6..0f2ed855 100644 --- a/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html +++ b/util/jsdoc-toolkit/out/jsdoc/symbols/src/tmp_phonegap.js.html @@ -391,525 +391,533 @@ 384 UIControls.prototype.showTabBarItems = function(tabs, options) {}; 385 386 /** -387 * Function called when a tab bar item has been selected. -388 * @param {Number} tag the tag number for the item that has been selected -389 */ -390 UIControls.prototype.tabBarItemSelected = function(tag) { -391 if (typeof(this.tabBarCallbacks[tag]) == 'function') -392 this.tabBarCallbacks[tag](); -393 }; -394 -395 /** -396 * Create a toolbar. +387 * Manually select an individual tab bar item, or nil for deselecting a currently selected tab bar item. +388 * @param {String} tabName the name of the tab to select, or null if all tabs should be deselected +389 * @see createTabBarItem +390 * @see showTabBarItems +391 */ +392 UIControls.prototype.selectTabBarItem = function(tab) {}; +393 +394 /** +395 * Function called when a tab bar item has been selected. +396 * @param {Number} tag the tag number for the item that has been selected 397 */ -398 UIControls.prototype.createToolBar = function() {}; -399 -400 /** -401 * Function called when a tab bar item has been selected. -402 * @param {String} title the title to set within the toolbar -403 */ -404 UIControls.prototype.setToolBarTitle = function(title) {}; -405 -406 PhoneGap.addConstructor(function() { -407 window.uicontrols = new UIControls(); -408 }); -409 -410 -411 -412 /** -413 * This class provides access to the debugging console. -414 * @constructor -415 */ -416 function DebugConsole() { -417 } -418 -419 /** -420 * Utility function for rendering and indenting strings, or serializing -421 * objects to a string capable of being printed to the console. -422 * @param {Object|String} message The string or object to convert to an indented string -423 * @private -424 */ -425 DebugConsole.prototype.processMessage = function(message) { -426 if (typeof(message) != 'object') { -427 return encodeURIComponent(message); -428 } else { -429 /** -430 * @function -431 * @ignore -432 */ -433 function indent(str) { -434 return str.replace(/^/mg, " "); -435 } -436 /** -437 * @function -438 * @ignore -439 */ -440 function makeStructured(obj) { -441 var str = ""; -442 for (var i in obj) { -443 try { -444 if (typeof(obj[i]) == 'object') { -445 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; -446 } else { -447 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; -448 } -449 } catch(e) { -450 str += i + " = EXCEPTION: " + e.message + "\n"; -451 } -452 } -453 return str; -454 } -455 return encodeURIComponent("Object:\n" + makeStructured(message)); -456 } -457 }; -458 -459 /** -460 * Print a normal log message to the console -461 * @param {Object|String} message Message or object to print to the console -462 */ -463 DebugConsole.prototype.log = function(message) { -464 }; -465 -466 /** -467 * Print a warning message to the console -468 * @param {Object|String} message Message or object to print to the console -469 */ -470 DebugConsole.prototype.warn = function(message) { -471 }; -472 -473 /** -474 * Print an error message to the console -475 * @param {Object|String} message Message or object to print to the console -476 */ -477 DebugConsole.prototype.error = function(message) { -478 }; -479 -480 PhoneGap.addConstructor(function() { -481 window.debug = new DebugConsole(); -482 }); -483 -484 -485 -486 /** -487 * This class provides generic read and write access to the mobile device file system. -488 */ -489 function File() { -490 /** -491 * The data of a file. -492 */ -493 this.data = ""; -494 /** -495 * The name of the file. -496 */ -497 this.name = ""; -498 } -499 -500 /** -501 * Reads a file from the mobile device. This function is asyncronous. -502 * @param {String} fileName The name (including the path) to the file on the mobile device. -503 * The file name will likely be device dependant. -504 * @param {Function} successCallback The function to call when the file is successfully read. -505 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. -506 */ -507 File.prototype.read = function(fileName, successCallback, errorCallback) { -508 -509 } -510 -511 /** -512 * Writes a file to the mobile device. -513 * @param {File} file The file to write to the device. +398 UIControls.prototype.tabBarItemSelected = function(tag) { +399 if (typeof(this.tabBarCallbacks[tag]) == 'function') +400 this.tabBarCallbacks[tag](); +401 }; +402 +403 /** +404 * Create a toolbar. +405 */ +406 UIControls.prototype.createToolBar = function() {}; +407 +408 /** +409 * Function called when a tab bar item has been selected. +410 * @param {String} title the title to set within the toolbar +411 */ +412 UIControls.prototype.setToolBarTitle = function(title) {}; +413 +414 PhoneGap.addConstructor(function() { +415 window.uicontrols = new UIControls(); +416 }); +417 +418 +419 +420 /** +421 * This class provides access to the debugging console. +422 * @constructor +423 */ +424 function DebugConsole() { +425 } +426 +427 /** +428 * Utility function for rendering and indenting strings, or serializing +429 * objects to a string capable of being printed to the console. +430 * @param {Object|String} message The string or object to convert to an indented string +431 * @private +432 */ +433 DebugConsole.prototype.processMessage = function(message) { +434 if (typeof(message) != 'object') { +435 return encodeURIComponent(message); +436 } else { +437 /** +438 * @function +439 * @ignore +440 */ +441 function indent(str) { +442 return str.replace(/^/mg, " "); +443 } +444 /** +445 * @function +446 * @ignore +447 */ +448 function makeStructured(obj) { +449 var str = ""; +450 for (var i in obj) { +451 try { +452 if (typeof(obj[i]) == 'object') { +453 str += i + ":\n" + indent(makeStructured(obj[i])) + "\n"; +454 } else { +455 str += i + " = " + indent(String(obj[i])).replace(/^ /, "") + "\n"; +456 } +457 } catch(e) { +458 str += i + " = EXCEPTION: " + e.message + "\n"; +459 } +460 } +461 return str; +462 } +463 return encodeURIComponent("Object:\n" + makeStructured(message)); +464 } +465 }; +466 +467 /** +468 * Print a normal log message to the console +469 * @param {Object|String} message Message or object to print to the console +470 */ +471 DebugConsole.prototype.log = function(message) { +472 }; +473 +474 /** +475 * Print a warning message to the console +476 * @param {Object|String} message Message or object to print to the console +477 */ +478 DebugConsole.prototype.warn = function(message) { +479 }; +480 +481 /** +482 * Print an error message to the console +483 * @param {Object|String} message Message or object to print to the console +484 */ +485 DebugConsole.prototype.error = function(message) { +486 }; +487 +488 PhoneGap.addConstructor(function() { +489 window.debug = new DebugConsole(); +490 }); +491 +492 +493 +494 /** +495 * This class provides generic read and write access to the mobile device file system. +496 */ +497 function File() { +498 /** +499 * The data of a file. +500 */ +501 this.data = ""; +502 /** +503 * The name of the file. +504 */ +505 this.name = ""; +506 } +507 +508 /** +509 * Reads a file from the mobile device. This function is asyncronous. +510 * @param {String} fileName The name (including the path) to the file on the mobile device. +511 * The file name will likely be device dependant. +512 * @param {Function} successCallback The function to call when the file is successfully read. +513 * @param {Function} errorCallback The function to call when there is an error reading the file from the device. 514 */ -515 File.prototype.write = function(file) { +515 File.prototype.read = function(fileName, successCallback, errorCallback) { 516 517 } 518 -519 PhoneGap.addConstructor(function() { -520 if (typeof navigator.file == "undefined") navigator.file = new File(); -521 }); -522 -523 -524 -525 /** -526 * This class provides access to device GPS data. -527 * @constructor -528 */ -529 function Geolocation() { -530 /** -531 * The last known GPS position. -532 */ -533 this.lastPosition = null; -534 this.lastError = null; -535 this.callbacks = { -536 onLocationChanged: [], -537 onError: [] -538 }; -539 }; -540 -541 /** -542 * Asynchronously aquires the current position. -543 * @param {Function} successCallback The function to call when the position -544 * data is available -545 * @param {Function} errorCallback The function to call when there is an error -546 * getting the position data. -547 * @param {PositionOptions} options The options for getting the position data -548 * such as timeout. -549 */ -550 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { -551 var referenceTime = 0; -552 if (this.lastPosition) -553 referenceTime = this.lastPosition.timeout; -554 else -555 this.start(options); -556 -557 var timeout = 20000; -558 var interval = 500; -559 if (typeof(options) == 'object' && options.interval) -560 interval = options.interval; -561 -562 if (typeof(successCallback) != 'function') -563 successCallback = function() {}; -564 if (typeof(errorCallback) != 'function') -565 errorCallback = function() {}; -566 -567 var dis = this; -568 var delay = 0; -569 var timer = setInterval(function() { -570 delay += interval; -571 -572 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { -573 successCallback(dis.lastPosition); -574 clearInterval(timer); -575 } else if (delay >= timeout) { -576 errorCallback(); -577 clearInterval(timer); -578 } -579 }, interval); -580 }; -581 -582 /** -583 * Asynchronously aquires the position repeatedly at a given interval. -584 * @param {Function} successCallback The function to call each time the position -585 * data is available -586 * @param {Function} errorCallback The function to call when there is an error -587 * getting the position data. -588 * @param {PositionOptions} options The options for getting the position data -589 * such as timeout and the frequency of the watch. -590 */ -591 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { -592 // Invoke the appropriate callback with a new Position object every time the implementation -593 // determines that the position of the hosting device has changed. -594 -595 this.getCurrentPosition(successCallback, errorCallback, options); -596 var frequency = 10000; -597 if (typeof(options) == 'object' && options.frequency) -598 frequency = options.frequency; -599 -600 var that = this; -601 return setInterval(function() { -602 that.getCurrentPosition(successCallback, errorCallback, options); -603 }, frequency); -604 }; -605 -606 -607 /** -608 * Clears the specified position watch. -609 * @param {String} watchId The ID of the watch returned from #watchPosition. -610 */ -611 Geolocation.prototype.clearWatch = function(watchId) { -612 clearInterval(watchId); -613 }; -614 +519 /** +520 * Writes a file to the mobile device. +521 * @param {File} file The file to write to the device. +522 */ +523 File.prototype.write = function(file) { +524 +525 } +526 +527 PhoneGap.addConstructor(function() { +528 if (typeof navigator.file == "undefined") navigator.file = new File(); +529 }); +530 +531 +532 +533 /** +534 * This class provides access to device GPS data. +535 * @constructor +536 */ +537 function Geolocation() { +538 /** +539 * The last known GPS position. +540 */ +541 this.lastPosition = null; +542 this.lastError = null; +543 this.callbacks = { +544 onLocationChanged: [], +545 onError: [] +546 }; +547 }; +548 +549 /** +550 * Asynchronously aquires the current position. +551 * @param {Function} successCallback The function to call when the position +552 * data is available +553 * @param {Function} errorCallback The function to call when there is an error +554 * getting the position data. +555 * @param {PositionOptions} options The options for getting the position data +556 * such as timeout. +557 */ +558 Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { +559 var referenceTime = 0; +560 if (this.lastPosition) +561 referenceTime = this.lastPosition.timeout; +562 else +563 this.start(options); +564 +565 var timeout = 20000; +566 var interval = 500; +567 if (typeof(options) == 'object' && options.interval) +568 interval = options.interval; +569 +570 if (typeof(successCallback) != 'function') +571 successCallback = function() {}; +572 if (typeof(errorCallback) != 'function') +573 errorCallback = function() {}; +574 +575 var dis = this; +576 var delay = 0; +577 var timer = setInterval(function() { +578 delay += interval; +579 +580 if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) { +581 successCallback(dis.lastPosition); +582 clearInterval(timer); +583 } else if (delay >= timeout) { +584 errorCallback(); +585 clearInterval(timer); +586 } +587 }, interval); +588 }; +589 +590 /** +591 * Asynchronously aquires the position repeatedly at a given interval. +592 * @param {Function} successCallback The function to call each time the position +593 * data is available +594 * @param {Function} errorCallback The function to call when there is an error +595 * getting the position data. +596 * @param {PositionOptions} options The options for getting the position data +597 * such as timeout and the frequency of the watch. +598 */ +599 Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { +600 // Invoke the appropriate callback with a new Position object every time the implementation +601 // determines that the position of the hosting device has changed. +602 +603 this.getCurrentPosition(successCallback, errorCallback, options); +604 var frequency = 10000; +605 if (typeof(options) == 'object' && options.frequency) +606 frequency = options.frequency; +607 +608 var that = this; +609 return setInterval(function() { +610 that.getCurrentPosition(successCallback, errorCallback, options); +611 }, frequency); +612 }; +613 +614 615 /** -616 * Called by the geolocation framework when the current location is found. -617 * @param {PositionOptions} position The current position. +616 * Clears the specified position watch. +617 * @param {String} watchId The ID of the watch returned from #watchPosition. 618 */ -619 Geolocation.prototype.setLocation = function(position) { -620 this.lastPosition = position; -621 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { -622 var f = this.callbacks.onLocationChanged.shift(); -623 f(position); -624 } -625 }; -626 -627 /** -628 * Called by the geolocation framework when an error occurs while looking up the current position. -629 * @param {String} message The text of the error message. -630 */ -631 Geolocation.prototype.setError = function(message) { -632 this.lastError = message; -633 for (var i = 0; i < this.callbacks.onError.length; i++) { -634 var f = this.callbacks.onError.shift(); -635 f(message); -636 } -637 }; -638 -639 PhoneGap.addConstructor(function() { -640 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); -641 }); -642 -643 -644 -645 /** -646 * This class provides access to native mapping applications on the device. -647 */ -648 function Map() { -649 -650 } -651 -652 /** -653 * Shows a native map on the device with pins at the given positions. -654 * @param {Array} positions +619 Geolocation.prototype.clearWatch = function(watchId) { +620 clearInterval(watchId); +621 }; +622 +623 /** +624 * Called by the geolocation framework when the current location is found. +625 * @param {PositionOptions} position The current position. +626 */ +627 Geolocation.prototype.setLocation = function(position) { +628 this.lastPosition = position; +629 for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) { +630 var f = this.callbacks.onLocationChanged.shift(); +631 f(position); +632 } +633 }; +634 +635 /** +636 * Called by the geolocation framework when an error occurs while looking up the current position. +637 * @param {String} message The text of the error message. +638 */ +639 Geolocation.prototype.setError = function(message) { +640 this.lastError = message; +641 for (var i = 0; i < this.callbacks.onError.length; i++) { +642 var f = this.callbacks.onError.shift(); +643 f(message); +644 } +645 }; +646 +647 PhoneGap.addConstructor(function() { +648 if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation(); +649 }); +650 +651 +652 +653 /** +654 * This class provides access to native mapping applications on the device. 655 */ -656 Map.prototype.show = function(positions) { +656 function Map() { 657 658 } 659 -660 PhoneGap.addConstructor(function() { -661 if (typeof navigator.map == "undefined") navigator.map = new Map(); -662 }); -663 -664 -665 -666 /** -667 * This class provides access to notifications on the device. -668 */ -669 function Notification() { -670 -671 } -672 -673 /** -674 * Open a native alert dialog, with a customizable title and button text. -675 * @param {String} message Message to print in the body of the alert -676 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) -677 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) -678 */ -679 Notification.prototype.alert = function(message, title, buttonLabel) { -680 // Default is to use a browser alert; this will use "index.html" as the title though -681 alert(message); -682 }; -683 -684 /** -685 * Start spinning the activity indicator on the statusbar +660 /** +661 * Shows a native map on the device with pins at the given positions. +662 * @param {Array} positions +663 */ +664 Map.prototype.show = function(positions) { +665 +666 } +667 +668 PhoneGap.addConstructor(function() { +669 if (typeof navigator.map == "undefined") navigator.map = new Map(); +670 }); +671 +672 +673 +674 /** +675 * This class provides access to notifications on the device. +676 */ +677 function Notification() { +678 +679 } +680 +681 /** +682 * Open a native alert dialog, with a customizable title and button text. +683 * @param {String} message Message to print in the body of the alert +684 * @param {String} [title="Alert"] Title of the alert dialog (default: Alert) +685 * @param {String} [buttonLabel="OK"] Label of the close button (default: OK) 686 */ -687 Notification.prototype.activityStart = function() { -688 }; -689 -690 /** -691 * Stop spinning the activity indicator on the statusbar, if it's currently spinning -692 */ -693 Notification.prototype.activityStop = function() { -694 }; -695 -696 /** -697 * Causes the device to blink a status LED. -698 * @param {Integer} count The number of blinks. -699 * @param {String} colour The colour of the light. +687 Notification.prototype.alert = function(message, title, buttonLabel) { +688 // Default is to use a browser alert; this will use "index.html" as the title though +689 alert(message); +690 }; +691 +692 /** +693 * Start spinning the activity indicator on the statusbar +694 */ +695 Notification.prototype.activityStart = function() { +696 }; +697 +698 /** +699 * Stop spinning the activity indicator on the statusbar, if it's currently spinning 700 */ -701 Notification.prototype.blink = function(count, colour) { -702 -703 }; -704 -705 /** -706 * Causes the device to vibrate. -707 * @param {Integer} mills The number of milliseconds to vibrate for. +701 Notification.prototype.activityStop = function() { +702 }; +703 +704 /** +705 * Causes the device to blink a status LED. +706 * @param {Integer} count The number of blinks. +707 * @param {String} colour The colour of the light. 708 */ -709 Notification.prototype.vibrate = function(mills) { +709 Notification.prototype.blink = function(count, colour) { 710 711 }; 712 713 /** -714 * Causes the device to beep. -715 * @param {Integer} count The number of beeps. -716 * @param {Integer} volume The volume of the beep. -717 */ -718 Notification.prototype.beep = function(count, volume) { -719 -720 }; -721 -722 // TODO: of course on Blackberry and Android there notifications in the UI as well -723 -724 PhoneGap.addConstructor(function() { -725 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); -726 }); -727 -728 -729 -730 /** -731 * This class provides access to the device orientation. -732 * @constructor -733 */ -734 function Orientation() { -735 /** -736 * The last known orientation. -737 */ -738 this.lastOrientation = null; -739 } -740 -741 /** -742 * Asynchronously aquires the current orientation. -743 * @param {Function} successCallback The function to call when the orientation -744 * is known. -745 * @param {Function} errorCallback The function to call when there is an error -746 * getting the orientation. -747 */ -748 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { -749 // If the position is available then call success -750 // If the position is not available then call error -751 } -752 -753 /** -754 * Asynchronously aquires the orientation repeatedly at a given interval. -755 * @param {Function} successCallback The function to call each time the orientation -756 * data is available. -757 * @param {Function} errorCallback The function to call when there is an error -758 * getting the orientation data. -759 */ -760 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { -761 // Invoke the appropriate callback with a new Position object every time the implementation -762 // determines that the position of the hosting device has changed. -763 this.getCurrentPosition(successCallback, errorCallback); -764 return setInterval(function() { -765 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); -766 }, 10000); -767 } -768 -769 /** -770 * Clears the specified orientation watch. -771 * @param {String} watchId The ID of the watch returned from #watchOrientation. -772 */ -773 Orientation.prototype.clearWatch = function(watchId) { -774 clearInterval(watchId); +714 * Causes the device to vibrate. +715 * @param {Integer} mills The number of milliseconds to vibrate for. +716 */ +717 Notification.prototype.vibrate = function(mills) { +718 +719 }; +720 +721 /** +722 * Causes the device to beep. +723 * @param {Integer} count The number of beeps. +724 * @param {Integer} volume The volume of the beep. +725 */ +726 Notification.prototype.beep = function(count, volume) { +727 +728 }; +729 +730 // TODO: of course on Blackberry and Android there notifications in the UI as well +731 +732 PhoneGap.addConstructor(function() { +733 if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +734 }); +735 +736 +737 +738 /** +739 * This class provides access to the device orientation. +740 * @constructor +741 */ +742 function Orientation() { +743 /** +744 * The last known orientation. +745 */ +746 this.lastOrientation = null; +747 } +748 +749 /** +750 * Asynchronously aquires the current orientation. +751 * @param {Function} successCallback The function to call when the orientation +752 * is known. +753 * @param {Function} errorCallback The function to call when there is an error +754 * getting the orientation. +755 */ +756 Orientation.prototype.getCurrentOrientation = function(successCallback, errorCallback) { +757 // If the position is available then call success +758 // If the position is not available then call error +759 } +760 +761 /** +762 * Asynchronously aquires the orientation repeatedly at a given interval. +763 * @param {Function} successCallback The function to call each time the orientation +764 * data is available. +765 * @param {Function} errorCallback The function to call when there is an error +766 * getting the orientation data. +767 */ +768 Orientation.prototype.watchOrientation = function(successCallback, errorCallback) { +769 // Invoke the appropriate callback with a new Position object every time the implementation +770 // determines that the position of the hosting device has changed. +771 this.getCurrentPosition(successCallback, errorCallback); +772 return setInterval(function() { +773 navigator.orientation.getCurrentOrientation(successCallback, errorCallback); +774 }, 10000); 775 } 776 -777 PhoneGap.addConstructor(function() { -778 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); -779 }); -780 -781 -782 -783 /** -784 * This class contains position information. -785 * @param {Object} lat -786 * @param {Object} lng -787 * @param {Object} acc -788 * @param {Object} alt -789 * @param {Object} altacc -790 * @param {Object} head -791 * @param {Object} vel -792 * @constructor -793 */ -794 function Position(lat, lng, acc, alt, altacc, head, vel) { -795 /** -796 * The latitude of the position. -797 */ -798 this.latitude = lat; -799 /** -800 * The longitude of the position, -801 */ -802 this.longitude = lng; +777 /** +778 * Clears the specified orientation watch. +779 * @param {String} watchId The ID of the watch returned from #watchOrientation. +780 */ +781 Orientation.prototype.clearWatch = function(watchId) { +782 clearInterval(watchId); +783 } +784 +785 PhoneGap.addConstructor(function() { +786 if (typeof navigator.orientation == "undefined") navigator.orientation = new Orientation(); +787 }); +788 +789 +790 +791 /** +792 * This class contains position information. +793 * @param {Object} lat +794 * @param {Object} lng +795 * @param {Object} acc +796 * @param {Object} alt +797 * @param {Object} altacc +798 * @param {Object} head +799 * @param {Object} vel +800 * @constructor +801 */ +802 function Position(lat, lng, acc, alt, altacc, head, vel) { 803 /** -804 * The accuracy of the position. +804 * The latitude of the position. 805 */ -806 this.accuracy = acc; +806 this.latitude = lat; 807 /** -808 * The altitude of the position. +808 * The longitude of the position, 809 */ -810 this.altitude = alt; +810 this.longitude = lng; 811 /** -812 * The altitude accuracy of the position. +812 * The accuracy of the position. 813 */ -814 this.altitudeAccuracy = altacc; +814 this.accuracy = acc; 815 /** -816 * The direction the device is moving at the position. +816 * The altitude of the position. 817 */ -818 this.heading = head; +818 this.altitude = alt; 819 /** -820 * The velocity with which the device is moving at the position. +820 * The altitude accuracy of the position. 821 */ -822 this.velocity = vel; +822 this.altitudeAccuracy = altacc; 823 /** -824 * The time that the position was obtained. +824 * The direction the device is moving at the position. 825 */ -826 this.timestamp = new Date().getTime(); -827 } -828 -829 /** -830 * This class specifies the options for requesting position data. -831 * @constructor -832 */ -833 function PositionOptions() { -834 /** -835 * Specifies the desired position accuracy. -836 */ -837 this.enableHighAccuracy = true; -838 /** -839 * The timeout after which if position data cannot be obtained the errorCallback -840 * is called. -841 */ -842 this.timeout = 10000; -843 } -844 -845 /** -846 * This class contains information about any GSP errors. -847 * @constructor -848 */ -849 function PositionError() { -850 this.code = null; -851 this.message = ""; -852 } -853 -854 PositionError.UNKNOWN_ERROR = 0; -855 PositionError.PERMISSION_DENIED = 1; -856 PositionError.POSITION_UNAVAILABLE = 2; -857 PositionError.TIMEOUT = 3; -858 -859 -860 -861 /** -862 * This class provides access to the device SMS functionality. -863 * @constructor -864 */ -865 function Sms() { +826 this.heading = head; +827 /** +828 * The velocity with which the device is moving at the position. +829 */ +830 this.velocity = vel; +831 /** +832 * The time that the position was obtained. +833 */ +834 this.timestamp = new Date().getTime(); +835 } +836 +837 /** +838 * This class specifies the options for requesting position data. +839 * @constructor +840 */ +841 function PositionOptions() { +842 /** +843 * Specifies the desired position accuracy. +844 */ +845 this.enableHighAccuracy = true; +846 /** +847 * The timeout after which if position data cannot be obtained the errorCallback +848 * is called. +849 */ +850 this.timeout = 10000; +851 } +852 +853 /** +854 * This class contains information about any GSP errors. +855 * @constructor +856 */ +857 function PositionError() { +858 this.code = null; +859 this.message = ""; +860 } +861 +862 PositionError.UNKNOWN_ERROR = 0; +863 PositionError.PERMISSION_DENIED = 1; +864 PositionError.POSITION_UNAVAILABLE = 2; +865 PositionError.TIMEOUT = 3; 866 -867 } -868 +867 +868 869 /** -870 * Sends an SMS message. -871 * @param {Integer} number The phone number to send the message to. -872 * @param {String} message The contents of the SMS message to send. -873 * @param {Function} successCallback The function to call when the SMS message is sent. -874 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. -875 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. -876 */ -877 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { -878 -879 } -880 -881 PhoneGap.addConstructor(function() { -882 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); -883 }); -884 -885 -886 -887 /** -888 * This class provides access to the telephony features of the device. -889 * @constructor -890 */ -891 function Telephony() { -892 -893 } -894 +870 * This class provides access to the device SMS functionality. +871 * @constructor +872 */ +873 function Sms() { +874 +875 } +876 +877 /** +878 * Sends an SMS message. +879 * @param {Integer} number The phone number to send the message to. +880 * @param {String} message The contents of the SMS message to send. +881 * @param {Function} successCallback The function to call when the SMS message is sent. +882 * @param {Function} errorCallback The function to call when there is an error sending the SMS message. +883 * @param {PositionOptions} options The options for accessing the GPS location such as timeout and accuracy. +884 */ +885 Sms.prototype.send = function(number, message, successCallback, errorCallback, options) { +886 +887 } +888 +889 PhoneGap.addConstructor(function() { +890 if (typeof navigator.sms == "undefined") navigator.sms = new Sms(); +891 }); +892 +893 +894 895 /** -896 * Calls the specifed number. -897 * @param {Integer} number The number to be called. +896 * This class provides access to the telephony features of the device. +897 * @constructor 898 */ -899 Telephony.prototype.call = function(number) { +899 function Telephony() { 900 901 } 902 -903 PhoneGap.addConstructor(function() { -904 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); -905 }); -906 -907 -908 \ No newline at end of file +903 /** +904 * Calls the specifed number. +905 * @param {Integer} number The number to be called. +906 */ +907 Telephony.prototype.call = function(number) { +908 +909 } +910 +911 PhoneGap.addConstructor(function() { +912 if (typeof navigator.telephony == "undefined") navigator.telephony = new Telephony(); +913 }); +914 +915 +916 \ No newline at end of file