diff --git a/BCL.csproj b/BCL.csproj
index 9620dbb86..b9210b2c8 100644
--- a/BCL.csproj
+++ b/BCL.csproj
@@ -241,6 +241,14 @@
+
+ dialogs.d.ts
+
+
+
+ dialogs.d.ts
+
+
@@ -259,6 +267,9 @@
+
+
+
commonjs
True
@@ -351,7 +362,15 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/Tests/application-tests-common.ts b/Tests/application-tests-common.ts
index 1220938ee..9855c0253 100644
--- a/Tests/application-tests-common.ts
+++ b/Tests/application-tests-common.ts
@@ -1,4 +1,4 @@
-//
+//
// # Application
// The Application module provides abstraction over the platform-specific Application implementations.
// It is the main BCL module and is required for other BCL modules to work properly.
@@ -9,7 +9,7 @@ import app = require("application");
// The pre-required `app` module is used throughout the following code snippets.
//
-//
+//
// ### Initialization
// ``` JavaScript
//// The native app instance depends on the target platform
@@ -18,7 +18,7 @@ app.init(nativeAppInstance);
// ```
//
-//
+//
// ### Checking the target platform
// Use the following code in case you need to check somewhere in your code the platform you are running against:
// ``` JavaScript
diff --git a/Tests/application-tests.android.ts b/Tests/application-tests.android.ts
index 15113d7f9..9e01f431c 100644
--- a/Tests/application-tests.android.ts
+++ b/Tests/application-tests.android.ts
@@ -6,7 +6,7 @@ import commonTests = require("Tests/application-tests-common");
declare var exports;
require("utils/module-merge").merge(commonTests, exports);
-//
+//
// ### Using the Android-specific implementation
// Accessing the Android-specific object instance (will be undefined if running on iOS)
// ``` JavaScript
diff --git a/Tests/file-system-tests.ts b/Tests/file-system-tests.ts
index f51f33afe..5b9f06f2a 100644
--- a/Tests/file-system-tests.ts
+++ b/Tests/file-system-tests.ts
@@ -1,5 +1,5 @@
-//
+//
// # File System
// Using the file system requires the FileSystem module.
// ``` JavaScript
@@ -10,12 +10,12 @@ import fs = require("file-system");
import TKUnit = require("Tests/TKUnit");
-//
+//
// ## Path
//
export var testPathNormalize = function () {
- //
+ //
// ### Normalize a Path
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -31,7 +31,7 @@ export var testPathNormalize = function () {
};
export var testPathJoin = function () {
- //
+ //
// ### Path Join
// Concatinate a path to a file by providing multiple path arguments.
// ``` JavaScript
@@ -47,7 +47,7 @@ export var testPathJoin = function () {
};
export var testPathSeparator = function () {
- //
+ //
// ### Get the Path Separator
// ``` JavaScript
//// An OS dependant path separator, "\" or "/".
@@ -61,7 +61,7 @@ export var testPathSeparator = function () {
};
export var testFileFromPath = function () {
- //
+ //
// ### Get or Create a File With Path
// The following example writes some text to a file created for path.
// It will create a new file or overwrite an existing file.
@@ -98,7 +98,7 @@ export var testFileFromPath = function () {
}
export var testFolderFromPath = function () {
- //
+ //
// ### Get or Create a Folder With Path
// ``` JavaScript
var path = fs.path.join(fs.knownFolders.documents().path, "music");
@@ -112,12 +112,12 @@ export var testFolderFromPath = function () {
//
}
-//
+//
// ## Create
//
export var testFileWrite = function () {
- //
+ //
// ### Writing a string to a File
// The following example writes some text to a file.
// It will create a new file or overwrite an existing file.
@@ -153,7 +153,7 @@ export var testFileWrite = function () {
};
export var testGetFile = function () {
- //
+ //
// ### Get or Create a File
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -168,7 +168,7 @@ export var testGetFile = function () {
}
export var testGetFolder = function () {
- //
+ //
// ### Get or Create a Folder
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -182,12 +182,12 @@ export var testGetFolder = function () {
//
};
-//
+//
// ## Read
//
export var testFileRead = function () {
- //
+ //
// ### Reading from a File
// The following example writes some text to a file and then reads it back.
// ``` JavaScript
@@ -230,7 +230,7 @@ export var testFileRead = function () {
};
export var testGetKnownFolders = function () {
- //
+ //
// ### Getting the Known Folders
// Each app has several well known folders. This is how to access them:
// ``` JavaScript
@@ -251,7 +251,7 @@ export var testGetKnownFolders = function () {
};
export var testGetEntities = function () {
- //
+ //
// ### Getting Folder Contents
// Getting all files and folders within a folder:
// ``` JavaScript
@@ -300,7 +300,7 @@ export var testGetEntities = function () {
};
export var testEnumEntities = function () {
- //
+ //
// ### Enumerating Folder Contents
// Getting all folder entities in array may be slow with large number of files.
// Enumerating the folder entities would itterate the files one by one without blocking the UI.
@@ -338,7 +338,7 @@ export var testEnumEntities = function () {
};
export var testGetParent = function () {
- //
+ //
// ### Getting Parent Folder
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -357,7 +357,7 @@ export var testGetParent = function () {
};
export var testFileNameExtension = function () {
- //
+ //
// ### Getting File Name and Extension
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -376,7 +376,7 @@ export var testFileNameExtension = function () {
};
export var testFileExists = function () {
- //
+ //
// ### Checking if a File Exists
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -393,7 +393,7 @@ export var testFileExists = function () {
};
export var testFolderExists = function () {
- //
+ //
// ### Checking if a Folder Exists
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -419,12 +419,12 @@ export var testContainsFile = function () {
file.remove();
};
-//
+//
// ## Update
//
export var testFileRename = function () {
- //
+ //
// ### Renaming a File
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -450,7 +450,7 @@ export var testFileRename = function () {
};
export var testFolderRename = function () {
- //
+ //
// ### Renaming a Folder
// ``` JavaScript
var folder = fs.knownFolders.documents();
@@ -475,12 +475,12 @@ export var testFolderRename = function () {
//
};
-//
+//
// ## Delete
//
export var testFileRemove = function () {
- //
+ //
// ### Removing a File
// To 'delete', 'remove' or 'unlink' a file use the file's remove method:
// ``` JavaScript
@@ -504,7 +504,7 @@ export var testFileRemove = function () {
};
export var testFolderRemove = function () {
- //
+ //
// ### Removing a Folder
// ``` JavaScript
var documents = fs.knownFolders.documents();
@@ -528,7 +528,7 @@ export var testFolderRemove = function () {
}
export var testFolderClear = function () {
- //
+ //
// ### Clearing the Contents of a Folder
// The clear method removes all files within a folder.
// ``` JavaScript
diff --git a/Tests/http-tests.ts b/Tests/http-tests.ts
index 82ffdf457..48da82a2e 100644
--- a/Tests/http-tests.ts
+++ b/Tests/http-tests.ts
@@ -2,7 +2,7 @@
import http = require("http");
require("globals");
-//
+//
// # Http module
// ``` JavaScript
// var http = require("http");
@@ -18,7 +18,7 @@ export var test_getString = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get string from URL
// ``` JavaScript
http.getString("http://httpbin.org/get").then(function (r) {
@@ -61,7 +61,7 @@ export var test_getJSON = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get JSON from URL
// ``` JavaScript
http.getJSON("http://httpbin.org/get").then(function (r) {
@@ -104,7 +104,7 @@ export var test_getImage = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get Image from URL
// ``` JavaScript
http.getImage("http://www.google.com/images/errors/logo_sm_2.png").then(function (r) {
@@ -161,7 +161,7 @@ export var test_request_responseStatusCodeShouldBeDefined = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get response status code
// ``` JavaScript
http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) {
@@ -187,7 +187,7 @@ export var test_request_responseHeadersShouldBeDefined = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get response headers
// ``` JavaScript
http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) {
@@ -215,7 +215,7 @@ export var test_request_responseContentShouldBeDefined = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Get response content
// ``` JavaScript
http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) {
diff --git a/Tests/image-source-tests.ts b/Tests/image-source-tests.ts
index afc5d080c..b85941b61 100644
--- a/Tests/image-source-tests.ts
+++ b/Tests/image-source-tests.ts
@@ -1,4 +1,4 @@
-//
+//
// # Image source
// Using the image source requires the image-source module.
// ``` JavaScript
@@ -18,7 +18,7 @@ import app = require("application");
import TKUnit = require("Tests/TKUnit");
export var testFromResource = function () {
- //
+ //
// ### Load image using resource name
// This is similar to loading Bitmap from `R.drawable.logo` on Android or calling `[UIImage imageNamed@"logo"]` on iOS
// ``` JavaScript
@@ -32,7 +32,7 @@ export var testFromUrl = function () {
var completed;
var result: imageSource.ImageSource;
- //
+ //
// ### Load image from URL
// ``` JavaScript
imageSource.fromUrl("http://www.google.com/images/errors/logo_sm_2.png")
@@ -62,7 +62,7 @@ export var testFromUrl = function () {
}
export var testSaveToFile = function () {
- //
+ //
// ### Save image source to PNG or JPG file
// ``` JavaScript
var img = imageSource.fromResource("logo");
@@ -76,7 +76,7 @@ export var testSaveToFile = function () {
}
export var testFromFile = function () {
- //
+ //
// ### Load image from a local file
// ``` JavaScript
var folder = fs.knownFolders.documents();
diff --git a/Tests/local-settings-tests.ts b/Tests/local-settings-tests.ts
index ed05dff78..50c93f268 100644
--- a/Tests/local-settings-tests.ts
+++ b/Tests/local-settings-tests.ts
@@ -1,4 +1,4 @@
-//
+//
// # Local Settings
// ``` JavaScript
var LocalSettings = require("local-settings");
@@ -13,7 +13,7 @@ var noStringKey: string = "noStringKey";
var noBoolKey: string = "noBoolKey";
var noNumberKey: string = "noNumberKey";
-//
+//
// ## Working with string, number and boolean values
//
@@ -22,7 +22,7 @@ export var testBoolean = function () {
var boolValue = LocalSettings.getBoolean(boolKey);
TKUnit.assert(false == boolValue, "Cannot set boolean to false, currently it is: " + LocalSettings.getBoolean(boolKey));
- //
+ //
// ### Set and get boolean value and provide default value in case it is not set
// ``` JavaScript
LocalSettings.setBoolean("boolKey", true);
@@ -35,7 +35,7 @@ export var testBoolean = function () {
};
export var testString = function () {
- //
+ //
// ### Set and get string value
// ``` JavaScript
LocalSettings.setString("stringKey", "String value");
@@ -46,7 +46,7 @@ export var testString = function () {
};
export var testNumber = function () {
- //
+ //
// ### Set and get numeric value.
// We use `toFixed()` here in order to avoid floating point errors - ex: `54.321` becoming `54.320999999537`.
// Beware the result of `toFixed()` is a string not a number therefore you cannot use `===` or `!==` when comparing with a number.
@@ -59,7 +59,7 @@ export var testNumber = function () {
};
export var testDefaults = function () {
- //
+ //
// ### Reading values that are not set before while providing default value
// ``` JavaScript
var defaultValue = LocalSettings.getString("noStringKey", "No string value");
@@ -70,7 +70,7 @@ export var testDefaults = function () {
TKUnit.assert(true === LocalSettings.getBoolean(noBoolKey, true), "Bad default boolean value");
TKUnit.assert(123.45 === LocalSettings.getNumber(noNumberKey, 123.45), "Bad default number value");
- //
+ //
// ### Reading values that are not set before not providing default value
// ``` JavaScript
var defaultValue = LocalSettings.getString("noStringKey");
@@ -83,12 +83,12 @@ export var testDefaults = function () {
TKUnit.assert("undefined" === typeof LocalSettings.getNumber(noNumberKey), "Default number value is not undefined");
};
-//
+//
// ## Other functions
//
export var testHasKey = function () {
- //
+ //
// ### Checking for existence of value for key
// ``` JavaScript
var hasKey = LocalSettings.hasKey("noBoolKey");
@@ -105,7 +105,7 @@ export var testHasKey = function () {
};
export var testRemove = function () {
- //
+ //
// ### Removing value for key
// ``` JavaScript
LocalSettings.remove("boolKey");
diff --git a/Tests/location-tests.ts b/Tests/location-tests.ts
index be0eaf4e1..922e70b61 100644
--- a/Tests/location-tests.ts
+++ b/Tests/location-tests.ts
@@ -1,4 +1,4 @@
-//
+//
// # Location
// Using the location requires the Location module.
// ``` JavaScript
@@ -12,12 +12,12 @@ import locationModule = require("location");
var LocationManager = locationModule.LocationManager;
var Location = locationModule.Location;
-//
+//
// ## Other functions
//
export var testIsEnabled = function () {
- //
+ //
// ### Test are location services available for this device
// ``` JavaScript
var isEnabled = LocationManager.isEnabled();
@@ -27,7 +27,7 @@ export var testIsEnabled = function () {
};
export var testDistance = function () {
- //
+ //
// ### Get distance between two locations
// ``` JavaScript
//var Location = require("location").Location;
@@ -43,14 +43,14 @@ export var testDistance = function () {
TKUnit.assert((distance > 10780000) && (distance < 10860000), "invalid distance " + distance);
};
-//
+//
// ## Getting location
//
export var testLocation = function () {
var locationReceived;
- //
+ //
// ### Receive continuous location updates
// ``` JavaScript
var locationManager = new LocationManager();
@@ -83,7 +83,7 @@ export var testLocation = function () {
export var testLastKnownLocation = function () {
TKUnit.waitUntilReady(function () { return false; }, 1); // give it some time after the last test
- //
+ //
// ### Get last known location
// ``` JavaScript
var locationManager = new LocationManager();
@@ -135,7 +135,7 @@ export var testLocationOnceTimeout10000 = function () {
export var testSnippet = function () {
var locationReceived;
- //
+ //
// ### Get location once
// if there is `options.timeout` you will receive error on timeout. If `options.timeout` is 0 then the result is the same as the result from `LocationManager.lastKnownLocation`
// and there will be no wait. You can use `options.maximumAge` to specify you don't want to receive locations older than specified time in ms.
diff --git a/Tests/timer-tests.ts b/Tests/timer-tests.ts
index 03b665e51..9bcf4c58b 100644
--- a/Tests/timer-tests.ts
+++ b/Tests/timer-tests.ts
@@ -1,7 +1,7 @@
import TKUnit = require("Tests/TKUnit");
var timer = require("timer/timer");
-//
+//
// # Timer module
// ``` JavaScript
// require("globals");
@@ -30,7 +30,7 @@ export var test_setTimeout = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Evaluates an expression after 0 milliseconds.
// ``` JavaScript
timer.setTimeout(function () {
@@ -49,7 +49,7 @@ export var test_setTimeout_callbackCalledAfterSpecifedTime = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Evaluates an expression after a specified number of milliseconds.
// ``` JavaScript
timer.setTimeout(function () {
@@ -85,7 +85,7 @@ export var test_setTimeout_callbackShouldBeCleared = function () {
var completed: boolean;
var isReady = function () { return completed; }
- //
+ //
// ### Cancels the evaluation with the clearTimeout method.
// ``` JavaScript
var id = timer.setTimeout(function () {
@@ -109,7 +109,7 @@ export var test_setInterval_callbackCalledDuringPeriod = function () {
var expected = 4;
var isReady = function () { return counter >= expected; }
- //
+ //
// ### Evaluates an expression each time a specified number of milliseconds has elapsed.
// ``` JavaScript
timer.setInterval(function () {
@@ -129,7 +129,7 @@ export var test_setInterval_callbackShouldBeCleared = function () {
var expected = 1;
var isReady = function () { return counter == expected; }
- //
+ //
// ### Cancel the interval previously started using the setInterval method.
// ``` JavaScript
var id = timer.setInterval(function () {
diff --git a/text/text.d.ts b/text/text.d.ts
index a5359343c..7f6c92774 100644
--- a/text/text.d.ts
+++ b/text/text.d.ts
@@ -2,7 +2,7 @@
* Defines the supported character encodings.
*/
declare module "text" {
- export module encoding {
+ module encoding {
export var ISO_8859_1: any;
export var US_ASCII: any;
export var UTF_16: any;
diff --git a/ui/dialogs/Readme.md b/ui/dialogs/Readme.md
new file mode 100644
index 000000000..19766516d
--- /dev/null
+++ b/ui/dialogs/Readme.md
@@ -0,0 +1,15 @@
+Dialogs module. Examples:
+```js
+ dialogs.alert("Test").then(function(){ dialogs.alert("Test2"); });
+ dialogs.alert({message:"Test", title: "MyAlert", buttonName: "Close" })
+ .then(function(){ dialogs.alert("Test2"); });
+
+ dialogs.confirm("Test?").then(function(r){ dialogs.alert("Result:" + r); });
+ dialogs.confirm({message:"Confirm?", title: "MyConfirm", okButtonName: "Do it!", cancelButtonName: "Ignore it!" })
+ .then(function(r){ dialogs.alert("Result:" + r); });
+
+ dialogs.prompt("Enter something!").then(function(r){ dialogs.alert("Result:" + r); });
+ dialogs.prompt({message:"Enter something?", title: "MyPrompt", okButtonName: "Do it!",
+ cancelButtonName: "Ignore it!", defaultText : "Enter your password here!" })
+ .then(function(r){ dialogs.alert("Result:" + r); });
+```
\ No newline at end of file
diff --git a/ui/dialogs/dialogs.android.ts b/ui/dialogs/dialogs.android.ts
new file mode 100644
index 000000000..b004531e4
--- /dev/null
+++ b/ui/dialogs/dialogs.android.ts
@@ -0,0 +1,101 @@
+/**
+ * Android specific dialogs functions implementation.
+ */
+import promises = require("promises");
+import dialogs = require("ui/dialogs");
+import appmodule = require("application");
+
+var STRING = "string",
+ ALERT = "Alert",
+ OK = "OK",
+ CANCEL = "Cancel";
+
+function createAlertDialog(options: dialogs.DialogOptions): android.app.AlertDialog.Builder {
+ var alert = new android.app.AlertDialog.Builder(appmodule.android.currentActivity);
+ alert.setTitle(options.title);
+ alert.setMessage(options.message);
+ return alert;
+}
+
+function addOkCancelButtonsToAlertDialog(alert: android.app.AlertDialog.Builder, options: dialogs.ConfirmOptions,
+ okCallback: Function, cancelCallback?: Function): void {
+ alert.setPositiveButton(options.okButtonName, new android.content.DialogInterface.OnClickListener({
+ onClick: function (dialog: android.content.DialogInterface, id: number) {
+ dialog.cancel();
+ okCallback();
+ }
+ }));
+
+ alert.setNegativeButton(options.cancelButtonName, new android.content.DialogInterface.OnClickListener({
+ onClick: function (dialog: android.content.DialogInterface, id: number) {
+ dialog.cancel();
+ if (cancelCallback) {
+ cancelCallback();
+ }
+ }
+ }));
+}
+
+export function alert(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, buttonName: OK } : arg
+
+ var alert = createAlertDialog(options);
+
+ alert.setPositiveButton(options.buttonName, new android.content.DialogInterface.OnClickListener({
+ onClick: function (dialog: android.content.DialogInterface, id: number) {
+ dialog.cancel();
+ d.resolve();
+ }
+ }));
+
+ alert.show();
+
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
+
+export function confirm(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg
+
+ var alert = createAlertDialog(options);
+
+ addOkCancelButtonsToAlertDialog(alert, options, function () { d.resolve(true); }, function () { d.resolve(false); });
+
+ alert.show();
+
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
+
+export function prompt(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg
+
+ var alert = createAlertDialog(options);
+
+ var input = new android.widget.EditText(appmodule.android.context);
+ input.setText(options.defaultText ? options.defaultText : "");
+
+ alert.setView(input);
+
+ addOkCancelButtonsToAlertDialog(alert, options, function () { d.resolve(input.getText().toString()); });
+
+ alert.show();
+
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
\ No newline at end of file
diff --git a/ui/dialogs/dialogs.d.ts b/ui/dialogs/dialogs.d.ts
new file mode 100644
index 000000000..f65fc56cc
--- /dev/null
+++ b/ui/dialogs/dialogs.d.ts
@@ -0,0 +1,88 @@
+declare module "ui/dialogs" {
+ import promises = require("promises");
+ /**
+ * The alert() method displays an alert box with a specified message.
+ * @param message Specifies the text to display in the alert box.
+ */
+ function alert(message: string): promises.Promise;
+
+ /**
+ * The alert() method displays an alert box with a specified options.
+ * @param options Specifies the options for the alert box.
+ */
+ function alert(options: AlertOptions): promises.Promise;
+
+ /**
+ * The confirm() method displays a dialog box with a specified message.
+ * @param message Specifies the text to display in the confirm box.
+ */
+ function confirm(message: string): promises.Promise;
+
+ /**
+ * The confirm() method displays a dialog box with a specified message.
+ * @param options Specifies the options for the confirm box.
+ */
+ function confirm(options: ConfirmOptions): promises.Promise;
+
+ /**
+ * The prompt() method displays a dialog box that prompts the visitor for input.
+ * @param message The text to display in the dialog box.
+ */
+ function prompt(message: string): promises.Promise;
+
+ /**
+ * The prompt() method displays a dialog box that prompts the visitor for input.
+ * @param options The options for the dialog box.
+ */
+ function prompt(options: PromptOptions): promises.Promise;
+
+ /**
+ * Provides options for the dialog.
+ */
+ interface DialogOptions {
+ /**
+ * Gets or sets the alert message.
+ */
+ message: string;
+
+ /**
+ * Gets or sets the alert title.
+ */
+ title?: string;
+ }
+
+ /**
+ * Provides options for the alert.
+ */
+ interface AlertOptions extends DialogOptions {
+ /**
+ * Gets or sets the button name.
+ */
+ buttonName?: string;
+ }
+
+ /**
+ * Provides options for the confirm.
+ */
+ interface ConfirmOptions extends DialogOptions {
+ /**
+ * Gets or sets the OK button name.
+ */
+ okButtonName?: string;
+
+ /**
+ * Gets or sets the Cancel button name.
+ */
+ cancelButtonName?: string;
+ }
+
+ /**
+ * Provides options for the prompt.
+ */
+ interface PromptOptions extends ConfirmOptions {
+ /**
+ * Gets or sets the default text.
+ */
+ defaultText?: string;
+ }
+}
\ No newline at end of file
diff --git a/ui/dialogs/dialogs.ios.ts b/ui/dialogs/dialogs.ios.ts
new file mode 100644
index 000000000..cd68a3240
--- /dev/null
+++ b/ui/dialogs/dialogs.ios.ts
@@ -0,0 +1,117 @@
+/**
+ * iOS specific dialogs functions implementation.
+ */
+import promises = require("promises");
+import dialogs = require("ui/dialogs");
+
+var UIALERTVIEWDELEGATE = "UIAlertViewDelegate",
+ STRING = "string",
+ ALERT = "Alert",
+ OK = "OK",
+ CANCEL = "Cancel";
+
+function createUIAlertView(options: dialogs.DialogOptions): UIKit.UIAlertView {
+ var alert = new UIKit.UIAlertView();
+ alert.title = options.title;
+ alert.message = options.message;
+ return alert;
+}
+
+function createDelegate(callback) {
+ var delegateType = Foundation.NSObject.extends({}, {}).implements({
+ protocol: UIALERTVIEWDELEGATE,
+ implementation: {
+ alertViewClickedButtonAtIndex: function (view, index) {
+ callback(view, index);
+ }
+ }
+ });
+ return new delegateType;
+}
+
+export function alert(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, buttonName: OK } : arg
+
+ var alert = createUIAlertView(options);
+
+ alert.addButtonWithTitle(options.buttonName);
+
+ // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference.
+ var delegate = createDelegate(function (view, index) {
+ d.resolve();
+ // Remove the local variable for the delegate.
+ delegate = undefined;
+ });
+
+ alert.delegate = delegate;
+
+ alert.show();
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
+
+export function confirm(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg
+
+ var alert = createUIAlertView(options);
+
+ alert.addButtonWithTitle(options.okButtonName);
+ alert.addButtonWithTitle(options.cancelButtonName);
+
+ // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference.
+ var delegate = createDelegate(function (view, index) {
+ d.resolve(index === 0);
+ // Remove the local variable for the delegate.
+ delegate = undefined;
+ });
+
+ alert.delegate = delegate;
+
+ alert.show();
+
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
+
+export function prompt(arg: any): promises.Promise {
+ var d = promises.defer();
+ try {
+ var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg
+
+ var alert = createUIAlertView(options);
+ alert.alertViewStyle = UIKit.UIAlertViewStyle.UIAlertViewStylePlainTextInput;
+ alert.addButtonWithTitle(options.okButtonName);
+ alert.addButtonWithTitle(options.cancelButtonName);
+
+ var textField = alert.textFieldAtIndex(0);
+ textField.text = options.defaultText ? options.defaultText : "";
+
+ // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference.
+ var delegate = createDelegate(function (view, index) {
+ if (index === 0) {
+ d.resolve(textField.text);
+ }
+ // Remove the local variable for the delegate.
+ delegate = undefined;
+ });
+
+ alert.delegate = delegate;
+
+ alert.show();
+
+ } catch (ex) {
+ d.reject(ex);
+ }
+
+ return d.promise();
+}
\ No newline at end of file
diff --git a/ui/dialogs/index.ts b/ui/dialogs/index.ts
new file mode 100644
index 000000000..fac3ad1cb
--- /dev/null
+++ b/ui/dialogs/index.ts
@@ -0,0 +1,2 @@
+declare var module, require;
+module.exports = require("ui/dialogs/dialogs");
\ No newline at end of file