--- /dev/null
+The MIT License (MIT)
+
+Copyright (c) 2016 Pebble Technology
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+# Clay
+Clay is a JavaScript library that makes it easy to add offline configuration pages to your Pebble apps. All you need to get started is a couple lines of JavaScript and a JSON file; no servers or HTML required.
+
+Clay will by default automatically handle the 'showConfiguration' and 'webviewclosed' events traditionally implemented by developers to relay configuration settings to the watch side of the app. This step is not required when using Clay, since each config item is given the same `messageKey` as defined in `package.json` (or PebbleKit JS Message Keys on CloudPebble), and is automatically transmitted once the configuration page is submitted by the user. Developers can override this behavior by [handling the events manually](#handling-the-showconfiguration-and-webviewclosed-events-manually).
+
+Clay is distributed as a [Pebble package](https://developer.pebble.com/guides/pebble-packages/) so it is super easy to include in your project. If you are upgrading from v0.1.x of Clay you need to follow the [migration guide](#migrating-from-v01x-to-v1x) before you can get started.
+
+If you would like to contribute to Clay, check out the [contributing guide.](CONTRIBUTING.md)
+
+# Getting Started (SDK 3.13 or higher)
+
+1. Run `pebble package install pebble-clay` to install the package in your project
+2. Create a JSON file called `config.json` and place it in your `src/js` directory.
+3. In order for JSON files to work you may need to change a line in your `wscript` from `ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))` to `ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob(['src/js/**/*.js', 'src/js/**/*.json']))`.
+4. Your `index.js` (`app.js` in SDK 3) file needs to `require` clay and your config file, then be initialized. Clay will by default automatically handle the 'showConfiguration' and 'webviewclosed' events. Copy and paste the following into the top of your `index.js` file:
+
+ ```javascript
+ var Clay = require('pebble-clay');
+ var clayConfig = require('./config.json');
+ var clay = new Clay(clayConfig);
+ ```
+5. Ensure `pebble.enableMultiJS` is set to true in your `package.json`.
+6. Next is the fun part - creating your config page. Edit your `config.json` file to build a layout of elements as described in the sections below.
+7. Make sure you have defined all of your `messageKeys` in your `package.json`. More info on how that works [here.](https://developer.pebble.com/guides/communication/using-pebblekit-js/#defining-keys)
+
+# Getting Started (CloudPebble)
+
+1. Ensure `JS Handling` is set to `CommonJS-style` in your project settings.
+2. Under `Dependencies` in the project navigation, enter `pebble-clay` as the `Package Name` and `^1.0.0` for the `Version`. You may use any specific version you like, however using `^1.0.0` will ensure you receive all minor version updates.
+4. Create a JavaScript file called `config.js` with the following content. This will act as your config's root array element, from which the rest of the page is built up:
+
+ ```javascript
+ module.exports = [];
+ ```
+5. Your `index.js` file needs to `require` clay and your config file, then be initialized. Clay will by default automatically handle the 'showConfiguration' and 'webviewclosed' events. Copy and paste the following into the top of your `app.js` file:
+
+ ```javascript
+ var Clay = require('pebble-clay');
+ var clayConfig = require('./config');
+ var clay = new Clay(clayConfig);
+ ```
+6. Next is the fun part - creating your config page. Edit your `config.js` file to build a layout of elements as described in the sections below.
+7. Make sure you have defined all of your message keys using `Automatic assignment` in your project settings. More info on how that works [here.](https://developer.pebble.com/guides/communication/using-pebblekit-js/#defining-keys)
+
+# Getting Started (Pebble.js)
+If you are using [Pebble.js](https://developer.pebble.com/docs/pebblejs/) and would like to use Clay, The setup process is a little different. Pebble.js does not currently support message keys so you will have to use [v0.1.7](https://github.com/pebble/clay/releases/v0.1.7) of Clay. Follow the instructions in the [readme for that version.](https://github.com/pebble/clay/blob/v0.1.7/README.md)
+
+# Getting Started (Rocky.js)
+If you are using [Rocky.js](https://developer.pebble.com/docs/rockyjs/) and would like to use Clay, please be aware that this is currently unsupported. It is possible to install the Clay package and override the 'showConfiguration' and 'webviewclosed' events and handle them manually, but Rocky.js does not currently support persistent storage, so the settings must be loaded from the phone each time. You can find an example of using Clay with Rocky.js [here](https://github.com/orviwan/rocky-leco-clay).
+
+# Creating Your Config File
+
+Clay uses JavaScript object notation (or JSON) to generate the config page for you. The structure of the page is up to you, but you do need to follow some basic rules.
+
+## Basic Config Structure
+
+Your root element **must** be an array. This represents the entire page. Inside this array you place your config items. Each config item is an object with some properties that configure how each item should be displayed.
+
+#### Example
+
+NOTE for config.js (rather than config.json) a leading `module.exports =` is required.
+
+```javascript
+[
+ {
+ "type": "heading",
+ "defaultValue": "Example Header Item"
+ },
+ {
+ "type": "text",
+ "defaultValue": "Example text item."
+ }
+]
+```
+
+## Components
+
+<img src="src/images/example.png" width="360" title="Example">
+
+### Section
+
+Sections help divide up the page into logical groups of items. It is recommended that you place all your input-based items in at least one section.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `section`. |
+| items | array | Array of items to include in this section. |
+| capabilities | array | Array of features that the connected watch must have for this section to be present |
+
+##### Example
+
+```javascript
+{
+ "type": "section",
+ "items": [
+ {
+ "type": "heading",
+ "defaultValue": "This is a section"
+ },
+ {
+ "type": "input",
+ "messageKey": "email",
+ "label": "Email Address"
+ },
+ {
+ "type": "toggle",
+ "messageKey": "enableAnimations",
+ "label": "Enable Animations"
+ }
+ ]
+}
+```
+
+---
+
+### Heading
+
+**Manipulator:** [`html`](#html)
+
+Headings can be used in anywhere and can have their size adjusted to suit the context. If you place a heading item at the first position of a section's `items` array then it will automatically be styled as the header for that section.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `heading`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| defaultValue | string/HTML | The heading's text. |
+| size | int | Defaults to `4`. An integer from 1 to 6 where 1 is the largest size and 6 is the smallest. (represents HTML `<h1>`, `<h2>`, `<h3>`, etc). |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+
+##### Example
+
+```javascript
+{
+ "type": "heading",
+ "id": "main-heading",
+ "defaultValue": "My Cool Watchface",
+ "size": 1
+}
+```
+
+---
+
+### Text
+
+**Manipulator:** [`html`](#html)
+
+Text is used to provide descriptions of sections or to explain complex parts of your page. Feel free to add any extra HTML you require to the `defaultValue`
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `text`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| defaultValue | string/HTML | The content of the text element. |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+
+##### Example
+
+```javascript
+{
+ "type": "text",
+ "defaultValue": "This will be displayed in the text element!",
+}
+```
+
+---
+
+### Input
+
+**Manipulator:** [`val`](#val)
+
+Standard text input field.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `input`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| label | string | The label that should appear next to this item. |
+| defaultValue | string | The default value of the input field. |
+| description | string | Optional sub-text to include below the component |
+| attributes | object | An object containing HTML attributes to set on the input field. Set `type` to values such as "email", "time", "date" etc to adjust the behavior of the component. |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+
+##### Example
+
+```javascript
+{
+ "type": "input",
+ "messageKey": "email",
+ "defaultValue": "",
+ "label": "Email Address",
+ "attributes": {
+ "placeholder": "eg: name@domain.com",
+ "limit": 10,
+ "type": "email"
+ }
+}
+```
+
+---
+
+#### Toggle
+
+**Manipulator:** [`checked`](#checked)
+
+Switch for a single item.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `toggle`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| label | string | The label that should appear next to this item. |
+| defaultValue | int\|boolean | The default value of the toggle. Defaults to `false` if not specified. |
+| description | string | Optional sub-text to include below the component |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+
+##### Example
+
+```javascript
+{
+ "type": "toggle",
+ "messageKey": "invert",
+ "label": "Invert Colors",
+ "defaultValue": true
+}
+```
+
+---
+
+#### Select
+
+**Manipulator:** [`val`](#val)
+
+A dropdown menu containing multiple options.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `select`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| label | string | The label that should appear next to this item. |
+| defaultValue | string | The default value of the dropdown menu. Must match a value in the `options` array. |
+| description | string | Optional sub-text to include below the component |
+| options | array of objects | The options you want to appear in the dropdown menu. Each option is an object with a `label` and `value` property. |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "select",
+ "messageKey": "flavor",
+ "defaultValue": "grape",
+ "label": "Favorite Flavor",
+ "options": [
+ {
+ "label": "",
+ "value": ""
+ },
+ {
+ "label": "Berry",
+ "value": "berry"
+ },
+ {
+ "label": "Grape",
+ "value": "grape"
+ },
+ {
+ "label": "Banana",
+ "value": "banana"
+ }
+ ]
+}
+```
+
+If you wish to use optgroups, then use the following format:
+
+```javascript
+{
+ "type": "select",
+ "messageKey": "flavor",
+ "defaultValue": "grape",
+ "label": "Favorite Flavor",
+ "options": [
+ {
+ "label": "",
+ "value": ""
+ },
+ {
+ "label": "Fruits",
+ "value": [
+ {
+ "label": "Berry",
+ "value": "berry"
+ },
+ {
+ "label": "Grape",
+ "value": "grape"
+ },
+ {
+ "label": "Banana",
+ "value": "banana"
+ }
+ ]
+ },
+ {
+ "label": "Candy",
+ "value": [
+ {
+ "label": "Chocolate",
+ "value": "chocolate"
+ },
+ {
+ "label": "Cream",
+ "value": "cream"
+ },
+ {
+ "label": "Lollipop",
+ "value": "lollipop"
+ }
+ ]
+ }
+ ]
+}
+```
+
+---
+
+#### Color Picker
+
+**Manipulator:** [`color`](#color)
+
+A color picker that allows users to choose a color from the ones that are compatible with their Pebble smartwatch.
+The color picker will automatically show a different layout depending on the watch connected:
+
+ - Aplite (Firmware 2.x) - Black and white
+ - Aplite (Firmware 3.x) - Black and white. Will also include gray (`#AAAAAA`) if `allowGray` is set to `true`
+ - Basalt/chalk - The 64 colors compatible with color Pebble smartwatches.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `color`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| label | string | The label that should appear next to this item. |
+| defaultValue | string OR int | The default color. One of the [64 colors](https://developer.pebble.com/guides/tools-and-resources/color-picker/) compatible with Pebble smartwatches. Always use the uncorrected value even if `sunlight` is true. The component will do the conversion internally. |
+| description | string | Optional sub-text to include below the component |
+| sunlight | boolean | Use the color-corrected sunlight color palette if `true`, else the uncorrected version. Defaults to `true` if not specified. |
+| layout | string OR array | Optional. Use a custom layout for the color picker. Defaults to automatically choosing the most appropriate layout for the connected watch. The layout is represented by a two dimensional array. Use `false` to insert blank spaces. You may also use one of the preset layouts by setting `layout` to: `"COLOR"`, `"GRAY"` or `"BLACK_WHITE"` |
+| allowGray | boolean | Optional. Set this to `true` to include gray (`#AAAAAA`) in the color picker for aplite running on firmware 3 and above. This is optional because only a subset of the drawing operations support gray on aplite. Defaults to `false` |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "color",
+ "messageKey": "background",
+ "defaultValue": "ff0000",
+ "label": "Background Color",
+ "sunlight": true,
+ "layout": [
+ [false, "00aaff", false],
+ ["0055ff", "0000ff", "0000aa"],
+ [false, "5555ff", false]
+ ]
+}
+```
+
+##### Example
+
+```javascript
+{
+ "type": "color",
+ "messageKey": "background",
+ "defaultValue": "ffffff",
+ "label": "Background Color",
+ "sunlight": false,
+ "layout": "BLACK_WHITE"
+}
+```
+
+##### Example
+
+```javascript
+{
+ "type": "color",
+ "messageKey": "background",
+ "defaultValue": "aaaaaa",
+ "label": "Background Color",
+ "sunlight": false,
+ "allowGray": true
+}
+```
+
+---
+
+#### Radio Group
+
+**Manipulator:** [`radiogroup`](#radiogroup)
+
+A list of options allowing the user can only choose one option to submit.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `radiogroup`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. |
+| label | string | The label that should appear next to this item. |
+| defaultValue | string | The default selected item. Must match a value in the `options` array. |
+| description | string | Optional sub-text to include below the component |
+| options | array of objects | The options you want to appear in the radio group. Each option is an object with a `label` and `value` property. |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "radiogroup",
+ "messageKey": "favorite_food",
+ "label": "Favorite Food",
+ "options": [
+ {
+ "label": "Sushi",
+ "value": "sushi"
+ },
+ {
+ "label": "Pizza",
+ "value": "pizza"
+ },
+ {
+ "label": "Burgers",
+ "value": "burgers"
+ }
+ ]
+}
+```
+
+---
+
+#### Checkbox Group
+
+**Manipulator:** [`checkboxgroup`](#checkboxgroup)
+
+A list of options where a user may choose more than one option to submit.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `checkboxgroup`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| messageKey | string (unique) | The AppMessage key matching the `messageKey` item defined in your `package.json`. Set this to a unique string to allow this item to be looked up using `Clay.getItemsByMessageKey()` in your custom function. You must set this if you wish for the value of this item to be persisted after the user closes the config page. **NOTE:** The checkboxgroup component will expect you to have defined a `messageKey` in your `package.json` using array syntax. In the example below, the matching entry in the `package.json` would be `favorite_food[3]`. In CloudPebble, you must use `Automatic assignment` for message keys and the `Key Array Length` must match the number of options in the checkboxgroup |
+| label | string | The label that should appear next to this item. |
+| defaultValue | array of booleans | The default selected items. |
+| description | string | Optional sub-text to include below the component |
+| options | array of strings | The labels for each checkbox you want to appear in the checkbox group. |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "checkboxgroup",
+ "messageKey": "favorite_food",
+ "label": "Favorite Food",
+ "defaultValue": [true, false, true],
+ "options": ["Sushi", "Pizza", "Burgers"]
+}
+```
+
+In the above example, Sushi and Burgers will be selected by default.
+
+---
+
+### Generic Button
+
+**Manipulator:** [`button`](#button)
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `button`. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| defaultValue | string | The text displayed on the button. |
+| primary | boolean | If `true` the button will be orange, if `false`, the button will be gray (defaults to `false`)|
+| description | string | Optional sub-text to include below the component |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "button",
+ "primary": true,
+ "defaultValue": "Send"
+}
+```
+
+---
+
+### Range Slider
+
+**Manipulator:** [`slider`](#slider)
+
+The range slider is used to allow users to select numbers between two values.
+
+**NOTE** If you set the `step` property to anything less than `1`,
+it will multiply the final value sent to the watch by 10 to the power of the number of decimal places in the value of `step`.
+Eg: If you set the `step` to `0.25` and the slider has value of `34.5`, the watch will receive `3450`.
+The reason why this is necessary, is because you can not send floats to the watch via `Pebble.sendAppMessage()`.
+This allows your users to still be able to input values that have decimals,
+you must just remember to divide the received value on the watch accordingly.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `slider`. |
+| defaultValue | number | The value of the slider. |
+| label | string | The label that should appear next to this item. |
+| min | number | The minimum allowed value of the slider. Defaults to `100` |
+| max | number | The maximum allowed value of the slider. Defaults to `0` |
+| step | number | The multiple of the values allowed to be set on the slider. The slider will snap to these values. This value also determines the precision used when the value is sent to the watch. Defaults to 1 |
+| description | string | Optional sub-text to include below the component |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "slider",
+ "messageKey": "slider",
+ "defaultValue": 15,
+ "label": "Slider",
+ "description": "This is the description for the slider",
+ "min": 10,
+ "max": 20,
+ "step": 0.25
+},
+```
+
+---
+
+### Submit
+
+**Manipulator:** [`button`](#button)
+
+The submit button for the page. You **MUST** include this component somewhere in the config page (traditionally at the bottom) or users will not be able to save the form.
+
+##### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| type | string | Set to `submit`. |
+| defaultValue | string | The text displayed on the button. |
+| id | string (unique) | Set this to a unique string to allow this item to be looked up using `Clay.getItemById()` in your [custom function](#custom-function). |
+| capabilities | array | Array of features that the connected watch must have for this item to be present |
+| group | string |Â Set this to allow this item, along with other items sharing the same group to be looked up using `Clay.getItemsByGroup()` in your [custom function](#custom-function) |
+
+##### Example
+
+```javascript
+{
+ "type": "submit",
+ "defaultValue": "Save"
+}
+```
+
+---
+
+### Message keys and array syntax
+
+Clay supports (and requires in some cases) the use of array syntax for message keys. Also known as `Automatic assignment` in CloudPebble. More info [here.](https://developer.pebble.com/guides/communication/using-pebblekit-js/#defining-keys)
+
+You can assign any component that does not return an array to a particular position in your message key. This is done by appending the position (zero indexed) wrapped in brackets to the end of the `messageKey` property. Do **NOT** include any spaces in your `messageKey`.
+
+##### Example
+
+```javascript
+{
+ "type": "toggle",
+ "messageKey": "light_switch[1]",
+ "label": "Invert Colors",
+ "defaultValue": true
+}
+```
+In the above example, the value of the item will be accessible with `MESSAGE_KEY_light_switch + 1` in your C code.
+
+Components that return an array in their `.get()` method, such as the checkboxgroup will expect the corresponding message key to already be defined with the correct length. You **CAN NOT** use the array syntax in the `messageKey` property as this would be trying to create a 2 dimensional array.
+
+##### Example
+
+```javascript
+{
+ "type": "checkboxgroup",
+ "messageKey": "favorite_food",
+ "label": "Favorite Food",
+ "defaultValue": [true, false, true],
+ "options": ["Sushi", "Pizza", "Burgers"]
+}
+```
+In the above example, the value of the item will be accessible with `MESSAGE_KEY_favorite_food`, `MESSAGE_KEY_favorite_food + 1`, and `MESSAGE_KEY_favorite_food + 2` in your C code.
+
+---
+### Showing items for specific platforms and features
+
+If you want particular items or sections to only be present in the config based on the
+connected watch's capabilities, you can include the "capabilities" property in the item.
+The "capabilities" property is an array of features that the connected watch must have
+in order for the item or section to be included in the page. Note: all capabilities in
+the array must be present for item/section to be included.
+
+You can also prefix the capability with `NOT_` to negate the capability. Eg: `NOT_HEALTH`
+will only be included in the page if the device does **NOT** support health.
+
+**Warning:** Items that do not satisfy the capabilities will not be included in the page
+at all. You will not be able to use methods like `clayConfig.getItemByMessageKey()` to
+obtain a reference to them. However, this does mean that you will be able to have
+multiple items with the same `messageKey`as long as they do not both satisfy the
+same conditions.
+
+##### Examples
+
+```javascript
+{
+ "type": "text",
+ "defaultValue": "This item will only be visible for watches that are rectangular and have a microphone"
+ "capabilities": ["MICROPHONE", "RECT"],
+}
+```
+
+```javascript
+{
+ "type": "section",
+ "capabilities": ["NOT_HEALTH"],
+ "items": [
+ {
+ "type": "text",
+ "defaultValue": "Only visible for watches that do not support health"
+ }
+ ]
+}
+```
+
+Below is the full list of capabilities
+
+| Capability | Description |
+|------------|-------------|
+| PLATFORM_APLITE | Running on Pebble/Pebble Steel.|
+| PLATFORM_BASALT | Running on Pebble Time/Pebble Time Steel. |
+| PLATFORM_CHALK | Running on Pebble Time Round. |
+| PLATFORM_DIORITE | Running on Pebble 2 |
+| PLATFORM_EMERY | Running on Time 2. |
+| BW | Running on hardware that supports only black and white. |
+| COLOR | Running on hardware that supports 64 colors. |
+| MICROPHONE | Running on hardware that includes a microphone. |
+| SMARTSTRAP | Running on hardware that includes a smartstrap connector. |
+| SMARTSTRAP_POWER | Running on hardware that includes a powered smartstrap connector. |
+| HEALTH | Running on hardware that supports Pebble Health and the HealthService API. |
+| RECT | Running on hardware with a rectangular display. |
+| ROUND | Running on hardware with a round display. |
+| DISPLAY_144x168 | Running on hardware with a 144x168 pixels display. |
+| DISPLAY_180x180_ROUND | Running on hardware with a 180x180 pixels round display. |
+| DISPLAY_200x228 | Running on hardware with a 200x228 pixels display. |
+
+## Manipulators
+
+Each component has a **manipulator**. This is a set of methods used to talk to the item on the page.
+At a minimum, manipulators must have a `.get()` and `.set(value)` method however there are also methods to assist in interactivity such as `.hide()` and `.disable()`.
+**NOTE:** There is currently no way to disable or hide an entire section. You must disable/hide each item in the section to achieve this effect.
+
+When the config page is closed, the `.get()` method is run on all components registered with an `messageKey` to construct the object sent to the C app.
+
+Many of these methods fire an event when the method is called. You can listen for these events with `ClayItem.on()`.
+**NOTE** These events will only be fired if the state actually changes.
+Eg: If you run the `.show()` manipulator on an item that is already visible, the `show` event will not be triggered.
+
+#### html
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [string\|HTML] value)` | `ClayItem` | `change` | Sets the content of this item. |
+| `.get()` | `string` | | Gets the content of this item. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### button
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [string\|HTML] value)` | `ClayItem` | `change` | Sets the content of this item. |
+| `.get()` | `string` | | Gets the content of this item. |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being clicked by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be clicked by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### val
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [string] value)` | `ClayItem` | `change` | Sets the value of this item. |
+| `.get()` | `string` | | Gets the content of this item. |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### checked
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [boolean\|int] value)` | `ClayItem` | `change` | Check/uncheck the state of this item. |
+| `.get()` | `boolean` | | `true` if checked, `false` if not. **NOTE** this will be converted to a `1` or `0` when sent to the watch. See [`Clay.getSettings()`](#methods) |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### color
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [string\|int] value)` | `ClayItem` | `change` | Sets the color picker to the provided color. If the value is a string, it must be provided in hex notation eg `'FF0000'`. |
+| `.get()` | `int` | | Get the chosen color. This is returned as a number in order to make it easy to use on the watch side using `GColorFromHEX()`. |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### radiogroup
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [string] value)` | `ClayItem` | `change` | Checks the radio button that corresponds to the provided value. |
+| `.get()` | `string` | | Gets the value of the checked radio button in the list. |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### checkboxgroup
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [array] value)` | `ClayItem` | `change` | Checks the checkboxes that corresponds to the provided list of values. |
+| `.get()` | `Array.<string>` | | Gets an array of booleans representing the list the checked items. **NOTE:** each item in the array will be converted to an `int` when sent to the watch. See [`Clay.getSettings()`](#methods) |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+#### slider
+
+| Method | Returns | Event Fired | Description |
+|--------|---------|-------------| ------------|
+| `.set( [number] value)` | `ClayItem` | `change` | Sets the value of this item. |
+| `.get()` | `number` | | Gets the value of this item. |
+| `.disable()` | `ClayItem` | `disabled` | Prevents this item from being edited by the user. |
+| `.enable()` | `ClayItem` | `enabled` | Allows this item to be edited by the user. |
+| `.hide()` | `ClayItem` | `hide` | Hides the item |
+| `.show()` | `ClayItem` | `show` | Shows the item |
+
+# Extending Clay
+
+Clay is built to allow developers to add their own basic interactivity to the config page. This can be done in a number of ways:
+
+## Handling The 'showConfiguration' and 'webviewclosed' Events Manually
+
+Clay will by default, automatically handle the 'showConfiguration' and 'webviewclosed' events. This allows the `messageKey` of each config item to be automatically delivered to the `InboxReceivedHandler` on the watch side. If you wish to override this behavior and handle the events yourself, pass an object as the 3rd parameter of the Clay constructor with `autoHandleEvents` set to `false`.
+
+Example:
+
+```javascript
+var Clay = require('pebble-clay');
+var clayConfig = require('./config');
+var clayConfigAplite = require('./config-aplite');
+var clay = new Clay(clayConfig, null, { autoHandleEvents: false });
+
+Pebble.addEventListener('showConfiguration', function(e) {
+
+ // This is an example of how you might load a different config based on platform.
+ var platform = clay.meta.activeWatchInfo.platform || 'aplite';
+ if (platform === 'aplite') {
+ clay.config = clayConfigAplite;
+ }
+
+ Pebble.openURL(clay.generateUrl());
+});
+
+Pebble.addEventListener('webviewclosed', function(e) {
+ if (e && !e.response) {
+ return;
+ }
+
+ // Get the keys and values from each config item
+ var dict = clay.getSettings(e.response);
+
+ // Send settings values to watch side
+ Pebble.sendAppMessage(dict, function(e) {
+ console.log('Sent config data to Pebble');
+ }, function(e) {
+ console.log('Failed to send config data!');
+ console.log(JSON.stringify(e));
+ });
+});
+```
+
+## Clay API (app.js)
+
+### `Clay([Array] config, [function] customFn, [object] options)`
+
+#### Constructor Parameters
+
+| Parameter | Type | Description |
+|----------|-------|-------------|
+| `config` | Array | The config that will be used to generate the configuration page |
+| `customFn` | Function\|null | (Optional) The [custom function](#custom-function) to be injected into the generated configuration page. |
+| `options` | Object | (Optional) See below for properties |
+| `options.autoHandleEvents` | Boolean | (Optional) Defaults to `true`. If set to `false`, Clay will not [auto handle the `showConfiguration` and `webviewclosed` events](#handling-the-showconfiguration-and-webviewclosed-events-manually) |
+| `options.userData` | Any | (Optional) Any arbitrary data you want to pass to your config page. It will be available in your custom function as `this.meta.userData` |
+
+#### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `.config` | Array | Copy of the config passed to the constructor and used for generating the page. |
+| `.customFn` | Function | Reference to the custom function passed to the constructor. **WARNING** this is a direct reference, not a copy of the custom function so any modification you make to it, will be reflected on the original as well |
+| `.meta` | Object | Contains information about the current user and watch. **WARNING** This will only be populated in the `showConfiguration` event handler. (See example above) |
+| `.meta.activeWatchInfo` | watchinfo\|null | An object containing information on the currently connected Pebble smartwatch or null if unavailable. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getActiveWatchInfo). |
+| `.meta.accountToken` | String | A unique account token that is associated with the Pebble account of the current user. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getAccountToken). |
+| `.meta.watchToken` | String | A unique token that can be used to identify a Pebble device. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getWatchToken). |
+| `.meta.userData` | Any | A deep copy of the arbitrary data provided in the `options.userData`. Defaults to an empty object |
+| `.version` | String | The version of Clay currently being used. |
+
+#### Methods
+
+| Method | Returns |
+| -------|---------|
+| `Clay( [array] config, [function] customFn=null, [object] options={autoHandleEvents: true})` <br> `config` - an Array representing your config <br> `customFn` - function to be run in the context of the generated page <br> `options.autoHandleEvents` - set to `false` to prevent Clay from automatically handling the "showConfiguration" and "webviewclosed" events | `Clay` - a new instance of Clay. |
+| `.registerComponent( [ClayComponent] component )` <br> Registers a custom component. | `void`. |
+| `.generateUrl()` | `string` - The URL to open with `Pebble.openURL()` to use the Clay-generated config page. |
+| `.getSettings( [object] response, [boolean] convert=true)` <br> `response` - the response object provided to the "webviewclosed" event <br> `convert` - Pass `false` to not convert the settings to be compatible with `Pebble.sendAppMessage()` | `Object` - object of keys and values for each config page item with an `messageKey`, where the key is the `messageKey` and the value is the chosen value of that item. <br><br>This method will do some conversions depending on the type of the setting. Arrays will use message key array syntax to make the values of each item in the array available as individual message keys. Booleans will be converted to numbers. eg `true` becomes `1` and `false` becomes `0`. If the value is a number or an array of numbers and the optional property: "precision" is the power of precision (value * 10 ^ precision) and then floored. Eg: `1.4567` with a precision set to `3` will become `1456`. Pass `false` as the second parameter to disable this behavior. See the example below for how this all works |
+| `.setSettings( [string] key, [*] value )` <br> `key` - The key for the setting you want to set. <br> `value` - The value of the setting you want to set. | `void` |
+| `.setSettings( [object] settings )` <br> `settings` - An object of key/value pairs that you would like to update the settings with. eg `{ user_name: 'Emily', show_animations: true }` | `void` |
+
+#### `.getSettings()` Example
+
+```javascript
+
+// webviewclosed response
+{
+ "favorite_food": {"value": [1, 0, 1]},
+ "cool_things_enabled": {"value": true},
+ "user_name": {"value": "Jane Doe"},
+ "date_of_birth[0]": {"value": 1989},
+ "date_of_birth[1]": {"value": 11},
+ "date_of_birth[2]": {"value": 28},
+ "rating": {"value": 3.5, "precision": 1},
+}
+
+// resulting converted values
+
+var messageKeys = require('message_keys');
+
+messageKeys.favorite_food + 0 = 1;
+messageKeys.favorite_food + 1 = 0;
+messageKeys.favorite_food + 2 = 1;
+messageKeys.cool_things_enabled = 1;
+messageKeys.user_name = 'Jane Doe';
+messageKeys.date_of_birth + 0 = 1989;
+messageKeys.date_of_birth + 1 = 11;
+messageKeys.date_of_birth + 2 = 28;
+messageKeys.rating = 35;
+
+
+```
+
+---
+
+
+## Custom Function
+
+When initializing Clay in your `app.js` file, you can optionally provide a function that will be copied and run on the generated config page.
+
+**IMPORTANT:** This function is injected by running `.toString()` on it. If you are making use of `require` or any other dynamic features, they will not work. You must make sure that everything the function needs to execute is available in the function body itself.
+
+This function, when injected into the config page, will be run with `ClayConfig` as its context (`this`), and [**Minified**](#minified) as its first parameter.
+
+Make sure to always wait for the config page to be built before manipulating items. You do this by registering a handler for the `Clay.EVENTS.AFTER_BUILD` event (see below).
+
+#### Example
+
+##### app.js
+
+```javascript
+var Clay = require('pebble-clay');
+var clayConfig = require('./config');
+var customClay = require('./custom-clay');
+var userData = {token: 'abc123'}
+var clay = new Clay(clayConfig, customClay, {userData: userData});
+```
+
+##### custom-clay.js
+
+```javascript
+module.exports = function(minified) {
+ var clayConfig = this;
+ var _ = minified._;
+ var $ = minified.$;
+ var HTML = minified.HTML;
+
+ function toggleBackground() {
+ if (this.get()) {
+ clayConfig.getItemByMessageKey('background').enable();
+ } else {
+ clayConfig.getItemByMessageKey('background').disable();
+ }
+ }
+
+ clayConfig.on(clayConfig.EVENTS.AFTER_BUILD, function() {
+ var coolStuffToggle = clayConfig.getItemByMessageKey('cool_stuff');
+ toggleBackground.call(coolStuffToggle);
+ coolStuffToggle.on('change', toggleBackground);
+
+ // Hide the color picker for aplite
+ if (!clayConfig.meta.activeWatchInfo || clayConfig.meta.activeWatchInfo.platform === 'aplite') {
+ clayConfig.getItemByMessageKey('background').hide();
+ }
+
+ // Set the value of an item based on the userData
+ $.request('get', 'https://some.cool/api', {token: clayConfig.meta.userData.token})
+ .then(function(result) {
+ // Do something interesting with the data from the server
+ })
+ .error(function(status, statusText, responseText) {
+ // Handle the error
+ });
+ });
+
+};
+```
+
+## Clay API (Custom Function)
+
+### `ClayConfig([Object] settings, [Array] config, [$Minified] $rootContainer)`
+
+This is the main way of talking to your generated config page. An instance of this class will be passed as the context of your custom function when it runs on the generated config page.
+
+#### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `.EVENTS.BEFORE_BUILD` | String | Dispatched prior to building the page. |
+| `.EVENTS.AFTER_BUILD` | String | Dispatched after building the page. |
+| `.EVENTS.BEFORE_DESTROY` | String | Dispatched prior to destroying the page. |
+| `.EVENTS.AFTER_DESTROY` | String | Dispatched after destroying the page. |
+| `.config` | Array | Reference to the config passed to the constructor and used for generating the page. |
+| `.meta` | Object | Contains information about the current user and watch |
+| `.meta.activeWatchInfo` | watchinfo\|null | An object containing information on the currently connected Pebble smartwatch or null if unavailable. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getActiveWatchInfo). |
+| `.meta.accountToken` | String | A unique account token that is associated with the Pebble account of the current user. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getAccountToken). |
+| `.meta.watchToken` | String | A unique token that can be used to identify a Pebble device. Read more [here](https://developer.pebble.com/docs/js/Pebble/#getWatchToken). |
+| `.meta.userData` | Any | The data passed in the `options.userData` of the [Clay constructor.](#clayarray-config-function-customfn-object-options) |
+
+
+#### Methods
+
+| Method | Returns |
+|--------|---------|
+| `.getAllItems()` | `Array.<ConfigItem>` - an array of all config items. |
+| `.getItemByMessageKey( [string] messageKey )` | `ConfigItem\|undefined` - a single `ConfigItem` that has the provided `messageKey`, otherwise `undefined`. |
+| `.getItemById( [string] id )` | `ConfigItem\|undefined` - a single `ConfigItem` that has the provided `id`, otherwise `undefined`. |
+| `.getItemsByType( [string] type )` | `Array.<ConfigItem>` - an array of config items that match the provided `type`. |
+| `.getItemsByGroup( [string] group )` | `Array.<ConfigItem>` - an array of config items that match the provided `group`. |
+| `.serialize()` | `Object` - an object representing all items with an `messageKey` where the key is the `messageKey` and the value is an object with the `value` property set to the result of running `.get()` on the Clay item. If the Clay item has a `precision` property set, it is included in the object |
+| `.build()` <br> Builds the config page. Will dispatch the `BEFORE_BUILD` event prior to building the page, then the `AFTER_BUILD` event once it is complete. If the config page has already been built, then the `ClayConfig.destroy()` method will be executed prior to building the page again. | `ClayConfig` |
+| `.destroy()` <br> Destroys the config page. Will dispatch the `BEFORE_DESTROY` event prior to destroying the page, then the `AFTER_DESTROY` event once it is complete. This method wipes the config page completely, including all existing items. You will need to make sure that you re-attach your event handlers for any items that are replaced | `ClayConfig` |
+| `.on( [string] events, [function] handler )` <br> Register an event to the provided handler. The handler will be called with this instance of `ClayConfig` as the context. If you wish to register multiple events to the same handler, then separate the events with a space | `ClayConfig` |
+| `.off( [function] handler )` <br> Remove the given event handler. **NOTE:** This will remove the handler from all registered events. | `ClayConfig` |
+| `.trigger( [string] name, [object] eventObj={} )` <br> Trigger the provided event and optionally pass extra data to the handler. | `ClayConfig` |
+| `.registerComponent( [ClayComponent] component )` <br> Registers a component. You must register all components prior to calling `.build()`. This method is also available statically. | `Boolean` - `true` if the component was registered successfully, otherwise `false`. |
+
+---
+
+### `ClayItem( [Object] config )`
+
+#### Properties
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `.id` | String | The ID of the item if provided in the config. |
+| `.messageKey` | String | The messageKey of the item if provided in the config. |
+| `.config` | Object | Reference to the config passed to the constructer. |
+| `$element` | $Minified | A Minified list representing the root HTML element of the config item. |
+| `$manipulatorTarget` | $Minified | A Minified list representing the HTML element with **data-manipulator-target** set. This is generally pointing to the main `<input>` element and will be used for binding events. |
+
+
+#### Methods
+
+| Method | Returns |
+|--------|---------|
+| `.initialize( [ClayConfig] clay)` <br> You shouldn't ever need to run this method manually as it will automatically be called when the config is built. | `ConfigItem` |
+| `.on( [string] events, [function] handler )` <br> Register an event to the provided handler. The handler will be called with this instance of `ClayItem` as the context. If you wish to register multiple events to the same handler, then separate the events with a space. Events will be registered against the `$manipulatorTarget` so most DOM events such as **"change"** or **"click"** can be listened for. | `ClayItem` |
+| `.off( [function] handler )` <br> Remove the given event handler. **NOTE:** This will remove the handler from all registered events. | `ClayItem` |
+| `.trigger( [string] name, [object] eventObj={} )` <br> Trigger the provided event and optionally pass extra data to the handler. | `ClayItem` |
+
+In addition to the methods above, all the methods from the item's manipulator will be attached to the `ClayItem`. This includes `.set()` and `.get()`.
+
+---
+
+## Custom Components
+
+Clay is also able to be extended using custom components. This allows developers to share components with each other.
+
+### Component Structure
+
+Components are simple objects with the following properties.
+
+#### `ClayComponent`
+
+| Property | Type | Required | Description |
+|----------|------|----------|-------------|
+| `name` | string | yes | This is the unique way to identify the component and will be used by the config item's `type`. |
+| `template` | string (HTML) | yes | This is the actual HTML content of the component. Make sure there is only **one** root node in the HTML. This HTML will be passed to Minified's `HTML()` method. Any properties provided by the config item will be made available to the template, eg: `label`. The template will also be provided with `clayId` as a unique way to set input `name` attributes. |
+| `style` | string | no | Any extra CSS styles you want to inject into the page. Make sure to namespace your CSS with a class that is unique to your component in order to avoid conflicts with other components. |
+| `manipulator` | string / manipulator | yes | Provide a string here to use one of the built-in manipulators, such as `val`. If an object is provided, it must have both a `.set(value)` and `.get()` method. |
+| `defaults` | object | Only if your template requires it. | An object of all the defaults your template requires. |
+| `initialize` | function | no | Method which will be called after the item has been added to the page. It will be called with the `ClayItem` as the context (`this`) and with [`minified`](#minified) as the first parameter and [`clayConfig`](#clayconfigobject-settings-array-config-minified-rootcontainer) as the second parameter |
+
+### Registering a custom component.
+
+Components must be registered before the config page is built. The easiest way to do this is in your `app.js` after you have initialized Clay:
+
+```javascript
+var Clay = require('pebble-clay');
+var clayConfig = require('./config.json');
+var clay = new Clay(clayConfig);
+
+clay.registerComponent(require('./my-custom-component'));
+```
+
+## Minified
+
+[Minified](http://minifiedjs.com) is a super light JQuery-like library. We only bundle in a small subset of its functionality. Visit the [Minified Docs](http://minifiedjs.com/api/) for more info on how to use Minified. Below is the subset of methods available in Clay.
+
+ - `$()`
+ - `$$()`
+ - `.get()`
+ - `.select()`
+ - `.set()`
+ - `.add()`
+ - `.ht()`
+ - `HTML()`
+ - `$.request()`
+ - `promise.always()`
+ - `promise.error()`
+ - `$.off()`
+ - `$.ready()`
+ - `$.wait()`
+ - `.on()`
+ - `.each()`
+ - `.find()`
+ - `_()`
+ - `_.copyObj()`
+ - `_.eachObj()`
+ - `_.extend()`
+ - `_.format()`
+ - `_.formatHtml()`
+ - `_.template()`
+ - `_.isObject()`
+
+# Migrating from v0.1.x to v1.x
+
+There were some changes in the 3.13 SDK that required Clay to undergo some major changes. For the majority of developers a simple find and replace over your config will do the trick.
+
+### appKey is now messageKey.
+
+You will need to update your config files and change any items that use `appKey` to `messageKey`
+
+##### Example
+
+```javascript
+{
+ "type": "toggle",
+ "appKey": "invert",
+ "label": "Invert Colors",
+ "defaultValue": true
+}
+```
+becomes:
+
+```javascript
+{
+ "type": "toggle",
+ "messageKey": "invert",
+ "label": "Invert Colors",
+ "defaultValue": true
+}
+```
+
+### clayConfig.getItemByAppKey is now clayConfig.getItemByMessageKey.
+
+If you have a [custom function](#custom-function) and are using the `clayConfig.getItemByAppKey()` method you will need to change this to `clayConfig.getItemByMessageKey()`
+
+### clay.getSettings() will now by default, return an object where the keys are numbers.
+
+In the past, `clay.getSettings()` would return something that looked like:
+
+```javascript
+{
+ BACKGROUND_COLOR: 0,
+ NAME: 'Jane Doe',
+ ENABLE_TOOLS: 1
+}
+```
+
+It now uses the values provided in the `message_keys` module to construct this object.
+The new format looks something like:
+
+```javascript
+{
+ 10000: 0,
+ 10001: 'Jane Doe',
+ 10002: 1
+}
+```
+
+If you wish to find out what keys are associated with what values, you must use the `message_keys` module.
+
+```javascript
+var messageKeys = require('message_keys');
+
+Pebble.addEventListener('webviewclosed', function(e) {
+ // Get the keys and values from each config item
+ var claySettings = clay.getSettings(e.response);
+
+ // In this example messageKeys.NAME is equal to 10001
+ console.log('Name is ' + claySettings[messageKeys.NAME]); // Logs: "Name is Jane Doe"
+});
+```
+
+**NOTE:** The above only applies to the default behavior of the method. If you pass
+`false` to the second argument, a standard object will be returned with the `messageKey`
+as the key.
+
+```javascript
+
+Pebble.addEventListener('webviewclosed', function(e) {
+
+ clay.getSettings(e.response);
+ /* returns:
+ {
+ 10000: 0,
+ 10001: 'Jane Doe',
+ 10002: 1
+ }
+ */
+
+ clay.getSettings(e.response, false);
+ /* returns:
+ {
+ BACKGROUND_COLOR: {value: 0},
+ NAME: {value: 'Jane Doe'},
+ ENABLE_TOOLS: {value: true}
+ }
+
+ Notice that the value for ENABLE_TOOLS was not converted to a number from a boolean
+ */
+});
+
+```
+
+### Checkbox groups now use arrays.
+
+In the previous version of Clay, checkbox groups would split the values of the items with zeros. This made for clumsy usage on the C side. Checkbox groups are now much simpler to use thanks to message keys. You will however need to update you config to the new format.
+
+#### Changes:
+ - `defaultValue` and the value that is returned by the `.get()` method is now an array of booleans.
+ - `options` are now an array of labels and do not have their own value
+ - Instead of splitting the result on the C side you now use the message key syntax. In the example below `MESSAGE_KEY_favorite_food + 2` would have a value of `1`
+
+#### Old Format
+
+```javascript
+{
+ "type": "checkboxgroup",
+ "appKey": "favorite_food",
+ "label": "Favorite Food",
+ "defaultValue": ["sushi", "burgers"],
+ "options": [
+ {
+ "label": "Sushi",
+ "value": "sushi"
+ },
+ {
+ "label": "Pizza",
+ "value": "pizza"
+ },
+ {
+ "label": "Burgers",
+ "value": "burgers"
+ }
+ ]
+}
+```
+
+#### New Format
+
+```javascript
+{
+ "type": "checkboxgroup",
+ "messageKey": "favorite_food",
+ "label": "Favorite Food",
+ "defaultValue": [true, false, true],
+ "options": ["Sushi", "Pizza", "Burgers"]
+}
+```
+
+### Clay is now a pebble package
+
+You no longer need to download a file into your project. Clay is now a Pebble package so you can go ahead and delete your `clay.js` and follow the getting started guide above to install clay in your project.
+
+Prior to SDK 3.13, `require` paths were handled in a non-standard way. When requiring modules, the name of the module was sufficient (ie. `require('config.json')`). However, with the release of SDK 3.13, the require paths changed so that you now have to require the module by using its path relative to the file it's being required in. This means requiring the config module now is done in app.js by using `require('./clay-config.json')`. An incorrect path would result in an error similar to this:
+ ```
+ [14:16:03] javascript> JavaScript Error:
+ Error: Cannot find module 'clay-config.json'
+ at Object.loader.require (loader.js:66:11)
+ at _require.require (loader.js:54:48)
+ at Object.loader (src/js/app.js:1:1)
+ at _require (loader.js:57:10)
+ at Object.loader.require (loader.js:69:10)
+ ```
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+#pragma once
+#include <stdint.h>
+
+//
+// AUTOGENERATED BY BUILD
+// DO NOT MODIFY - CHANGES WILL BE OVERWRITTEN
+//
+
--- /dev/null
+/* Clay - https://github.com/pebble/clay - Version: 1.0.4 - Build Date: 2016-11-21T20:14:28.839Z */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.pebbleClay=t()}}(function(){var t;return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){"use strict";function r(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function o(t){return 3*t.length/4-r(t)}function i(t){var e,n,o,i,a,s,c=t.length;a=r(t),s=new f(3*c/4-a),o=a>0?c-4:c;var l=0;for(e=0,n=0;e<o;e+=4,n+=3)i=u[t.charCodeAt(e)]<<18|u[t.charCodeAt(e+1)]<<12|u[t.charCodeAt(e+2)]<<6|u[t.charCodeAt(e+3)],s[l++]=i>>16&255,s[l++]=i>>8&255,s[l++]=255&i;return 2===a?(i=u[t.charCodeAt(e)]<<2|u[t.charCodeAt(e+1)]>>4,s[l++]=255&i):1===a&&(i=u[t.charCodeAt(e)]<<10|u[t.charCodeAt(e+1)]<<4|u[t.charCodeAt(e+2)]>>2,s[l++]=i>>8&255,s[l++]=255&i),s}function a(t){return l[t>>18&63]+l[t>>12&63]+l[t>>6&63]+l[63&t]}function s(t,e,n){for(var r,o=[],i=e;i<n;i+=3)r=(t[i]<<16)+(t[i+1]<<8)+t[i+2],o.push(a(r));return o.join("")}function c(t){for(var e,n=t.length,r=n%3,o="",i=[],a=16383,c=0,u=n-r;c<u;c+=a)i.push(s(t,c,c+a>u?u:c+a));return 1===r?(e=t[n-1],o+=l[e>>2],o+=l[e<<4&63],o+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],o+=l[e>>10],o+=l[e>>4&63],o+=l[e<<2&63],o+="="),i.push(o),i.join("")}n.byteLength=o,n.toByteArray=i,n.fromByteArray=c;for(var l=[],u=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,h=p.length;d<h;++d)l[d]=p[d],u[p.charCodeAt(d)]=d;u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63},{}],2:[function(t,e,n){(function(e){/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+"use strict";function r(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(e){return!1}}function o(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function i(t,e){if(o()<e)throw new RangeError("Invalid typed array length");return a.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e),t.__proto__=a.prototype):(null===t&&(t=new a(e)),t.length=e),t}function a(t,e,n){if(!(a.TYPED_ARRAY_SUPPORT||this instanceof a))return new a(t,e,n);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return u(this,t)}return s(this,t,e,n)}function s(t,e,n,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?d(t,e,n,r):"string"==typeof e?f(t,e,n):h(t,e)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function l(t,e,n,r){return c(e),e<=0?i(t,e):void 0!==n?"string"==typeof r?i(t,e).fill(n,r):i(t,e).fill(n):i(t,e)}function u(t,e){if(c(e),t=i(t,e<0?0:0|m(e)),!a.TYPED_ARRAY_SUPPORT)for(var n=0;n<e;++n)t[n]=0;return t}function f(t,e,n){if("string"==typeof n&&""!==n||(n="utf8"),!a.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|b(e,n);t=i(t,r);var o=t.write(e,n);return o!==r&&(t=t.slice(0,o)),t}function p(t,e){var n=e.length<0?0:0|m(e.length);t=i(t,n);for(var r=0;r<n;r+=1)t[r]=255&e[r];return t}function d(t,e,n,r){if(e.byteLength,n<0||e.byteLength<n)throw new RangeError("'offset' is out of bounds");if(e.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");return e=void 0===n&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,n):new Uint8Array(e,n,r),a.TYPED_ARRAY_SUPPORT?(t=e,t.__proto__=a.prototype):t=p(t,e),t}function h(t,e){if(a.isBuffer(e)){var n=0|m(e.length);return t=i(t,n),0===t.length?t:(e.copy(t,0,0,n),t)}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||H(e.length)?i(t,0):p(t,e);if("Buffer"===e.type&&_(e.data))return p(t,e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function m(t){if(t>=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function g(t){return+t!=t&&(t=0),a.alloc(+t)}function b(t,e){if(a.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(t).length;default:if(r)return W(t).length;e=(""+e).toLowerCase(),r=!0}}function y(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,e>>>=0,n<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return D(this,e,n);case"utf8":case"utf-8":return E(this,e,n);case"ascii":return B(this,e,n);case"latin1":case"binary":return S(this,e,n);case"base64":return O(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return N(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function v(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function A(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=a.from(e,r)),a.isBuffer(e))return 0===e.length?-1:w(t,e,n,r,o);if("number"==typeof e)return e=255&e,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):w(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function w(t,e,n,r,o){function i(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}var a=1,s=t.length,c=e.length;if(void 0!==r&&(r=String(r).toLowerCase(),"ucs2"===r||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;a=2,s/=2,c/=2,n/=2}var l;if(o){var u=-1;for(l=n;l<s;l++)if(i(t,l)===i(e,u===-1?0:l-u)){if(u===-1&&(u=l),l-u+1===c)return u*a}else u!==-1&&(l-=l-u),u=-1}else for(n+c>s&&(n=s-c),l=n;l>=0;l--){for(var f=!0,p=0;p<c;p++)if(i(t,l+p)!==i(e,p)){f=!1;break}if(f)return l}return-1}function k(t,e,n,r){n=Number(n)||0;var o=t.length-n;r?(r=Number(r),r>o&&(r=o)):r=o;var i=e.length;if(i%2!==0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a<r;++a){var s=parseInt(e.substr(2*a,2),16);if(isNaN(s))return a;t[n+a]=s}return a}function x(t,e,n,r){return q(W(e,t.length-n),t,n,r)}function M(t,e,n,r){return q(Z(e),t,n,r)}function T(t,e,n,r){return M(t,e,n,r)}function R(t,e,n,r){return q(U(e),t,n,r)}function P(t,e,n,r){return q(J(e,t.length-n),t,n,r)}function O(t,e,n){return 0===e&&n===t.length?Q.fromByteArray(t):Q.fromByteArray(t.slice(e,n))}function E(t,e,n){n=Math.min(t.length,n);for(var r=[],o=e;o<n;){var i=t[o],a=null,s=i>239?4:i>223?3:i>191?2:1;if(o+s<=n){var c,l,u,f;switch(s){case 1:i<128&&(a=i);break;case 2:c=t[o+1],128===(192&c)&&(f=(31&i)<<6|63&c,f>127&&(a=f));break;case 3:c=t[o+1],l=t[o+2],128===(192&c)&&128===(192&l)&&(f=(15&i)<<12|(63&c)<<6|63&l,f>2047&&(f<55296||f>57343)&&(a=f));break;case 4:c=t[o+1],l=t[o+2],u=t[o+3],128===(192&c)&&128===(192&l)&&128===(192&u)&&(f=(15&i)<<18|(63&c)<<12|(63&l)<<6|63&u,f>65535&&f<1114112&&(a=f))}}null===a?(a=65533,s=1):a>65535&&(a-=65536,r.push(a>>>10&1023|55296),a=56320|1023&a),r.push(a),o+=s}return j(r)}function j(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var n="",r=0;r<e;)n+=String.fromCharCode.apply(String,t.slice(r,r+=tt));return n}function B(t,e,n){var r="";n=Math.min(t.length,n);for(var o=e;o<n;++o)r+=String.fromCharCode(127&t[o]);return r}function S(t,e,n){var r="";n=Math.min(t.length,n);for(var o=e;o<n;++o)r+=String.fromCharCode(t[o]);return r}function D(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);for(var o="",i=e;i<n;++i)o+=V(t[i]);return o}function N(t,e,n){for(var r=t.slice(e,n),o="",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}function Y(t,e,n){if(t%1!==0||t<0)throw new RangeError("offset is not uint");if(t+e>n)throw new RangeError("Trying to access beyond buffer length")}function F(t,e,n,r,o,i){if(!a.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||e<i)throw new RangeError('"value" argument is out of bounds');if(n+r>t.length)throw new RangeError("Index out of range")}function z(t,e,n,r){e<0&&(e=65535+e+1);for(var o=0,i=Math.min(t.length-n,2);o<i;++o)t[n+o]=(e&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function I(t,e,n,r){e<0&&(e=4294967295+e+1);for(var o=0,i=Math.min(t.length-n,4);o<i;++o)t[n+o]=e>>>8*(r?o:3-o)&255}function L(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function K(t,e,n,r,o){return o||L(t,e,n,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(t,e,n,r,23,4),n+4}function G(t,e,n,r,o){return o||L(t,e,n,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(t,e,n,r,52,8),n+8}function C(t){if(t=X(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function X(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function V(t){return t<16?"0"+t.toString(16):t.toString(16)}function W(t,e){e=e||1/0;for(var n,r=t.length,o=null,i=[],a=0;a<r;++a){if(n=t.charCodeAt(a),n>55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=(o-55296<<10|n-56320)+65536}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function Z(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n));return e}function J(t,e){for(var n,r,o,i=[],a=0;a<t.length&&!((e-=2)<0);++a)n=t.charCodeAt(a),r=n>>8,o=n%256,i.push(o),i.push(r);return i}function U(t){return Q.toByteArray(C(t))}function q(t,e,n,r){for(var o=0;o<r&&!(o+n>=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function H(t){return t!==t}var Q=t("base64-js"),$=t("ieee754"),_=t("isarray");n.Buffer=a,n.SlowBuffer=g,n.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:r(),n.kMaxLength=o(),a.poolSize=8192,a._augment=function(t){return t.__proto__=a.prototype,t},a.from=function(t,e,n){return s(null,t,e,n)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(t,e,n){return l(null,t,e,n)},a.allocUnsafe=function(t){return u(null,t)},a.allocUnsafeSlow=function(t){return u(null,t)},a.isBuffer=function(t){return!(null==t||!t._isBuffer)},a.compare=function(t,e){if(!a.isBuffer(t)||!a.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,o=0,i=Math.min(n,r);o<i;++o)if(t[o]!==e[o]){n=t[o],r=e[o];break}return n<r?-1:r<n?1:0},a.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},a.concat=function(t,e){if(!_(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return a.alloc(0);var n;if(void 0===e)for(e=0,n=0;n<t.length;++n)e+=t[n].length;var r=a.allocUnsafe(e),o=0;for(n=0;n<t.length;++n){var i=t[n];if(!a.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(r,o),o+=i.length}return r},a.byteLength=b,a.prototype._isBuffer=!0,a.prototype.swap16=function(){var t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)v(this,e,e+1);return this},a.prototype.swap32=function(){var t=this.length;if(t%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)v(this,e,e+3),v(this,e+1,e+2);return this},a.prototype.swap64=function(){var t=this.length;if(t%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)v(this,e,e+7),v(this,e+1,e+6),v(this,e+2,e+5),v(this,e+3,e+4);return this},a.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?E(this,0,t):y.apply(this,arguments)},a.prototype.equals=function(t){if(!a.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===a.compare(this,t)},a.prototype.inspect=function(){var t="",e=n.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),"<Buffer "+t+">"},a.prototype.compare=function(t,e,n,r,o){if(!a.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(e>>>=0,n>>>=0,r>>>=0,o>>>=0,this===t)return 0;for(var i=o-r,s=n-e,c=Math.min(i,s),l=this.slice(r,o),u=t.slice(e,n),f=0;f<c;++f)if(l[f]!==u[f]){i=l[f],s=u[f];break}return i<s?-1:s<i?1:0},a.prototype.includes=function(t,e,n){return this.indexOf(t,e,n)!==-1},a.prototype.indexOf=function(t,e,n){return A(this,t,e,n,!0)},a.prototype.lastIndexOf=function(t,e,n){return A(this,t,e,n,!1)},a.prototype.write=function(t,e,n,r){if(void 0===e)r="utf8",n=this.length,e=0;else if(void 0===n&&"string"==typeof e)r=e,n=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e=0|e,isFinite(n)?(n=0|n,void 0===r&&(r="utf8")):(r=n,n=void 0)}var o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":return M(this,t,e,n);case"latin1":case"binary":return T(this,t,e,n);case"base64":return R(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;a.prototype.slice=function(t,e){var n=this.length;t=~~t,e=void 0===e?n:~~e,t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),e<t&&(e=t);var r;if(a.TYPED_ARRAY_SUPPORT)r=this.subarray(t,e),r.__proto__=a.prototype;else{var o=e-t;r=new a(o,(void 0));for(var i=0;i<o;++i)r[i]=this[i+t]}return r},a.prototype.readUIntLE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t],o=1,i=0;++i<e&&(o*=256);)r+=this[t+i]*o;return r},a.prototype.readUIntBE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t+--e],o=1;e>0&&(o*=256);)r+=this[t+--e]*o;return r},a.prototype.readUInt8=function(t,e){return e||Y(t,1,this.length),this[t]},a.prototype.readUInt16LE=function(t,e){return e||Y(t,2,this.length),this[t]|this[t+1]<<8},a.prototype.readUInt16BE=function(t,e){return e||Y(t,2,this.length),this[t]<<8|this[t+1]},a.prototype.readUInt32LE=function(t,e){return e||Y(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},a.prototype.readUInt32BE=function(t,e){return e||Y(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},a.prototype.readIntLE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t],o=1,i=0;++i<e&&(o*=256);)r+=this[t+i]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*e)),r},a.prototype.readIntBE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=e,o=1,i=this[t+--r];r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},a.prototype.readInt8=function(t,e){return e||Y(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},a.prototype.readInt16LE=function(t,e){e||Y(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt16BE=function(t,e){e||Y(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt32LE=function(t,e){return e||Y(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},a.prototype.readInt32BE=function(t,e){return e||Y(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},a.prototype.readFloatLE=function(t,e){return e||Y(t,4,this.length),$.read(this,t,!0,23,4)},a.prototype.readFloatBE=function(t,e){return e||Y(t,4,this.length),$.read(this,t,!1,23,4)},a.prototype.readDoubleLE=function(t,e){return e||Y(t,8,this.length),$.read(this,t,!0,52,8)},a.prototype.readDoubleBE=function(t,e){return e||Y(t,8,this.length),$.read(this,t,!1,52,8)},a.prototype.writeUIntLE=function(t,e,n,r){if(t=+t,e=0|e,n=0|n,!r){var o=Math.pow(2,8*n)-1;F(this,t,e,n,o,0)}var i=1,a=0;for(this[e]=255&t;++a<n&&(i*=256);)this[e+a]=t/i&255;return e+n},a.prototype.writeUIntBE=function(t,e,n,r){if(t=+t,e=0|e,n=0|n,!r){var o=Math.pow(2,8*n)-1;F(this,t,e,n,o,0)}var i=n-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+n},a.prototype.writeUInt8=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,1,255,0),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},a.prototype.writeUInt16LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):z(this,t,e,!0),e+2},a.prototype.writeUInt16BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):z(this,t,e,!1),e+2},a.prototype.writeUInt32LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):I(this,t,e,!0),e+4},a.prototype.writeUInt32BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},a.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e=0|e,!r){var o=Math.pow(2,8*n-1);F(this,t,e,n,o-1,-o)}var i=0,a=1,s=0;for(this[e]=255&t;++i<n&&(a*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/a>>0)-s&255;return e+n},a.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e=0|e,!r){var o=Math.pow(2,8*n-1);F(this,t,e,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[e+i]=255&t;--i>=0&&(a*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/a>>0)-s&255;return e+n},a.prototype.writeInt8=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,1,127,-128),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},a.prototype.writeInt16LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):z(this,t,e,!0),e+2},a.prototype.writeInt16BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):z(this,t,e,!1),e+2},a.prototype.writeInt32LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):I(this,t,e,!0),e+4},a.prototype.writeInt32BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},a.prototype.writeFloatLE=function(t,e,n){return K(this,t,e,!0,n)},a.prototype.writeFloatBE=function(t,e,n){return K(this,t,e,!1,n)},a.prototype.writeDoubleLE=function(t,e,n){return G(this,t,e,!0,n)},a.prototype.writeDoubleBE=function(t,e,n){return G(this,t,e,!1,n)},a.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e<r-n&&(r=t.length-e+n);var o,i=r-n;if(this===t&&n<e&&e<r)for(o=i-1;o>=0;--o)t[o+e]=this[o+n];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(o=0;o<i;++o)t[o+e]=this[o+n];else Uint8Array.prototype.set.call(t,this.subarray(n,n+i),e);return i},a.prototype.fill=function(t,e,n,r){if("string"==typeof t){if("string"==typeof e?(r=e,e=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===t.length){var o=t.charCodeAt(0);o<256&&(t=o)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!a.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof t&&(t=255&t);if(e<0||this.length<e||this.length<n)throw new RangeError("Out of range index");if(n<=e)return this;e>>>=0,n=void 0===n?this.length:n>>>0,t||(t=0);var i;if("number"==typeof t)for(i=e;i<n;++i)this[i]=t;else{var s=a.isBuffer(t)?t:W(new a(t,r).toString()),c=s.length;for(i=0;i<n-e;++i)this[i+e]=s[i%c]}return this};var et=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":1,ieee754:4,isarray:5}],3:[function(e,n,r){(function(e){/*!
+ * @license deepcopy.js Copyright(c) 2013 sasa+1
+ * https://github.com/sasaplus1/deepcopy.js
+ * Released under the MIT license.
+ */
+!function(e,o){"object"==typeof r&&"object"==typeof n?n.exports=o():"function"==typeof t&&t.amd?t([],o):"object"==typeof r?r.deepcopy=o():e.deepcopy=o()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";t.exports=n(3)},function(t,n){"use strict";function r(t,e){if("[object Array]"!==o.call(t))throw new TypeError("array must be an Array");var n=void 0,r=void 0,i=void 0;for(n=0,r=t.length;r>n;++n)if(i=t[n],i===e||i!==i&&e!==e)return n;return-1}n.__esModule=!0;var o=Object.prototype.toString,i="undefined"!=typeof e?function(t){return e.isBuffer(t)}:function(){return!1},a="function"==typeof Object.keys?function(t){return Object.keys(t)}:function(t){var e=typeof t;if(null===t||"function"!==e&&"object"!==e)throw new TypeError("obj must be an Object");var n=[],r=void 0;for(r in t)Object.prototype.hasOwnProperty.call(t,r)&&n.push(r);return n},s="function"==typeof Symbol?function(t){return Object.getOwnPropertySymbols(t)}:function(){return[]};n.getKeys=a,n.getSymbols=s,n.indexOf=r,n.isBuffer=i},function(t,n,r){"use strict";function o(t,e){var n=a(t);return null!==n?n:i(t,e)}function i(t,n){if("function"!=typeof n)throw new TypeError("customizer is must be a Function");if("function"==typeof t){var r=String(t);return/^\s*function\s*\S*\([^\)]*\)\s*{\s*\[native code\]\s*}/.test(r)?t:new Function("return "+String(r))()}var o=c.call(t);if("[object Array]"===o)return[];if("[object Object]"===o&&t.constructor===Object)return{};if("[object Date]"===o)return new Date(t.getTime());if("[object RegExp]"===o){var i=String(t),a=i.lastIndexOf("/");return new RegExp(i.slice(1,a),i.slice(a+1))}if((0,s.isBuffer)(t)){var l=new e(t.length);return t.copy(l),l}var u=n(t);return void 0!==u?u:null}function a(t){var e=typeof t;return null!==t&&"object"!==e&&"function"!==e?t:null}n.__esModule=!0,n.copyValue=n.copyCollection=n.copy=void 0;var s=r(1),c=Object.prototype.toString;n.copy=o,n.copyCollection=i,n.copyValue=a},function(t,e,n){"use strict";function r(t){}function o(t){var e=arguments.length<=1||void 0===arguments[1]?r:arguments[1];if(null===t)return null;var n=(0,a.copyValue)(t);if(null!==n)return n;var o=(0,a.copyCollection)(t,e),s=null!==o?o:t,c=[t],l=[s];return i(t,e,s,c,l)}function i(t,e,n,r,o){if(null===t)return null;var c=(0,a.copyValue)(t);if(null!==c)return c;var l=(0,s.getKeys)(t).concat((0,s.getSymbols)(t)),u=void 0,f=void 0,p=void 0,d=void 0,h=void 0,m=void 0,g=void 0,b=void 0;for(u=0,f=l.length;f>u;++u)p=l[u],d=t[p],h=(0,s.indexOf)(r,d),m=void 0,g=void 0,b=void 0,-1===h?(m=(0,a.copy)(d,e),g=null!==m?m:d,null!==d&&/^(?:function|object)$/.test(typeof d)&&(r.push(d),o.push(g))):b=o[h],n[p]=b||i(d,e,g,r,o);return n}e.__esModule=!0;var a=n(2),s=n(1);e["default"]=o,t.exports=e["default"]}])})}).call(this,e("buffer").Buffer)},{buffer:2}],4:[function(t,e,n){n.read=function(t,e,n,r,o){var i,a,s=8*o-r-1,c=(1<<s)-1,l=c>>1,u=-7,f=n?o-1:0,p=n?-1:1,d=t[e+f];for(f+=p,i=d&(1<<-u)-1,d>>=-u,u+=s;u>0;i=256*i+t[e+f],f+=p,u-=8);for(a=i&(1<<-u)-1,i>>=-u,u+=r;u>0;a=256*a+t[e+f],f+=p,u-=8);if(0===i)i=1-l;else{if(i===c)return a?NaN:(d?-1:1)*(1/0);a+=Math.pow(2,r),i-=l}return(d?-1:1)*a*Math.pow(2,i-r)},n.write=function(t,e,n,r,o,i){var a,s,c,l=8*i-o-1,u=(1<<l)-1,f=u>>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:i-1,h=r?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=u):(a=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-a))<1&&(a--,c*=2),e+=a+f>=1?p/c:p*Math.pow(2,1-f),e*c>=2&&(a++,c/=2),a+f>=u?(s=0,a=u):a+f>=1?(s=(e*c-1)*Math.pow(2,o),a+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,o),a=0));o>=8;t[n+d]=255&s,d+=h,s/=256,o-=8);for(a=a<<o|s,l+=o;l>0;t[n+d]=255&a,d+=h,a/=256,l-=8);t[n+d-h]|=128*m}},{}],5:[function(t,e,n){var r={}.toString;e.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},{}],6:[function(t,e,n){function r(t){return/^[a-z_$][0-9a-z_$]*$/gi.test(t)&&!i.test(t)}function o(t){if(a)return t.toString();var e=t.source.replace(/\//g,function(t,e,n){return 0===e||"\\"!==n[e-1]?"\\/":"/"}),n=(t.global&&"g"||"")+(t.ignoreCase&&"i"||"")+(t.multiline&&"m"||"");return"/"+e+"/"+n}/* toSource by Marcello Bastea-Forte - zlib license */
+e.exports=function(t,e,n,i){function a(t,e,n,i,s){function c(t){return n.slice(1)+t.join(","+(n&&"\n")+l)+(n?" ":"")}var l=i+n;switch(t=e?e(t):t,typeof t){case"string":return JSON.stringify(t);case"boolean":case"number":case"undefined":return""+t;case"function":return t.toString()}if(null===t)return"null";if(t instanceof RegExp)return o(t);if(t instanceof Date)return"new Date("+t.getTime()+")";var u=s.indexOf(t)+1;if(u>0)return"{$circularReference:"+u+"}";if(s.push(t),Array.isArray(t))return"["+c(t.map(function(t){return a(t,e,n,l,s.slice())}))+"]";var f=Object.keys(t);return f.length?"{"+c(f.map(function(o){return(r(o)?o:JSON.stringify(o))+":"+a(t[o],e,n,l,s.slice())}))+"}":"{}"}var s=[];return a(t,e,void 0===n?" ":n||"",i||"",s)};var i=/^(abstract|boolean|break|byte|case|catch|char|class|const|continue|debugger|default|delete|do|double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|undefined|var|void|volatile|while|with)$/,a="\\/"===new RegExp("/").source},{}],7:[function(t,e,n){e.exports={name:"pebble-clay",version:"1.0.4",description:"Pebble Config Framework",scripts:{"test-travis":"./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run --browsers chromeTravisCI && ./node_modules/.bin/eslint ./","test-debug":"(export DEBUG=true && ./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --no-single-run)",test:"./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run",lint:"./node_modules/.bin/eslint ./",build:"gulp",dev:"gulp dev","pebble-clean":"rm -rf tmp src/js/index.js && pebble clean","pebble-publish":"npm run pebble-clean && npm run build && pebble build && pebble package publish && npm run pebble-clean","pebble-build":"npm run build && pebble build"},repository:{type:"git",url:"git+https://github.com/pebble/clay.git"},keywords:["pebble","config","configuration","pebble-package"],author:"Pebble Technology",license:"MIT",bugs:{url:"https://github.com/pebble/clay/issues"},pebble:{projectType:"package",sdkVersion:"3",targetPlatforms:["aplite","basalt","chalk","diorite","emery"],resources:{media:[]},capabilities:["configurable"]},homepage:"https://github.com/pebble/clay#readme",devDependencies:{autoprefixer:"^6.3.1",bourbon:"^4.2.6",browserify:"^13.0.0","browserify-istanbul":"^0.2.1",chai:"^3.4.1",deamdify:"^0.2.0",deepcopy:"^0.6.1",del:"^2.0.2",eslint:"^1.5.1","eslint-config-pebble":"^1.2.0","eslint-plugin-standard":"^1.3.1",gulp:"^3.9.0","gulp-autoprefixer":"^3.1.0","gulp-htmlmin":"^1.3.0","gulp-inline":"0.0.15","gulp-insert":"^0.5.0","gulp-sass":"^2.1.1","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.5.2",joi:"^6.10.1",karma:"^0.13.19","karma-browserify":"^5.0.1","karma-chrome-launcher":"^0.2.2","karma-coverage":"^0.5.3","karma-mocha":"^0.2.1","karma-mocha-reporter":"^1.1.5","karma-source-map-support":"^1.1.0","karma-threshold-reporter":"^0.1.15",mocha:"^2.3.4",postcss:"^5.0.14","require-from-string":"^1.1.0",sassify:"^0.9.1",sinon:"^1.17.3",stringify:"^3.2.0",through:"^2.3.8",tosource:"^1.0.0","vinyl-buffer":"^1.0.0","vinyl-source-stream":"^1.1.0",watchify:"^3.7.0"},dependencies:{}}},{}],8:[function(t,e,n){"use strict";e.exports={name:"button",template:t("../../templates/components/button.tpl"),style:t("../../styles/clay/components/button.scss"),manipulator:"button",defaults:{primary:!1,attributes:{},description:""}}},{"../../styles/clay/components/button.scss":21,"../../templates/components/button.tpl":30}],9:[function(t,e,n){"use strict";e.exports={name:"checkboxgroup",template:t("../../templates/components/checkboxgroup.tpl"),style:t("../../styles/clay/components/checkboxgroup.scss"),manipulator:"checkboxgroup",defaults:{label:"",options:[],description:""}}},{"../../styles/clay/components/checkboxgroup.scss":22,"../../templates/components/checkboxgroup.tpl":31}],10:[function(t,e,n){"use strict";e.exports={name:"color",template:t("../../templates/components/color.tpl"),style:t("../../styles/clay/components/color.scss"),manipulator:"color",defaults:{label:"",description:""},initialize:function(t,e){function n(t){if("number"==typeof t)t=t.toString(16);else if(!t)return"transparent";return t=r(t),"#"+(f?p[t]:t)}function r(t){for(t=t.toLowerCase();t.length<6;)t="0"+t;return t}function o(t){switch(typeof t){case"number":return r(t.toString(16));case"string":return t.replace(/^#|^0x/,"");default:return t}}function i(t){return t.reduce(function(t,e){return t.concat(e)},[])}function a(t){t=t.replace(/^#|^0x/,"");var e=parseInt(t.slice(0,2),16)/255,n=parseInt(t.slice(2,4),16)/255,r=parseInt(t.slice(4),16)/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92;var o=(.4124*e+.3576*n+.1805*r)/.95047,i=(.2126*e+.7152*n+.0722*r)/1,a=(.0193*e+.1192*n+.9505*r)/1.08883;return o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,i=i>.008856?Math.pow(i,1/3):7.787*i+16/116,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,[116*i-16,500*(o-i),200*(i-a)]}function s(t,e){var n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2];return Math.sqrt(Math.pow(n,2)+Math.pow(r,2)+Math.pow(o,2))}function c(){return!e.meta.activeWatchInfo||2===e.meta.activeWatchInfo.firmware.major||["aplite","diorite"].indexOf(e.meta.activeWatchInfo.platform)>-1&&!u.config.allowGray?d.BLACK_WHITE:["aplite","diorite"].indexOf(e.meta.activeWatchInfo.platform)>-1&&u.config.allowGray?d.GRAY:d.COLOR}var l=t.HTML,u=this;u.roundColorToLayout=function(t){var e=o(t);if(m.indexOf(e)===-1){var n=a(e),r=m.map(function(t){var e=a(o(t));return s(n,e)}),i=Math.min.apply(Math,r),c=r.indexOf(i);e=m[c]}return parseInt(e,16)};var f=u.config.sunlight!==!1,p={"000000":"000000","000055":"001e41","0000aa":"004387","0000ff":"0068ca","005500":"2b4a2c","005555":"27514f","0055aa":"16638d","0055ff":"007dce","00aa00":"5e9860","00aa55":"5c9b72","00aaaa":"57a5a2","00aaff":"4cb4db","00ff00":"8ee391","00ff55":"8ee69e","00ffaa":"8aebc0","00ffff":"84f5f1",550000:"4a161b",550055:"482748","5500aa":"40488a","5500ff":"2f6bcc",555500:"564e36",555555:"545454","5555aa":"4f6790","5555ff":"4180d0","55aa00":"759a64","55aa55":"759d76","55aaaa":"71a6a4","55aaff":"69b5dd","55ff00":"9ee594","55ff55":"9de7a0","55ffaa":"9becc2","55ffff":"95f6f2",aa0000:"99353f",aa0055:"983e5a",aa00aa:"955694",aa00ff:"8f74d2",aa5500:"9d5b4d",aa5555:"9d6064",aa55aa:"9a7099",aa55ff:"9587d5",aaaa00:"afa072",aaaa55:"aea382",aaaaaa:"ababab",ffffff:"ffffff",aaaaff:"a7bae2",aaff00:"c9e89d",aaff55:"c9eaa7",aaffaa:"c7f0c8",aaffff:"c3f9f7",ff0000:"e35462",ff0055:"e25874",ff00aa:"e16aa3",ff00ff:"de83dc",ff5500:"e66e6b",ff5555:"e6727c",ff55aa:"e37fa7",ff55ff:"e194df",ffaa00:"f1aa86",ffaa55:"f1ad93",ffaaaa:"efb5b8",ffaaff:"ecc3eb",ffff00:"ffeeab",ffff55:"fff1b5",ffffaa:"fff6d3"},d={COLOR:[[!1,!1,"55ff00","aaff55",!1,"ffff55","ffffaa",!1,!1],[!1,"aaffaa","55ff55","00ff00","aaff00","ffff00","ffaa55","ffaaaa",!1],["55ffaa","00ff55","00aa00","55aa00","aaaa55","aaaa00","ffaa00","ff5500","ff5555"],["aaffff","00ffaa","00aa55","55aa55","005500","555500","aa5500","ff0000","ff0055"],[!1,"55aaaa","00aaaa","005555","ffffff","000000","aa5555","aa0000",!1],["55ffff","00ffff","00aaff","0055aa","aaaaaa","555555","550000","aa0055","ff55aa"],["55aaff","0055ff","0000ff","0000aa","000055","550055","aa00aa","ff00aa","ffaaff"],[!1,"5555aa","5555ff","5500ff","5500aa","aa00ff","ff00ff","ff55ff",!1],[!1,!1,!1,"aaaaff","aa55ff","aa55aa",!1,!1,!1]],GRAY:[["000000","aaaaaa","ffffff"]],BLACK_WHITE:[["000000","ffffff"]]},h=u.config.layout||c();"string"==typeof h&&(h=d[h]),Array.isArray(h[0])||(h=[h]);var m=i(h).map(function(t){return o(t)}).filter(function(t){return t}),g="",b=h.length,y=0;h.forEach(function(t){y=t.length>y?t.length:y});for(var v=100/y,A=100/b,w=u.$element,k=0;k<b;k++)for(var x=0;x<y;x++){var M=o(h[k][x]),T=M?" selectable":"",R=0===k&&0===x||0===k&&!h[k][x-1]||!h[k][x-1]&&!h[k-1][x]?" rounded-tl":"",P=0===k&&!h[k][x+1]||!h[k][x+1]&&!h[k-1][x]?" rounded-tr ":"",O=k===h.length-1&&0===x||k===h.length-1&&!h[k][x-1]||!h[k][x-1]&&!h[k+1][x]?" rounded-bl":"",E=k===h.length-1&&!h[k][x+1]||!h[k][x+1]&&!h[k+1][x]?" rounded-br":"";g+='<i class="color-box '+T+R+P+O+E+'" '+(M?'data-value="'+parseInt(M,16)+'" ':"")+'style="width:'+v+"%; height:"+A+"%; background:"+n(M)+';"></i>'}var j=0;3===y&&(j=5),2===y&&(j=8);var B=j*v/A+"%",S=j+"%";w.select(".color-box-container").add(l(g)).set("$paddingTop",B).set("$paddingRight",S).set("$paddingBottom",B).set("$paddingLeft",S),w.select(".color-box-wrap").set("$paddingBottom",v/A*100+"%");var D=w.select(".value"),N=w.select(".picker-wrap"),Y=u.$manipulatorTarget.get("disabled");w.select("label").on("click",function(){Y||N.set("show")}),u.on("change",function(){var t=u.get();D.set("$background-color",n(t)),w.select(".color-box").set("-selected"),w.select('.color-box[data-value="'+t+'"]').set("+selected")}),w.select(".color-box.selectable").on("click",function(t){u.set(parseInt(t.target.dataset.value,10)),N.set("-show")}),N.on("click",function(){N.set("-show")}),u.on("disabled",function(){Y=!0}),u.on("enabled",function(){Y=!1}),u._layout=h}}},{"../../styles/clay/components/color.scss":23,"../../templates/components/color.tpl":32}],11:[function(t,e,n){"use strict";e.exports={name:"footer",template:t("../../templates/components/footer.tpl"),manipulator:"html"}},{"../../templates/components/footer.tpl":33}],12:[function(t,e,n){"use strict";e.exports={name:"heading",template:t("../../templates/components/heading.tpl"),manipulator:"html",defaults:{size:4}}},{"../../templates/components/heading.tpl":34}],13:[function(t,e,n){"use strict";e.exports={color:t("./color"),footer:t("./footer"),heading:t("./heading"),input:t("./input"),select:t("./select"),submit:t("./submit"),text:t("./text"),toggle:t("./toggle"),radiogroup:t("./radiogroup"),checkboxgroup:t("./checkboxgroup"),button:t("./button"),slider:t("./slider")}},{"./button":8,"./checkboxgroup":9,"./color":10,"./footer":11,"./heading":12,"./input":14,"./radiogroup":15,"./select":16,"./slider":17,"./submit":18,"./text":19,"./toggle":20}],14:[function(t,e,n){"use strict";e.exports={name:"input",template:t("../../templates/components/input.tpl"),style:t("../../styles/clay/components/input.scss"),manipulator:"val",defaults:{label:"",description:"",attributes:{}}}},{"../../styles/clay/components/input.scss":24,"../../templates/components/input.tpl":35}],15:[function(t,e,n){"use strict";e.exports={name:"radiogroup",template:t("../../templates/components/radiogroup.tpl"),style:t("../../styles/clay/components/radiogroup.scss"),manipulator:"radiogroup",defaults:{label:"",options:[],description:"",attributes:{}}}},{"../../styles/clay/components/radiogroup.scss":25,"../../templates/components/radiogroup.tpl":36}],16:[function(t,e,n){"use strict";e.exports={name:"select",template:t("../../templates/components/select.tpl"),style:t("../../styles/clay/components/select.scss"),manipulator:"val",defaults:{label:"",options:[],description:"",attributes:{}},initialize:function(){function t(){var t=e.$manipulatorTarget.get("selectedIndex"),r=e.$manipulatorTarget.select("option"),o=r[t]&&r[t].innerHTML;n.set("innerHTML",o)}var e=this,n=e.$element.select(".value");t(),e.on("change",t)}}},{"../../styles/clay/components/select.scss":26,"../../templates/components/select.tpl":37}],17:[function(t,e,n){"use strict";e.exports={name:"slider",template:t("../../templates/components/slider.tpl"),style:t("../../styles/clay/components/slider.scss"),manipulator:"slider",defaults:{label:"",description:"",min:0,max:100,step:1,attributes:{}},initialize:function(){function t(){var t=e.get().toFixed(e.precision);n.set("value",t),r.set("innerHTML",t)}var e=this,n=e.$element.select(".value"),r=e.$element.select(".value-pad"),o=e.$manipulatorTarget,i=o.get("step");i=i.toString(10).split(".")[1],e.precision=i?i.length:0,e.on("change",t),o.on("|input",t),t(),n.on("|input",function(){r.set("innerHTML",this.get("value"))}),n.on("|change",function(){e.set(this.get("value")),t()})}}},{"../../styles/clay/components/slider.scss":27,"../../templates/components/slider.tpl":38}],18:[function(t,e,n){"use strict";e.exports={name:"submit",template:t("../../templates/components/submit.tpl"),style:t("../../styles/clay/components/submit.scss"),manipulator:"button",defaults:{attributes:{}}}},{"../../styles/clay/components/submit.scss":28,"../../templates/components/submit.tpl":39}],19:[function(t,e,n){"use strict";e.exports={name:"text",template:t("../../templates/components/text.tpl"),manipulator:"html"}},{"../../templates/components/text.tpl":40}],20:[function(t,e,n){"use strict";e.exports={name:"toggle",template:t("../../templates/components/toggle.tpl"),style:t("../../styles/clay/components/toggle.scss"),manipulator:"checked",defaults:{label:"",description:"",attributes:{}}}},{"../../styles/clay/components/toggle.scss":29,"../../templates/components/toggle.tpl":41}],21:[function(t,e,n){e.exports=".component-button { text-align: center; }\n\n.section .component-button { padding-bottom: 0; }\n\n.component-button .description { padding-left: 0; padding-right: 0; }\n"},{}],22:[function(t,e,n){e.exports=".component-checkbox { display: block; }\n\n.section .component-checkbox { padding-right: 0.375rem; }\n\n.component-checkbox > .label { display: block; padding-bottom: 0.35rem; }\n\n.component-checkbox .checkbox-group { padding-bottom: 0.35rem; }\n\n.component-checkbox .checkbox-group label { padding: 0.35rem 0.375rem; }\n\n.component-checkbox .checkbox-group .label { font-size: 0.9em; }\n\n.component-checkbox .checkbox-group input { opacity: 0; position: absolute; }\n\n.component-checkbox .checkbox-group i { display: block; position: relative; border-radius: 0.25rem; width: 1.4rem; height: 1.4rem; border: 0.11765rem solid #767676; -webkit-flex-shrink: 0; flex-shrink: 0; }\n\n.component-checkbox .checkbox-group input:checked + i { border-color: #ff4700; background: #ff4700; }\n\n.component-checkbox .checkbox-group input:checked + i:after { content: ''; box-sizing: border-box; -webkit-transform: rotate(45deg); transform: rotate(45deg); position: absolute; left: 0.35rem; top: -0.05rem; display: block; width: 0.5rem; height: 1rem; border: 0 solid #ffffff; border-right-width: 0.11765rem; border-bottom-width: 0.11765rem; }\n\n.component-checkbox .description { padding-left: 0; padding-right: 0; }\n"},{}],23:[function(t,e,n){e.exports=".section .component-color { padding: 0; }\n\n.component-color .value { width: 2.2652rem; height: 1.4rem; border-radius: 0.7rem; box-shadow: 0 0.1rem 0.1rem #2f2f2f; display: block; background: #000; }\n\n.component-color .picker-wrap { left: 0; top: 0; right: 0; bottom: 0; position: fixed; padding: 0.7rem 0.375rem; background: rgba(0, 0, 0, 0.65); opacity: 0; -webkit-transition: opacity 100ms ease-in 175ms; transition: opacity 100ms ease-in 175ms; pointer-events: none; z-index: 100; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -webkit-align-items: center; align-items: center; }\n\n.component-color .picker-wrap .picker { padding: 0.7rem 0.75rem; background: #484848; box-shadow: 0 0.17647rem 0.88235rem rgba(0, 0, 0, 0.4); border-radius: 0.25rem; width: 100%; max-width: 26rem; overflow: auto; }\n\n.component-color .picker-wrap.show { -webkit-transition-delay: 0ms; transition-delay: 0ms; pointer-events: auto; opacity: 1; }\n\n.component-color .color-box-wrap { box-sizing: border-box; position: relative; height: 0; width: 100%; padding: 0 0 100% 0; }\n\n.component-color .color-box-wrap .color-box-container { position: absolute; height: 99.97%; width: 100%; left: 0; top: 0; }\n\n.component-color .color-box-wrap .color-box-container .color-box { float: left; cursor: pointer; -webkit-tap-highlight-color: transparent; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-tl { border-top-left-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-tr { border-top-right-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-bl { border-bottom-left-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-br { border-bottom-right-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.selected { -webkit-transform: scale(1.1); transform: scale(1.1); border-radius: 0.25rem; box-shadow: #111 0 0 0.24rem; position: relative; z-index: 100; }\n"},{}],24:[function(t,e,n){e.exports=".section .component-input { padding: 0; }\n\n.component-input label { display: block; }\n\n.component-input .label { padding-bottom: 0.7rem; }\n\n.component-input .input { position: relative; min-width: 100%; margin-top: 0.7rem; margin-left: 0; }\n\n.component-input input { display: block; width: 100%; background: #333333; border-radius: 0.25rem; padding: 0.35rem 0.375rem; border: none; vertical-align: baseline; color: #ffffff; font-size: inherit; -webkit-appearance: none; appearance: none; min-height: 2.1rem; }\n\n.component-input input::-webkit-input-placeholder { color: #858585; }\n\n.component-input input::-moz-placeholder { color: #858585; }\n\n.component-input input:-moz-placeholder { color: #858585; }\n\n.component-input input:-ms-input-placeholder { color: #858585; }\n\n.component-input input:focus { border: none; box-shadow: none; }\n\n.component-input input:focus::-webkit-input-placeholder { color: #666666; }\n\n.component-input input:focus::-moz-placeholder { color: #666666; }\n\n.component-input input:focus:-moz-placeholder { color: #666666; }\n\n.component-input input:focus:-ms-input-placeholder { color: #666666; }\n"},{}],25:[function(t,e,n){e.exports=".component-radio { display: block; }\n\n.section .component-radio { padding-right: 0.375rem; }\n\n.component-radio > .label { display: block; padding-bottom: 0.35rem; }\n\n.component-radio .radio-group { padding-bottom: 0.35rem; }\n\n.component-radio .radio-group label { padding: 0.35rem 0.375rem; }\n\n.component-radio .radio-group .label { font-size: 0.9em; }\n\n.component-radio .radio-group input { opacity: 0; position: absolute; }\n\n.component-radio .radio-group i { display: block; position: relative; border-radius: 1.4rem; width: 1.4rem; height: 1.4rem; border: 2px solid #767676; -webkit-flex-shrink: 0; flex-shrink: 0; }\n\n.component-radio .radio-group input:checked + i { border-color: #ff4700; }\n\n.component-radio .radio-group input:checked + i:after { content: ''; display: block; position: absolute; left: 15%; right: 15%; top: 15%; bottom: 15%; border-radius: 1.4rem; background: #ff4700; }\n\n.component-radio .description { padding-left: 0; padding-right: 0; }\n"},{}],26:[function(t,e,n){e.exports='.section .component-select { padding: 0; }\n\n.component-select label { position: relative; }\n\n.component-select .value { position: relative; padding-right: 1.1rem; display: block; }\n\n.component-select .value:after { content: ""; position: absolute; right: 0; top: 50%; margin-top: -0.1rem; height: 0; width: 0; border-left: 0.425rem solid transparent; border-right: 0.425rem solid transparent; border-top: 0.425rem solid #ff4700; }\n\n.component-select select { opacity: 0; position: absolute; display: block; left: 0; right: 0; top: 0; bottom: 0; width: 100%; border: none; margin: 0; padding: 0; }\n'},{}],27:[function(t,e,n){e.exports=".section .component-slider { padding: 0; }\n\n.component-slider label { display: block; }\n\n.component-slider .label-container { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center; width: 100%; padding-bottom: 0.7rem; }\n\n.component-slider .label { -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; min-width: 1rem; display: block; padding-right: 0.75rem; }\n\n.component-slider .value-wrap { display: block; position: relative; }\n\n.component-slider .value, .component-slider .value-pad { display: block; background: #333333; border-radius: 0.25rem; padding: 0.35rem 0.375rem; border: none; vertical-align: baseline; color: #ffffff; text-align: right; margin: 0; min-width: 1rem; }\n\n.component-slider .value-pad { visibility: hidden; }\n\n.component-slider .value-pad:before { content: ' '; display: inline-block; }\n\n.component-slider .value { max-width: 100%; position: absolute; left: 0; top: 0; }\n\n.component-slider .input-wrap { padding: 0 0.75rem 0.7rem; }\n\n.component-slider .input { display: block; position: relative; min-width: 100%; height: 1.4rem; overflow: hidden; margin-left: 0; }\n\n.component-slider .input:before { content: ''; display: block; position: absolute; height: 0.17647rem; background: #666666; width: 100%; top: 0.61176rem; }\n\n.component-slider .input .slider { display: block; width: 100%; -webkit-appearance: none; appearance: none; position: relative; height: 1.4rem; margin: 0; background-color: transparent; }\n\n.component-slider .input .slider:focus { outline: none; }\n\n.component-slider .input .slider::-webkit-slider-runnable-track { border: none; height: 1.4rem; width: 100%; background-color: transparent; }\n\n.component-slider .input .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; position: relative; height: 1.4rem; width: 1.4rem; background-color: #ff4700; border-radius: 50%; }\n\n.component-slider .input .slider::-webkit-slider-thumb:before { content: \"\"; position: absolute; left: -1000px; top: 0.61176rem; height: 0.17647rem; width: 1001px; background: #ff4700; }\n"},{}],28:[function(t,e,n){e.exports=".component-submit { text-align: center; }\n"},{}],29:[function(t,e,n){e.exports=".section .component-toggle { padding: 0; }\n\n.component-toggle input { display: none; }\n\n.component-toggle .graphic { display: inline-block; position: relative; }\n\n.component-toggle .graphic .slide { display: block; border-radius: 1.05rem; height: 1.05rem; width: 2.2652rem; background: #2f2f2f; -webkit-transition: background-color 150ms linear; transition: background-color 150ms linear; }\n\n.component-toggle .graphic .marker { background: #ececec; width: 1.4rem; height: 1.4rem; border-radius: 1.4rem; position: absolute; left: 0; display: block; top: -0.175rem; -webkit-transition: -webkit-transform 150ms linear; transition: -webkit-transform 150ms linear; transition: transform 150ms linear; transition: transform 150ms linear, -webkit-transform 150ms linear; box-shadow: 0 0.1rem 0.1rem #2f2f2f; }\n\n.component-toggle input:checked + .graphic .slide { background: #993d19; }\n\n.component-toggle input:checked + .graphic .marker { background: #ff4700; -webkit-transform: translateX(0.8652rem); transform: translateX(0.8652rem); }\n"},{}],30:[function(t,e,n){e.exports='<div class="component component-button">\n <button\n type="button"\n data-manipulator-target\n class="{{primary ? \'primary\' : \'\'}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n ></button>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],31:[function(t,e,n){e.exports='<div class="component component-checkbox">\n <span class="label">{{{label}}}</span>\n <div class="checkbox-group">\n {{each options}}\n <label class="tap-highlight">\n <span class="label">{{{this}}}</span>\n <input type="checkbox" value="1" name="clay-{{clayId}}" />\n <i></i>\n </label>\n {{/each}}\n </div>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],32:[function(t,e,n){e.exports='<div class="component component-color">\n <label class="tap-highlight">\n <input\n data-manipulator-target\n type="hidden"\n />\n <span class="label">{{{label}}}</span>\n <span class="value"></span>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n <div class="picker-wrap">\n <div class="picker">\n <div class="color-box-wrap">\n <div class="color-box-container"></div>\n </div>\n </div>\n </div>\n</div>\n'},{}],33:[function(t,e,n){e.exports='<footer data-manipulator-target class="component component-footer"></footer>\n'},{}],34:[function(t,e,n){e.exports='<div class="component component-heading">\n <h{{size}} data-manipulator-target></h{{size}}>\n</div>\n'},{}],35:[function(t,e,n){e.exports='<div class="component component-input">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="input">\n <input\n data-manipulator-target\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n </span>\n </label>\n\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],36:[function(t,e,n){e.exports='<div class="component component-radio">\n <span class="label">{{{label}}}</span>\n <div class="radio-group">\n {{each options}}\n <label class="tap-highlight">\n <span class="label">{{{this.label}}}</span>\n <input\n type="radio"\n value="{{this.value}}"\n name="clay-{{clayId}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n <i></i>\n </label>\n {{/each}}\n </div>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],37:[function(t,e,n){e.exports='<div class="component component-select">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="value"></span>\n <select data-manipulator-target {{each key: attributes}}{{key}}="{{this}}"{{/each}}>\n {{each options}}\n {{if Array.isArray(this.value)}}\n <optgroup label="{{this.label}}">\n {{each this.value}}\n <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>\n {{/each}}\n </optgroup>\n {{else}}\n <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>\n {{/if}}\n {{/each}}\n </select>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],38:[function(t,e,n){e.exports='<div class="component component-slider">\n <label class="tap-highlight">\n <span class="label-container">\n <span class="label">{{{label}}}</span>\n <span class="value-wrap">\n <span class="value-pad"></span>\n <input type="text" class="value" />\n </span>\n </span>\n <span class="input">\n <input\n data-manipulator-target\n class="slider"\n type="range"\n min="{{min}}"\n max="{{max}}"\n step="{{step}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n </span>\n</label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],39:[function(t,e,n){e.exports='<div class="component component-submit">\n <button\n data-manipulator-target\n type="submit"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n ></button>\n</div>\n'},{}],40:[function(t,e,n){e.exports='<div class="component component-text">\n <p data-manipulator-target></p>\n</div>\n'},{}],41:[function(t,e,n){e.exports='<div class="component component-toggle">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="input">\n <input\n data-manipulator-target\n type="checkbox"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n <span class="graphic">\n <span class="slide"></span>\n <span class="marker"></span>\n </span>\n </span>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],42:[function(t,e,n){e.exports='<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><style>@font-face{font-family:PFDinDisplayProRegularWebfont;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;font:inherit;vertical-align:baseline}button,input,textarea{outline:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote:after,blockquote:before,q:after,q:before{content:\'\';content:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body,html{font-weight:400;font-family:PFDinDisplayPro-Regular,PFDinDisplayProRegularWebfont,sans-serif;-webkit-font-smoothing:antialiased;font-size:17px;line-height:1.4;height:100%;color:#fff}body.platform-ios,html.platform-ios{font-size:16px}body{background-color:#333;padding:0 .75rem .7rem}em{font-style:italic}strong{font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;color:#ff4700}.platform-android strong{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}a{color:#858585}a:hover{color:inherit}h1,h2,h3,h4{text-transform:uppercase;font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;text-transform:uppercase;position:relative;top:.05rem;line-height:.9}.platform-android h1,.platform-android h2,.platform-android h3,.platform-android h4{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}h1{font-size:2rem;line-height:2.8rem}h2{font-size:1.8rem;line-height:2.8rem}h3{font-size:1.5rem;line-height:2.8rem}h4{font-size:1.2rem;line-height:1.4rem}h5{font-size:1rem;line-height:1.4rem}h6{font-size:.8rem;line-height:1.4rem}input{font-family:inherit;font-size:inherit;line-height:inherit}label{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center;padding:.7rem .75rem}label .input{white-space:nowrap;display:-webkit-box;display:-webkit-flex;display:flex;max-width:50%;margin-left:.75rem}label.invalid .input:after{content:"!";display:inline-block;color:#fff;background:#ff4700;border-radius:.55rem;width:1.1rem;text-align:center;height:1.1rem;font-size:.825rem;vertical-align:middle;line-height:1.1rem;box-shadow:0 .1rem .1rem #2f2f2f;font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;-webkit-box-flex:0;-webkit-flex:0 0 1.1rem;flex:0 0 1.1rem;margin-left:.3rem}.platform-android label.invalid .input:after{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}.hide{display:none!important}.tap-highlight{-webkit-tap-highlight-color:rgba(255,255,255,.1);border-radius:.25rem}.tap-highlight:active{background-color:rgba(255,255,255,.1)}.component{padding-top:.7rem}.component.disabled{pointer-events:none}.component.disabled>*{opacity:.25}.section{background:#484848;border-radius:.25rem;box-shadow:#2f2f2f 0 .15rem .25rem}.section>.component{padding-bottom:.7rem;padding-right:.75rem;padding-left:.75rem;position:relative;margin-top:1rem}.section>.component:not(.hide)~.component{margin-top:0}.section>.component:first-child:after{display:none}.section>.component:after{content:"";background:#666;display:block;position:absolute;top:0;left:.375rem;right:.375rem;height:1px;pointer-events:none}.section>.component:not(.hide):after{display:none}.section>.component:not(.hide)~.component:not(.hide):after{display:block}.section>.component-heading:first-child{background:#414141;border-radius:.25rem .25rem 0 0}.section>.component-heading:first-child:after,.section>.component-heading:first-child~.component:not(.hide):after{display:none}.section>.component-heading:first-child~.component:not(.hide)~.component:not(.hide):after{display:block}.description{padding:0 .75rem .7rem;font-size:.9rem;line-height:1.4rem;color:#a4a4a4;text-align:left}.inputs{display:block;width:100%;border-collapse:collapse}.button,button{font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;font-size:1rem;line-height:1.4rem;text-transform:uppercase;background-color:#767676;border-radius:.25rem;border:none;display:inline-block;color:#fff;min-width:12rem;text-align:center;margin:0 auto .7rem;padding:.6rem;-webkit-tap-highlight-color:#858585}.platform-android .button,.platform-android button{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}.button:active,button:active{background-color:#858585}.platform-ios .button,.platform-ios button{padding:.5rem}.button.primary,.button[type=submit],button.primary,button[type=submit]{background-color:#ff4700;-webkit-tap-highlight-color:red}.button.primary:active,.button[type=submit]:active,button.primary:active,button[type=submit]:active{background-color:red}a.button{text-decoration:none;color:#fff}</style><meta name="viewport"content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><script>window.returnTo="$$RETURN_TO$$",window.clayConfig=$$CONFIG$$,window.claySettings=$$SETTINGS$$,window.customFn=$$CUSTOM_FN$$,window.clayComponents=$$COMPONENTS$$,window.clayMeta=$$META$$</script></head><body><form id="main-form"class="inputs"></form><script>!function t(e,n,r){function i(a,u){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module \'"+a+"\'");throw c.code="MODULE_NOT_FOUND",c}var f=n[a]={exports:{}};e[a][0].call(f.exports,function(t){var n=e[a][1][t];return i(n?n:t)},f,f.exports,t,e,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(t,e,n){"use strict";var r=t("./vendor/minified"),i=t("./lib/clay-config"),o=r.$,a=r._,u=a.extend([],window.clayConfig||[]),s=a.extend({},window.claySettings||{}),c=window.returnTo||"pebblejs://close#",f=window.customFn||function(){},l=window.clayComponents||{},h=window.clayMeta||{},m=window.navigator.userAgent.match(/android/i)?"android":"ios";document.documentElement.classList.add("platform-"+m),a.eachObj(l,function(t,e){i.registerComponent(e)});var p=o("#main-form"),d=new i(s,u,p,h);p.on("submit",function(){location.href=c+encodeURIComponent(JSON.stringify(d.serialize()))}),f.call(d,r),d.build()},{"./lib/clay-config":2,"./vendor/minified":8}],2:[function(t,e,n){"use strict";function r(t,e,n,c){function f(){m=[],p={},d={},g=!1}function l(t,e){if(Array.isArray(t))t.forEach(function(t){l(t,e)});else if(u.includesCapability(c.activeWatchInfo,t.capabilities))if("section"===t.type){var n=i(\'<div class="section">\');e.add(n),l(t.items,n)}else{var r=o.copyObj(t);r.clayId=m.length;var s=new a(r).initialize(v);r.id&&(p[r.id]=s),r.messageKey&&(d[r.messageKey]=s),m.push(s);var f="undefined"!=typeof y[r.messageKey]?y[r.messageKey]:r.defaultValue;s.set("undefined"!=typeof f?f:""),e.add(s.$element)}}function h(t){if(!g)throw new Error("ClayConfig not built. build() must be run before you can run "+t+"()");return!0}var m,p,d,g,v=this,y=o.copyObj(t);v.meta=c,v.$rootContainer=n,v.EVENTS={BEFORE_BUILD:"BEFORE_BUILD",AFTER_BUILD:"AFTER_BUILD",BEFORE_DESTROY:"BEFORE_DESTROY",AFTER_DESTROY:"AFTER_DESTROY"},u.updateProperties(v.EVENTS,{writable:!1}),v.getAllItems=function(){return h("getAllItems"),m},v.getItemByMessageKey=function(t){return h("getItemByMessageKey"),d[t]},v.getItemById=function(t){return h("getItemById"),p[t]},v.getItemsByType=function(t){return h("getItemsByType"),m.filter(function(e){return e.config.type===t})},v.getItemsByGroup=function(t){return h("getItemsByGroup"),m.filter(function(e){return e.config.group===t})},v.serialize=function(){return h("serialize"),y={},o.eachObj(d,function(t,e){y[t]={value:e.get()},e.precision&&(y[t].precision=e.precision)}),y},v.registerComponent=r.registerComponent,v.destroy=function(){var t=n[0];for(v.trigger(v.EVENTS.BEFORE_DESTROY);t.firstChild;)t.removeChild(t.firstChild);return f(),v.trigger(v.EVENTS.AFTER_DESTROY),v},v.build=function(){return g&&v.destroy(),v.trigger(v.EVENTS.BEFORE_BUILD),l(v.config,n),g=!0,v.trigger(v.EVENTS.AFTER_BUILD),v},f(),s.call(v,n),u.updateProperties(v,{writable:!1,configurable:!1}),v.config=e}var i=t("../vendor/minified").HTML,o=t("../vendor/minified")._,a=t("./clay-item"),u=t("../lib/utils"),s=t("./clay-events"),c=t("./component-registry"),f=t("./manipulators");r.registerComponent=function(t){var e=o.copyObj(t);if(c[e.name])return console.warn("Component: "+e.name+" is already registered. If you wish to override the existing functionality, you must provide a new name"),!1;if("string"==typeof e.manipulator&&(e.manipulator=f[t.manipulator],!e.manipulator))throw new Error("The manipulator: "+t.manipulator+" does not exist in the built-in manipulators.");if(!e.manipulator)throw new Error("The manipulator must be defined");if("function"!=typeof e.manipulator.set||"function"!=typeof e.manipulator.get)throw new Error("The manipulator must have both a `get` and `set` method");if(e.style){var n=document.createElement("style");n.type="text/css",n.appendChild(document.createTextNode(e.style)),document.head.appendChild(n)}return c[e.name]=e,!0},e.exports=r},{"../lib/utils":7,"../vendor/minified":8,"./clay-events":3,"./clay-item":4,"./component-registry":5,"./manipulators":6}],3:[function(t,e,n){"use strict";function r(t){function e(t){return t.split(" ").map(function(t){return"|"+t.replace(/^\\|/,"")}).join(" ")}function n(t,e){var n=o.find(u,function(e){return e.handler===t?e:null});return n||(n={handler:t,proxy:e},u.push(n)),n.proxy}function r(t){return o.find(u,function(e){return e.handler===t?e.proxy:null})}var a=this,u=[];a.on=function(r,i){var o=e(r),a=this,u=n(i,function(){i.apply(a,arguments)});return t.on(o,u),a},a.off=function(t){var e=r(t);return e&&i.off(e),a},a.trigger=function(e,n){return t.trigger(e,n),a}}var i=t("../vendor/minified").$,o=t("../vendor/minified")._;e.exports=r},{"../vendor/minified":8}],4:[function(t,e,n){"use strict";function r(t){var e=this,n=i[t.type];if(!n)throw new Error("The component: "+t.type+" is not registered. Make sure to register it with ClayConfig.registerComponent()");var r={i18n:{foo:"bar"}},f=s.extend({},n.defaults||{},t,r),l=s.formatHtml(n.template.trim(),f);e.id=t.id||null,e.messageKey=t.messageKey||null,e.config=t,e.$element=c(l,f),e.$manipulatorTarget=e.$element.select("[data-manipulator-target]"),e.$manipulatorTarget.length||(e.$manipulatorTarget=e.$element),e.initialize=function(t){return"function"==typeof n.initialize&&n.initialize.call(e,o,t),e},u.call(e,e.$manipulatorTarget),s.eachObj(n.manipulator,function(t,n){e[t]=n.bind(e)}),a.updateProperties(e,{writable:!1,configurable:!1})}var i=t("./component-registry"),o=t("../vendor/minified"),a=t("../lib/utils"),u=t("./clay-events"),s=o._,c=o.HTML;e.exports=r},{"../lib/utils":7,"../vendor/minified":8,"./clay-events":3,"./component-registry":5}],5:[function(t,e,n){"use strict";e.exports={}},{}],6:[function(t,e,n){"use strict";function r(){return this.$manipulatorTarget.get("disabled")?this:(this.$element.set("+disabled"),this.$manipulatorTarget.set("disabled",!0),this.trigger("disabled"))}function i(){return this.$manipulatorTarget.get("disabled")?(this.$element.set("-disabled"),this.$manipulatorTarget.set("disabled",!1),this.trigger("enabled")):this}function o(){return this.$element[0].classList.contains("hide")?this:(this.$element.set("+hide"),this.trigger("hide"))}function a(){return this.$element[0].classList.contains("hide")?(this.$element.set("-hide"),this.trigger("show")):this}var u=t("../vendor/minified")._;e.exports={html:{get:function(){return this.$manipulatorTarget.get("innerHTML")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("innerHTML",t),this.trigger("change"))},hide:o,show:a},button:{get:function(){return this.$manipulatorTarget.get("innerHTML")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("innerHTML",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},val:{get:function(){return this.$manipulatorTarget.get("value")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("value",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},slider:{get:function(){return parseFloat(this.$manipulatorTarget.get("value"))},set:function(t){var e=this.get();return this.$manipulatorTarget.set("value",t),this.get()===e?this:this.trigger("change")},disable:r,enable:i,hide:o,show:a},checked:{get:function(){return this.$manipulatorTarget.get("checked")},set:function(t){return!this.get()==!t?this:(this.$manipulatorTarget.set("checked",!!t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},radiogroup:{get:function(){return this.$element.select("input:checked").get("value")},set:function(t){return this.get()===t.toString(10)?this:(this.$element.select(\'input[value="\'+t.replace(\'"\',\'\\\\"\')+\'"]\').set("checked",!0),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},checkboxgroup:{get:function(){var t=[];return this.$element.select("input").each(function(e){t.push(!!e.checked)}),t},set:function(t){var e=this;for(t=Array.isArray(t)?t:[];t.length<this.get().length;)t.push(!1);return u.equals(this.get(),t)?this:(e.$element.select("input").set("checked",!1).each(function(e,n){e.checked=!!t[n]}),e.trigger("change"))},disable:r,enable:i,hide:o,show:a},color:{get:function(){return parseInt(this.$manipulatorTarget.get("value"),10)||0},set:function(t){return t=this.roundColorToLayout(t||0),this.get()===t?this:(this.$manipulatorTarget.set("value",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a}}},{"../vendor/minified":8}],7:[function(t,e,n){"use strict";e.exports.updateProperties=function(t,e){Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(t,n,e)})},e.exports.capabilityMap={PLATFORM_APLITE:{platforms:["aplite"],minFwMajor:0,minFwMinor:0},PLATFORM_BASALT:{platforms:["basalt"],minFwMajor:0,minFwMinor:0},PLATFORM_CHALK:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},PLATFORM_DIORITE:{platforms:["diorite"],minFwMajor:0,minFwMinor:0},PLATFORM_EMERY:{platforms:["emery"],minFwMajor:0,minFwMinor:0},BW:{platforms:["aplite","diorite"],minFwMajor:0,minFwMinor:0},COLOR:{platforms:["basalt","chalk","emery"],minFwMajor:0,minFwMinor:0},MICROPHONE:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:0,minFwMinor:0},SMARTSTRAP:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:3,minFwMinor:4},SMARTSTRAP_POWER:{platforms:["basalt","chalk","emery"],minFwMajor:3,minFwMinor:4},HEALTH:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:3,minFwMinor:10},RECT:{platforms:["aplite","basalt","diorite","emery"],minFwMajor:0,minFwMinor:0},ROUND:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},DISPLAY_144x168:{platforms:["aplite","basalt","diorite"],minFwMajor:0,minFwMinor:0},DISPLAY_180x180_ROUND:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},DISPLAY_200x228:{platforms:["emery"],minFwMajor:0,minFwMinor:0}},e.exports.includesCapability=function(t,n){var r=/^NOT_/,i=[];if(!n||!n.length)return!0;for(var o=n.length-1;o>=0;o--){var a=n[o],u=e.exports.capabilityMap[a.replace(r,"")];!u||u.platforms.indexOf(t.platform)===-1||u.minFwMajor>t.firmware.major||u.minFwMajor===t.firmware.major&&u.minFwMinor>t.firmware.minor?i.push(!!a.match(r)):i.push(!a.match(r))}return i.indexOf(!1)===-1}},{}],8:[function(t,e,n){e.exports=function(){function t(t){return t.substr(0,3)}function e(t){return t!=lt?""+t:""}function n(t,e){return typeof t==e}function r(t){return n(t,"string")}function i(t){return!!t&&n(t,"object")}function o(t){return t&&t.nodeType}function a(t){return n(t,"number")}function u(t){return i(t)&&!!t.getDay}function s(t){return t===!0||t===!1}function c(t){var e=typeof t;return"object"==e?!(!t||!t.getDay):"string"==e||"number"==e||s(t)}function f(t){return t}function l(t,n,r){return e(t).replace(n,r!=lt?r:"")}function h(t){return l(t,/^\\s+|\\s+$/g)}function m(t,e,n){for(var r in t)t.hasOwnProperty(r)&&e.call(n||t,r,t[r]);return t}function p(t,e,n){if(t)for(var r=0;r<t.length;r++)e.call(n||t,t[r],r);return t}function d(t,e,n){var r=[],i=B(e)?e:function(t){return e!=t};return p(t,function(e,o){i.call(n||t,e,o)&&r.push(e)}),r}function g(t,e,n,r){var i=[];return t(e,function(t,o){P(t=n.call(r||e,t,o))?p(t,function(t){i.push(t)}):t!=lt&&i.push(t)}),i}function v(t){var e=0;return m(t,function(t){e++}),e}function y(t){var e=[];return m(t,function(t){e.push(t)}),e}function b(t,e,n){var r=[];return p(t,function(i,o){r.push(e.call(n||t,i,o))}),r}function w(t,e){var n={};return p(t,function(t,r){n[t]=e}),n}function $(t,e){var n=e||{};for(var r in t)n[r]=t[r];return n}function T(t,e){for(var n=e,r=0;r<t.length;r++)n=$(t[r],n);return n}function M(t){return B(t)?t:function(e,n){if(t===e)return n}}function E(t,e,n){return e==lt?n:e<0?Math.max(t.length+e,0):Math.min(t.length,e)}function F(t,e,n,r){for(var i,o=M(e),a=E(t,r,t.length),u=E(t,n,0);u<a;u++)if((i=o.call(t,t[u],u))!=lt)return i}function x(t,e,n){var r=[];if(t)for(var i=E(t,n,t.length),o=E(t,e,0);o<i;o++)r.push(t[o]);return r}function O(t){return b(t,f)}function j(t,e){var n,r=B(t)?t():t,i=B(e)?e():e;return r==i||r!=lt&&i!=lt&&(c(r)||c(i)?u(r)&&u(i)&&+r==+i:P(r)?r.length==i.length&&!F(r,function(t,e){if(!j(t,i[e]))return!0}):!P(i)&&(n=y(r)).length==v(i)&&!F(n,function(t){if(!j(r[t],i[t]))return!0}))}function A(t,e,n){if(B(t))return t.apply(n&&e,b(n||e,f))}function R(t,e,n){return b(t,function(t){return A(t,e,n)})}function L(t){return"\\\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)}function S(t){return l(t,/[\\x00-\\x1f\'"\\u2028\\u2029]/g,L)}function _(t,e){return t.split(e)}function C(t,e){if(dt[t])return dt[t];var n="with(_.isObject(obj)?obj:{}){"+b(_(t,/{{|}}}?/g),function(t,e){var n,r=h(t),i=l(r,/^{/),o=r==i?"esc(":"";return e%2?(n=/^each\\b(\\s+([\\w_]+(\\s*,\\s*[\\w_]+)?)\\s*:)?(.*)/.exec(i))?"each("+(h(n[4])?n[4]:"this")+", function("+n[2]+"){":(n=/^if\\b(.*)/.exec(i))?"if("+n[1]+"){":(n=/^else\\b\\s*(if\\b(.*))?/.exec(i))?"}else "+(n[1]?"if("+n[2]+")":"")+"{":(n=/^\\/(if)?/.exec(i))?n[1]?"}\\n":"});\\n":(n=/^(var\\s.*)/.exec(i))?n[1]+";":(n=/^#(.*)/.exec(i))?n[1]:(n=/(.*)::\\s*(.*)/.exec(i))?"print("+o+\'_.formatValue("\'+S(n[2])+\'",\'+(h(n[1])?n[1]:"this")+(o&&")")+"));\\n":"print("+o+(h(i)?i:"this")+(o&&")")+");\\n":t?\'print("\'+S(t)+\'");\\n\':void 0}).join("")+"}",r=new Function("obj","each","esc","print","_",n),i=function(t,n){var i=[];return r.call(n||t,t,function(t,e){P(t)?p(t,function(t,n){e.call(t,t,n)}):m(t,function(t,n){e.call(n,t,n)})},e||f,function(){A(i.push,i,arguments)},rt),i.join("")};return gt.push(i)>pt&&delete dt[gt.shift()],dt[t]=i}function I(t){return l(t,/[<>\'"&]/g,function(t){return"&#"+t.charCodeAt(0)+";"})}function N(t,e){return C(t,I)(e)}function D(t){return function(e,n,r){return t(this,e,n,r)}}function B(t){return"function"==typeof t&&!t.item}function P(t){return t&&t.length!=lt&&!r(t)&&!o(t)&&!B(t)&&t!==ot}function H(t){return parseFloat(l(t,/^[^\\d-]+/))}function k(t){return t[at]=t[at]||++ct}function q(t,e){var n,r=[],i={};return Q(t,function(t){Q(e(t),function(t){i[n=k(t)]||(r.push(t),i[n]=!0)})}),r}function U(t,e){var n={$position:"absolute",$visibility:"hidden",$display:"block",$height:lt},r=t.get(n),i=t.set(n).get("clientHeight");return t.set(r),i*e+"px"}function Y(t,n,i,o,a){return B(n)?this.on(lt,t,n,i,o):r(o)?this.on(t,n,i,lt,o):this.each(function(r,u){Q(t?G(t,r):r,function(t){Q(e(n).split(/\\s/),function(e){function n(e,n,r){var f=!a,l=a?r:t;if(a)for(var h=Z(a,t);l&&l!=t&&!(f=h(l));)l=l.parentNode;return!f||s!=e||i.apply(X(l),o||[n,u])&&"?"==c||"|"==c}function r(t){n(s,t,t.target)||(t.preventDefault(),t.stopPropagation())}var s=l(e,/[?|]/g),c=l(e,/[^?|]/g),h=("blur"==s||"focus"==s)&&!!a,m=ct++;t.addEventListener(s,r,h),t.M||(t.M={}),t.M[m]=n,i.M=g(Q,[i.M,function(){t.removeEventListener(s,r,h),delete t.M[m]}],f)})})})}function K(t){R(t.M),t.M=lt}function V(t){ft?ft.push(t):setTimeout(t,0)}function z(t,e,n){return G(t,e,n)[0]}function W(t,e,n){var r=X(document.createElement(t));return P(e)||e!=lt&&!i(e)?r.add(e):r.set(e).add(n)}function J(t){return g(Q,t,function(t){var e;return P(t)?J(t):o(t)?(e=t.cloneNode(!0),e.removeAttribute&&e.removeAttribute("id"),e):t})}function X(t,e,n){return B(t)?V(t):new nt(G(t,e,n))}function G(t,e,n){function i(t){return P(t)?g(Q,t,i):t}function a(t){return d(g(Q,t,i),function(t){for(var r=t;r=r.parentNode;)if(r==e[0]||n)return r==e[0]})}return e?1!=(e=G(e)).length?q(e,function(e){return G(t,e,n)}):r(t)?1!=o(e[0])?[]:n?a(e[0].querySelectorAll(t)):e[0].querySelectorAll(t):a(t):r(t)?document.querySelectorAll(t):g(Q,t,i)}function Z(t,e){function n(t,e){var n=RegExp("(^|\\\\s+)"+t+"(?=$|\\\\s)","i");return function(r){return!t||n.test(r[e])}}var i={},u=i;if(B(t))return t;if(a(t))return function(e,n){return n==t};if(!t||"*"==t||r(t)&&(u=/^([\\w-]*)\\.?([\\w-]*)$/.exec(t))){var s=n(u[1],"tagName"),c=n(u[2],"className");return function(t){return 1==o(t)&&s(t)&&c(t)}}return e?function(n){return X(t,e).find(n)!=lt}:(X(t).each(function(t){i[k(t)]=!0}),function(t){return i[k(t)]})}function Q(t,e){return P(t)?p(t,e):t!=lt&&e(t,0),t}function tt(){this.state=null,this.values=[],this.parent=null}function et(){var t=[],e=arguments,n=e.length,r=0,o=0,a=new tt;a.errHandled=function(){o++,a.parent&&a.parent.errHandled()};var u=a.fire=function(e,n){return null==a.state&&null!=e&&(a.state=!!e,a.values=P(n)?n:[n],setTimeout(function(){p(t,function(t){t()})},0)),a};p(e,function c(t,e){try{t.then?t.then(function(t){var o;(i(t)||B(t))&&B(o=t.then)?c(t,e):(a.values[e]=O(arguments),++r==n&&u(!0,n<2?a.values[e]:a.values))},function(t){a.values[e]=O(arguments),u(!1,n<2?a.values[e]:[a.values[e][0],a.values,e])}):t(function(){u(!0,O(arguments))},function(){u(!1,O(arguments))})}catch(o){u(!1,[o,a.values,e])}}),a.stop=function(){return p(e,function(t){t.stop&&t.stop()}),a.stop0&&A(a.stop0)};var s=a.then=function(e,n){var r=et(),u=function(){try{var t=a.state?e:n;B(t)?!function s(t){try{var e,n=0;if((i(t)||B(t))&&B(e=t.then)){if(t===r)throw new TypeError;e.call(t,function(t){n++||s(t)},function(t){n++||r.fire(!1,[t])}),r.stop0=t.stop}else r.fire(!0,[t])}catch(a){if(!n++&&(r.fire(!1,[a]),!o))throw a}}(A(t,it,a.values)):r.fire(a.state,a.values)}catch(u){if(r.fire(!1,[u]),!o)throw u}};return B(n)&&a.errHandled(),r.stop0=a.stop,r.parent=a,null!=a.state?setTimeout(u,0):t.push(u),r};return a.always=function(t){return s(t,t)},a.error=function(t){return s(0,t)},a}function nt(t,e){var n=this,r=0;if(t)for(var i=0,o=t.length;i<o;i++){var a=t[i];if(e&&P(a))for(var u=0,s=a.length;u<s;u++)n[r++]=a[u];else n[r++]=a}else n[r++]=e;n.length=r,n._=!0}function rt(){return new nt(arguments,(!0))}var it,ot=window,at="Nia",ut={},st={},ct=1,ft=/^[ic]/.test(document.readyState)?lt:[],lt=null,ht=_("January,February,March,April,May,June,July,August,September,October,November,December",/,/g),mt=(b(ht,t),_("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",/,/g)),pt=(b(mt,t),_("am,pm",/,/g),_("am,am,am,am,am,am,am,am,am,am,am,am,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm",/,/g),99),dt={},gt=[];return $({each:D(p),equals:D(j),find:D(F),dummySort:0,select:function(t,e){return X(t,this,e)},get:function(t,e){var n=this,i=n[0];if(i){if(r(t)){var o,a=/^(\\W*)(.*)/.exec(l(t,/^%/,"@data-")),u=a[1];return o=st[u]?st[u](this,a[2]):"$"==t?n.get("className"):"$$"==t?n.get("@style"):"$$slide"==t?n.get("$height"):"$$fade"==t||"$$show"==t?"hidden"==n.get("$visibility")||"none"==n.get("$display")?0:"$$fade"==t?isNaN(n.get("$opacity",!0))?1:n.get("$opacity",!0):1:"$"==u?ot.getComputedStyle(i,lt).getPropertyValue(l(a[2],/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):"@"==u?i.getAttribute(a[2]):i[a[2]],e?H(o):o}var s={};return(P(t)?Q:m)(t,function(t){s[t]=n.get(t,e)}),s}},set:function(t,e){var n=this;if(e!==it){var i=/^(\\W*)(.*)/.exec(l(l(t,/^\\$float$/,"cssFloat"),/^%/,"@data-")),o=i[1];ut[o]?ut[o](this,i[2],e):"$$fade"==t?this.set({$visibility:e?"visible":"hidden",$opacity:e}):"$$slide"==t?n.set({$visibility:e?"visible":"hidden",$overflow:"hidden",$height:/px/.test(e)?e:function(t,n,r){return U(X(r),e)}}):"$$show"==t?e?n.set({$visibility:e?"visible":"hidden",$display:""}).set({$display:function(t){return"none"==t?"block":t}}):n.set({$display:"none"}):"$$"==t?n.set("@style",e):Q(this,function(n,r){var a=B(e)?e(X(n).get(t),r,n):e;"$"==o?i[2]?n.style[i[2]]=a:Q(a&&a.split(/\\s+/),function(t){var e=l(t,/^[+-]/);/^\\+/.test(t)?n.classList.add(e):/^-/.test(t)?n.classList.remove(e):n.classList.toggle(e)}):"$$scrollX"==t?n.scroll(a,X(n).get("$$scrollY")):"$$scrollY"==t?n.scroll(X(n).get("$$scrollX"),a):"@"==o?a==lt?n.removeAttribute(i[2]):n.setAttribute(i[2],a):n[i[2]]=a})}else r(t)||B(t)?n.set("$",t):m(t,function(t,e){n.set(t,e)});return n},add:function(t,e){return this.each(function(n,r){function i(t){if(P(t))Q(t,i);else if(B(t))i(t(n,r));else if(t!=lt){var u=o(t)?t:document.createTextNode(t);a?a.parentNode.insertBefore(u,a.nextSibling):e?e(u,n,n.parentNode):n.appendChild(u),a=u}}var a;i(r&&!B(t)?J(t):t)})},on:Y,trigger:function(t,e){return this.each(function(n,r){for(var i=!0,o=n;o&&i;)m(o.M,function(r,o){i=i&&o(t,e,n)}),o=o.parentNode})},ht:function(t,e){var n=arguments.length>2?T(x(arguments,1)):e;return this.set("innerHTML",B(t)?t(n):/{{/.test(t)?N(t,n):/^#\\S+$/.test(t)?N(z(t).text,n):t)}},nt.prototype),$({request:function(t,n,r,i){var o,a=i||{},u=0,s=et(),c=r&&r.constructor==a.constructor;try{s.xhr=o=new XMLHttpRequest,s.stop0=function(){o.abort()},c&&(r=g(m,r,function(t,e){return g(Q,e,function(e){return encodeURIComponent(t)+(e!=lt?"="+encodeURIComponent(e):"")})}).join("&")),r==lt||/post/i.test(t)||(n+="?"+r,r=lt),o.open(t,n,!0,a.user,a.pass),c&&/post/i.test(t)&&o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),m(a.headers,function(t,e){o.setRequestHeader(t,e)}),m(a.xhr,function(t,e){o[t]=e}),o.onreadystatechange=function(){4!=o.readyState||u++||(o.status>=200&&o.status<300?s.fire(!0,[o.responseText,o]):s.fire(!1,[o.status,o.responseText,o]))},o.send(r)}catch(f){u||s.fire(!1,[0,lt,e(f)])}return s},ready:V,off:K,wait:function(t,e){var n=et(),r=setTimeout(function(){n.fire(!0,e)},t);return n.stop0=function(){n.fire(!1),clearTimeout(r)},n}},X),$({each:p,toObject:w,find:F,equals:j,copyObj:$,extend:function(t){return T(x(arguments,1),t)},eachObj:m,isObject:i,format:function(t,e,n){return C(t,n)(e)},template:C,formatHtml:N,promise:et},rt),document.addEventListener("DOMContentLoaded",function(){R(ft),ft=lt},!1),{HTML:function(){var t=W("div");return rt(A(t.ht,t,arguments)[0].childNodes)},_:rt,$:X,$$:z,M:nt,getter:st,setter:ut}}()},{}]},{},[1])</script></body></html>';
+},{}],"pebble-clay":[function(t,e,n){"use strict";function r(t,e,n){function r(){i.meta={activeWatchInfo:Pebble.getActiveWatchInfo&&Pebble.getActiveWatchInfo(),accountToken:Pebble.getAccountToken(),watchToken:Pebble.getWatchToken(),userData:s(n.userData||{})}}function o(t,e,n){Array.isArray(t)?t.forEach(function(t){o(t,e,n)}):"section"===t.type?o(t.items,e,n):e(t)&&n(t)}var i=this;if(!Array.isArray(t))throw new Error("config must be an Array");if(e&&"function"!=typeof e)throw new Error('customFn must be a function or "null"');n=n||{},i.config=s(t),i.customFn=e||function(){},i.components={},i.meta={activeWatchInfo:null,accountToken:"",watchToken:"",userData:{}},i.version=c,n.autoHandleEvents!==!1&&"undefined"!=typeof Pebble?(Pebble.addEventListener("showConfiguration",function(){r(),Pebble.openURL(i.generateUrl())}),Pebble.addEventListener("webviewclosed",function(t){t&&t.response&&Pebble.sendAppMessage(i.getSettings(t.response),function(){console.log("Sent config data to Pebble")},function(t){console.log("Failed to send config data!"),console.log(JSON.stringify(t))})})):"undefined"!=typeof Pebble&&Pebble.addEventListener("ready",function(){r()}),o(i.config,function(t){return a[t.type]},function(t){i.registerComponent(a[t.type])}),o(i.config,function(t){return t.appKey},function(){throw new Error("appKeys are no longer supported. Please follow the migration guide to upgrade your project")})}var o=t("./tmp/config-page.html"),i=t("tosource"),a=t("./src/scripts/components"),s=t("deepcopy/build/deepcopy.min"),c=t("./package.json").version,l=t("message_keys");r.prototype.registerComponent=function(t){this.components[t.name]=t},r.prototype.generateUrl=function(){var t={},e=!Pebble||"pypkjs"===Pebble.platform,n=e?"$$$RETURN_TO$$$":"pebblejs://close#";try{t=JSON.parse(localStorage.getItem("clay-settings"))||{}}catch(a){console.error(a.toString())}var s=o.replace("$$RETURN_TO$$",n).replace("$$CUSTOM_FN$$",i(this.customFn)).replace("$$CONFIG$$",i(this.config)).replace("$$SETTINGS$$",i(t)).replace("$$COMPONENTS$$",i(this.components)).replace("$$META$$",i(this.meta));return e?r.encodeDataUri(s,"http://clay.pebble.com.s3-website-us-west-2.amazonaws.com/#"):r.encodeDataUri(s)},r.prototype.getSettings=function(t,e){var n={};t=t.match(/^\{/)?t:decodeURIComponent(t);try{n=JSON.parse(t)}catch(o){throw new Error("The provided response was not valid JSON")}var i={};return Object.keys(n).forEach(function(t){"object"==typeof n[t]&&n[t]?i[t]=n[t].value:i[t]=n[t]}),localStorage.setItem("clay-settings",JSON.stringify(i)),e===!1?n:r.prepareSettingsForAppMessage(n)},r.prototype.setSettings=function(t,e){var n={};try{n=JSON.parse(localStorage.getItem("clay-settings"))||{}}catch(r){console.error(r.toString())}if("object"==typeof t){var o=t;Object.keys(o).forEach(function(t){n[t]=o[t]})}else n[t]=e;localStorage.setItem("clay-settings",JSON.stringify(n))},r.encodeDataUri=function(t,e){return e="undefined"!=typeof e?e:"data:text/html;charset=utf-8,",e+encodeURIComponent(t)},r.prepareForAppMessage=function(t){function e(t,e){return Math.floor(t*Math.pow(10,e||0))}var n;return Array.isArray(t)?(n=[],t.forEach(function(t,e){n[e]=r.prepareForAppMessage(t)})):n="object"==typeof t&&t?"number"==typeof t.value?e(t.value,t.precision):Array.isArray(t.value)?t.value.map(function(n){return"number"==typeof n?e(n,t.precision):n}):r.prepareForAppMessage(t.value):"boolean"==typeof t?t?1:0:t,n},r.prepareSettingsForAppMessage=function(t){var e={};Object.keys(t).forEach(function(n){var r=t[n],o=n.match(/(.+?)(?:\[(\d*)\])?$/);if(!o[2])return void(e[n]=r);var i=parseInt(o[2],10);n=o[1],"undefined"==typeof e[n]&&(e[n]=[]),e[n][i]=r});var n={};return Object.keys(e).forEach(function(t){var o=l[t],i=r.prepareForAppMessage(e[t]);i=Array.isArray(i)?i:[i],i.forEach(function(t,e){n[o+e]=t})}),Object.keys(n).forEach(function(t){if(Array.isArray(n[t]))throw new Error('Clay does not support 2 dimensional arrays for item values. Make sure you are not attempting to use array syntax (eg: "myMessageKey[2]") in the messageKey for components that return an array, such as a checkboxgroup')}),n},e.exports=r},{"./package.json":7,"./src/scripts/components":13,"./tmp/config-page.html":42,"deepcopy/build/deepcopy.min":3,message_keys:void 0,tosource:6}]},{},["pebble-clay"])("pebble-clay")});
\ No newline at end of file
--- /dev/null
+'use strict';
+
+var configPageHtml = require('./tmp/config-page.html');
+var toSource = require('tosource');
+var standardComponents = require('./src/scripts/components');
+var deepcopy = require('deepcopy/build/deepcopy.min');
+var version = require('./package.json').version;
+var messageKeys = require('message_keys');
+
+/**
+ * @param {Array} config - the Clay config
+ * @param {function} [customFn] - Custom code to run from the config page. Will run
+ * with the ClayConfig instance as context
+ * @param {Object} [options] - Additional options to pass to Clay
+ * @param {boolean} [options.autoHandleEvents=true] - If false, Clay will not
+ * automatically handle the 'showConfiguration' and 'webviewclosed' events
+ * @param {*} [options.userData={}] - Arbitrary data to pass to the config page. Will
+ * be available as `clayConfig.meta.userData`
+ * @constructor
+ */
+function Clay(config, customFn, options) {
+ var self = this;
+
+ if (!Array.isArray(config)) {
+ throw new Error('config must be an Array');
+ }
+
+ if (customFn && typeof customFn !== 'function') {
+ throw new Error('customFn must be a function or "null"');
+ }
+
+ options = options || {};
+
+ self.config = deepcopy(config);
+ self.customFn = customFn || function() {};
+ self.components = {};
+ self.meta = {
+ activeWatchInfo: null,
+ accountToken: '',
+ watchToken: '',
+ userData: {}
+ };
+ self.version = version;
+
+ /**
+ * Populate the meta with data from the Pebble object. Make sure to run this inside
+ * either the "showConfiguration" or "ready" event handler
+ * @return {void}
+ */
+ function _populateMeta() {
+ self.meta = {
+ activeWatchInfo: Pebble.getActiveWatchInfo && Pebble.getActiveWatchInfo(),
+ accountToken: Pebble.getAccountToken(),
+ watchToken: Pebble.getWatchToken(),
+ userData: deepcopy(options.userData || {})
+ };
+ }
+
+ // Let Clay handle all the magic
+ if (options.autoHandleEvents !== false && typeof Pebble !== 'undefined') {
+
+ Pebble.addEventListener('showConfiguration', function() {
+ _populateMeta();
+ Pebble.openURL(self.generateUrl());
+ });
+
+ Pebble.addEventListener('webviewclosed', function(e) {
+
+ if (!e || !e.response) { return; }
+
+ // Send settings to Pebble watchapp
+ Pebble.sendAppMessage(self.getSettings(e.response), function() {
+ console.log('Sent config data to Pebble');
+ }, function(error) {
+ console.log('Failed to send config data!');
+ console.log(JSON.stringify(error));
+ });
+ });
+ } else if (typeof Pebble !== 'undefined') {
+ Pebble.addEventListener('ready', function() {
+ _populateMeta();
+ });
+ }
+
+ /**
+ * If this function returns true then the callback will be executed
+ * @callback _scanConfig_testFn
+ * @param {Clay~ConfigItem} item
+ */
+
+ /**
+ * @callback _scanConfig_callback
+ * @param {Clay~ConfigItem} item
+ */
+
+ /**
+ * Scan over the config and run the callback if the testFn resolves to true
+ * @private
+ * @param {Clay~ConfigItem|Array} item
+ * @param {_scanConfig_testFn} testFn
+ * @param {_scanConfig_callback} callback
+ * @return {void}
+ */
+ function _scanConfig(item, testFn, callback) {
+ if (Array.isArray(item)) {
+ item.forEach(function(item) {
+ _scanConfig(item, testFn, callback);
+ });
+ } else if (item.type === 'section') {
+ _scanConfig(item.items, testFn, callback);
+ } else if (testFn(item)) {
+ callback(item);
+ }
+ }
+
+ // register standard components
+ _scanConfig(self.config, function(item) {
+ return standardComponents[item.type];
+ }, function(item) {
+ self.registerComponent(standardComponents[item.type]);
+ });
+
+ // validate config against teh use of appKeys
+ _scanConfig(self.config, function(item) {
+ return item.appKey;
+ }, function() {
+ throw new Error('appKeys are no longer supported. ' +
+ 'Please follow the migration guide to upgrade your project');
+ });
+}
+
+/**
+ * Register a component to Clay.
+ * @param {Object} component - the clay component to register
+ * @param {string} component.name - the name of the component
+ * @param {string} component.template - HTML template to use for the component
+ * @param {string|Object} component.manipulator - methods to attach to the component
+ * @param {function} component.manipulator.set - set manipulator method
+ * @param {function} component.manipulator.get - get manipulator method
+ * @param {Object} [component.defaults] - template defaults
+ * @param {function} [component.initialize] - method to scaffold the component
+ * @return {boolean} - Returns true if component was registered correctly
+ */
+Clay.prototype.registerComponent = function(component) {
+ this.components[component.name] = component;
+};
+
+/**
+ * Generate the Data URI used by the config Page with settings injected
+ * @return {string}
+ */
+Clay.prototype.generateUrl = function() {
+ var settings = {};
+ var emulator = !Pebble || Pebble.platform === 'pypkjs';
+ var returnTo = emulator ? '$$$RETURN_TO$$$' : 'pebblejs://close#';
+
+ try {
+ settings = JSON.parse(localStorage.getItem('clay-settings')) || {};
+ } catch (e) {
+ console.error(e.toString());
+ }
+
+ var compiledHtml = configPageHtml
+ .replace('$$RETURN_TO$$', returnTo)
+ .replace('$$CUSTOM_FN$$', toSource(this.customFn))
+ .replace('$$CONFIG$$', toSource(this.config))
+ .replace('$$SETTINGS$$', toSource(settings))
+ .replace('$$COMPONENTS$$', toSource(this.components))
+ .replace('$$META$$', toSource(this.meta));
+
+ // if we are in the emulator then we need to proxy the data via a webpage to
+ // obtain the return_to.
+ // @todo calculate this from the Pebble object or something
+ if (emulator) {
+ return Clay.encodeDataUri(
+ compiledHtml,
+ 'http://clay.pebble.com.s3-website-us-west-2.amazonaws.com/#'
+ );
+ }
+
+ return Clay.encodeDataUri(compiledHtml);
+};
+
+/**
+ * Parse the response from the webviewclosed event data
+ * @param {string} response
+ * @param {boolean} [convert=true]
+ * @returns {Object}
+ */
+Clay.prototype.getSettings = function(response, convert) {
+ // Decode and parse config data as JSON
+ var settings = {};
+ response = response.match(/^\{/) ? response : decodeURIComponent(response);
+
+ try {
+ settings = JSON.parse(response);
+ } catch (e) {
+ throw new Error('The provided response was not valid JSON');
+ }
+
+ // flatten the settings for localStorage
+ var settingsStorage = {};
+ Object.keys(settings).forEach(function(key) {
+ if (typeof settings[key] === 'object' && settings[key]) {
+ settingsStorage[key] = settings[key].value;
+ } else {
+ settingsStorage[key] = settings[key];
+ }
+ });
+
+ localStorage.setItem('clay-settings', JSON.stringify(settingsStorage));
+
+ return convert === false ? settings : Clay.prepareSettingsForAppMessage(settings);
+};
+
+/**
+ * Updates the settings with the given value(s).
+ *
+ * @signature `clay.setSettings(key, value)`
+ * @param {String} key - The property to set.
+ * @param {*} value - the value assigned to _key_.
+ * @return {undefined}
+ *
+ * @signature `clay.setSettings(settings)`
+ * @param {Object} settings - an object containing the key/value pairs to be set.
+ * @return {undefined}
+ */
+Clay.prototype.setSettings = function(key, value) {
+ var settingsStorage = {};
+
+ try {
+ settingsStorage = JSON.parse(localStorage.getItem('clay-settings')) || {};
+ } catch (e) {
+ console.error(e.toString());
+ }
+
+ if (typeof key === 'object') {
+ var settings = key;
+ Object.keys(settings).forEach(function(key) {
+ settingsStorage[key] = settings[key];
+ });
+ } else {
+ settingsStorage[key] = value;
+ }
+
+ localStorage.setItem('clay-settings', JSON.stringify(settingsStorage));
+};
+
+/**
+ * @param {string} input
+ * @param {string} [prefix='data:text/html;charset=utf-8,']
+ * @returns {string}
+ */
+Clay.encodeDataUri = function(input, prefix) {
+ prefix = typeof prefix !== 'undefined' ? prefix : 'data:text/html;charset=utf-8,';
+ return prefix + encodeURIComponent(input);
+};
+
+/**
+ * Converts the val into a type compatible with Pebble.sendAppMessage().
+ * - Strings will be returned without modification
+ * - Numbers will be returned without modification
+ * - Booleans will be converted to a 0 or 1
+ * - Arrays that contain strings will be returned without modification
+ * eg: ['one', 'two'] becomes ['one', 'two']
+ * - Arrays that contain numbers will be returned without modification
+ * eg: [1, 2] becomes [1, 2]
+ * - Arrays that contain booleans will be converted to a 0 or 1
+ * eg: [true, false] becomes [1, 0]
+ * - Arrays must be single dimensional
+ * - Objects that have a "value" property will apply the above rules to the type of
+ * value. If the value is a number or an array of numbers and the optional
+ * property: "precision" is provided, then the number will be multiplied by 10 to
+ * the power of precision (value * 10 ^ precision) and then floored.
+ * Eg: 1.4567 with a precision set to 3 will become 1456
+ * @param {number|string|boolean|Array|Object} val
+ * @param {number|string|boolean|Array} val.value
+ * @param {number|undefined} [val.precision=0]
+ * @returns {number|string|Array}
+ */
+Clay.prepareForAppMessage = function(val) {
+
+ /**
+ * moves the decimal place of a number by precision then drop any remaining decimal
+ * places.
+ * @param {number} number
+ * @param {number} precision - number of decimal places to move
+ * @returns {number}
+ * @private
+ */
+ function _normalizeToPrecision(number, precision) {
+ return Math.floor(number * Math.pow(10, precision || 0));
+ }
+
+ var result;
+
+ if (Array.isArray(val)) {
+ result = [];
+ val.forEach(function(item, index) {
+ result[index] = Clay.prepareForAppMessage(item);
+ });
+ } else if (typeof val === 'object' && val) {
+ if (typeof val.value === 'number') {
+ result = _normalizeToPrecision(val.value, val.precision);
+ } else if (Array.isArray(val.value)) {
+ result = val.value.map(function(item) {
+ if (typeof item === 'number') {
+ return _normalizeToPrecision(item, val.precision);
+ }
+ return item;
+ });
+ } else {
+ result = Clay.prepareForAppMessage(val.value);
+ }
+ } else if (typeof val === 'boolean') {
+ result = val ? 1 : 0;
+ } else {
+ result = val;
+ }
+
+ return result;
+};
+
+/**
+ * Converts a Clay settings dict into one that is compatible with
+ * Pebble.sendAppMessage(); It also uses the provided messageKeys to correctly
+ * assign arrays into individual keys
+ * @see {prepareForAppMessage}
+ * @param {Object} settings
+ * @returns {{}}
+ */
+Clay.prepareSettingsForAppMessage = function(settings) {
+
+ // flatten settings
+ var flatSettings = {};
+ Object.keys(settings).forEach(function(key) {
+ var val = settings[key];
+ var matches = key.match(/(.+?)(?:\[(\d*)\])?$/);
+
+ if (!matches[2]) {
+ flatSettings[key] = val;
+ return;
+ }
+
+ var position = parseInt(matches[2], 10);
+ key = matches[1];
+
+ if (typeof flatSettings[key] === 'undefined') {
+ flatSettings[key] = [];
+ }
+
+ flatSettings[key][position] = val;
+ });
+
+ var result = {};
+ Object.keys(flatSettings).forEach(function(key) {
+ var messageKey = messageKeys[key];
+ var settingArr = Clay.prepareForAppMessage(flatSettings[key]);
+ settingArr = Array.isArray(settingArr) ? settingArr : [settingArr];
+
+ settingArr.forEach(function(setting, index) {
+ result[messageKey + index] = setting;
+ });
+ });
+
+ // validate the settings
+ Object.keys(result).forEach(function(key) {
+ if (Array.isArray(result[key])) {
+ throw new Error('Clay does not support 2 dimensional arrays for item ' +
+ 'values. Make sure you are not attempting to use array ' +
+ 'syntax (eg: "myMessageKey[2]") in the messageKey for ' +
+ 'components that return an array, such as a checkboxgroup');
+ }
+ });
+
+ return result;
+};
+
+module.exports = Clay;
--- /dev/null
+{
+ "_from": "pebble-clay",
+ "_id": "pebble-clay@1.0.4",
+ "_inBundle": false,
+ "_integrity": "sha512-/rXxmltdW8JyohDzXINdea+d2wnFJVNFiTXfuZsKpySURZSCFMMucX9sZPZvbHnEA4xFINM4iicyhBbvY4ALfw==",
+ "_location": "/pebble-clay",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "tag",
+ "registry": true,
+ "raw": "pebble-clay",
+ "name": "pebble-clay",
+ "escapedName": "pebble-clay",
+ "rawSpec": "",
+ "saveSpec": null,
+ "fetchSpec": "latest"
+ },
+ "_requiredBy": [
+ "#USER",
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/pebble-clay/-/pebble-clay-1.0.4.tgz",
+ "_shasum": "fdf92f0fdc770a979c06874eaa2457cc2e762344",
+ "_spec": "pebble-clay",
+ "_where": "/pebble",
+ "author": {
+ "name": "Pebble Technology"
+ },
+ "bugs": {
+ "url": "https://github.com/pebble/clay/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {},
+ "deprecated": false,
+ "description": "Pebble Config Framework",
+ "devDependencies": {
+ "autoprefixer": "^6.3.1",
+ "bourbon": "^4.2.6",
+ "browserify": "^13.0.0",
+ "browserify-istanbul": "^0.2.1",
+ "chai": "^3.4.1",
+ "deamdify": "^0.2.0",
+ "deepcopy": "^0.6.1",
+ "del": "^2.0.2",
+ "eslint": "^1.5.1",
+ "eslint-config-pebble": "^1.2.0",
+ "eslint-plugin-standard": "^1.3.1",
+ "gulp": "^3.9.0",
+ "gulp-autoprefixer": "^3.1.0",
+ "gulp-htmlmin": "^1.3.0",
+ "gulp-inline": "0.0.15",
+ "gulp-insert": "^0.5.0",
+ "gulp-sass": "^2.1.1",
+ "gulp-sourcemaps": "^1.6.0",
+ "gulp-uglify": "^1.5.2",
+ "joi": "^6.10.1",
+ "karma": "^0.13.19",
+ "karma-browserify": "^5.0.1",
+ "karma-chrome-launcher": "^0.2.2",
+ "karma-coverage": "^0.5.3",
+ "karma-mocha": "^0.2.1",
+ "karma-mocha-reporter": "^1.1.5",
+ "karma-source-map-support": "^1.1.0",
+ "karma-threshold-reporter": "^0.1.15",
+ "mocha": "^2.3.4",
+ "postcss": "^5.0.14",
+ "require-from-string": "^1.1.0",
+ "sassify": "^0.9.1",
+ "sinon": "^1.17.3",
+ "stringify": "^3.2.0",
+ "through": "^2.3.8",
+ "tosource": "^1.0.0",
+ "vinyl-buffer": "^1.0.0",
+ "vinyl-source-stream": "^1.1.0",
+ "watchify": "^3.7.0"
+ },
+ "homepage": "https://github.com/pebble/clay#readme",
+ "keywords": [
+ "pebble",
+ "config",
+ "configuration",
+ "pebble-package"
+ ],
+ "license": "MIT",
+ "name": "pebble-clay",
+ "pebble": {
+ "projectType": "package",
+ "sdkVersion": "3",
+ "targetPlatforms": [
+ "aplite",
+ "basalt",
+ "chalk",
+ "diorite",
+ "emery"
+ ],
+ "resources": {
+ "media": []
+ },
+ "capabilities": [
+ "configurable"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pebble/clay.git"
+ },
+ "scripts": {
+ "build": "gulp",
+ "dev": "gulp dev",
+ "lint": "eslint ./",
+ "pebble-build": "npm run build && pebble build",
+ "pebble-clean": "rm -rf tmp src/js/index.js && pebble clean",
+ "pebble-publish": "npm run pebble-clean && npm run build && pebble build && pebble package publish && npm run pebble-clean",
+ "test": "gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run",
+ "test-debug": "(export DEBUG=true && ./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --no-single-run)",
+ "test-travis": "gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run --browsers chromeTravisCI && ./node_modules/.bin/eslint ./"
+ },
+ "version": "1.0.4"
+}
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <link rel="stylesheet" href="../tmp/config-page.css">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+ <script>
+ window.returnTo = '$$RETURN_TO$$';
+ window.clayConfig = $$CONFIG$$;
+ window.claySettings = $$SETTINGS$$;
+ window.customFn = $$CUSTOM_FN$$;
+ window.clayComponents = $$COMPONENTS$$;
+ window.clayMeta = $$META$$;
+ </script>
+ </head>
+ <body>
+ <form id="main-form" class="inputs"></form>
+ <script src="../tmp/config-page.js"></script>
+ </body>
+</html>
--- /dev/null
+/* Clay - https://github.com/pebble/clay - Version: 1.0.4 - Build Date: 2016-11-21T20:14:28.839Z */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.pebbleClay=t()}}(function(){var t;return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){"use strict";function r(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function o(t){return 3*t.length/4-r(t)}function i(t){var e,n,o,i,a,s,c=t.length;a=r(t),s=new f(3*c/4-a),o=a>0?c-4:c;var l=0;for(e=0,n=0;e<o;e+=4,n+=3)i=u[t.charCodeAt(e)]<<18|u[t.charCodeAt(e+1)]<<12|u[t.charCodeAt(e+2)]<<6|u[t.charCodeAt(e+3)],s[l++]=i>>16&255,s[l++]=i>>8&255,s[l++]=255&i;return 2===a?(i=u[t.charCodeAt(e)]<<2|u[t.charCodeAt(e+1)]>>4,s[l++]=255&i):1===a&&(i=u[t.charCodeAt(e)]<<10|u[t.charCodeAt(e+1)]<<4|u[t.charCodeAt(e+2)]>>2,s[l++]=i>>8&255,s[l++]=255&i),s}function a(t){return l[t>>18&63]+l[t>>12&63]+l[t>>6&63]+l[63&t]}function s(t,e,n){for(var r,o=[],i=e;i<n;i+=3)r=(t[i]<<16)+(t[i+1]<<8)+t[i+2],o.push(a(r));return o.join("")}function c(t){for(var e,n=t.length,r=n%3,o="",i=[],a=16383,c=0,u=n-r;c<u;c+=a)i.push(s(t,c,c+a>u?u:c+a));return 1===r?(e=t[n-1],o+=l[e>>2],o+=l[e<<4&63],o+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],o+=l[e>>10],o+=l[e>>4&63],o+=l[e<<2&63],o+="="),i.push(o),i.join("")}n.byteLength=o,n.toByteArray=i,n.fromByteArray=c;for(var l=[],u=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,h=p.length;d<h;++d)l[d]=p[d],u[p.charCodeAt(d)]=d;u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63},{}],2:[function(t,e,n){(function(e){/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+"use strict";function r(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(e){return!1}}function o(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function i(t,e){if(o()<e)throw new RangeError("Invalid typed array length");return a.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e),t.__proto__=a.prototype):(null===t&&(t=new a(e)),t.length=e),t}function a(t,e,n){if(!(a.TYPED_ARRAY_SUPPORT||this instanceof a))return new a(t,e,n);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return u(this,t)}return s(this,t,e,n)}function s(t,e,n,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?d(t,e,n,r):"string"==typeof e?f(t,e,n):h(t,e)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function l(t,e,n,r){return c(e),e<=0?i(t,e):void 0!==n?"string"==typeof r?i(t,e).fill(n,r):i(t,e).fill(n):i(t,e)}function u(t,e){if(c(e),t=i(t,e<0?0:0|m(e)),!a.TYPED_ARRAY_SUPPORT)for(var n=0;n<e;++n)t[n]=0;return t}function f(t,e,n){if("string"==typeof n&&""!==n||(n="utf8"),!a.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var r=0|b(e,n);t=i(t,r);var o=t.write(e,n);return o!==r&&(t=t.slice(0,o)),t}function p(t,e){var n=e.length<0?0:0|m(e.length);t=i(t,n);for(var r=0;r<n;r+=1)t[r]=255&e[r];return t}function d(t,e,n,r){if(e.byteLength,n<0||e.byteLength<n)throw new RangeError("'offset' is out of bounds");if(e.byteLength<n+(r||0))throw new RangeError("'length' is out of bounds");return e=void 0===n&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,n):new Uint8Array(e,n,r),a.TYPED_ARRAY_SUPPORT?(t=e,t.__proto__=a.prototype):t=p(t,e),t}function h(t,e){if(a.isBuffer(e)){var n=0|m(e.length);return t=i(t,n),0===t.length?t:(e.copy(t,0,0,n),t)}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||H(e.length)?i(t,0):p(t,e);if("Buffer"===e.type&&_(e.data))return p(t,e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function m(t){if(t>=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function g(t){return+t!=t&&(t=0),a.alloc(+t)}function b(t,e){if(a.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(t).length;default:if(r)return W(t).length;e=(""+e).toLowerCase(),r=!0}}function y(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,e>>>=0,n<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return D(this,e,n);case"utf8":case"utf-8":return E(this,e,n);case"ascii":return B(this,e,n);case"latin1":case"binary":return S(this,e,n);case"base64":return O(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return N(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function v(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function A(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=a.from(e,r)),a.isBuffer(e))return 0===e.length?-1:w(t,e,n,r,o);if("number"==typeof e)return e=255&e,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):w(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function w(t,e,n,r,o){function i(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}var a=1,s=t.length,c=e.length;if(void 0!==r&&(r=String(r).toLowerCase(),"ucs2"===r||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;a=2,s/=2,c/=2,n/=2}var l;if(o){var u=-1;for(l=n;l<s;l++)if(i(t,l)===i(e,u===-1?0:l-u)){if(u===-1&&(u=l),l-u+1===c)return u*a}else u!==-1&&(l-=l-u),u=-1}else for(n+c>s&&(n=s-c),l=n;l>=0;l--){for(var f=!0,p=0;p<c;p++)if(i(t,l+p)!==i(e,p)){f=!1;break}if(f)return l}return-1}function k(t,e,n,r){n=Number(n)||0;var o=t.length-n;r?(r=Number(r),r>o&&(r=o)):r=o;var i=e.length;if(i%2!==0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a<r;++a){var s=parseInt(e.substr(2*a,2),16);if(isNaN(s))return a;t[n+a]=s}return a}function x(t,e,n,r){return q(W(e,t.length-n),t,n,r)}function M(t,e,n,r){return q(Z(e),t,n,r)}function T(t,e,n,r){return M(t,e,n,r)}function R(t,e,n,r){return q(U(e),t,n,r)}function P(t,e,n,r){return q(J(e,t.length-n),t,n,r)}function O(t,e,n){return 0===e&&n===t.length?Q.fromByteArray(t):Q.fromByteArray(t.slice(e,n))}function E(t,e,n){n=Math.min(t.length,n);for(var r=[],o=e;o<n;){var i=t[o],a=null,s=i>239?4:i>223?3:i>191?2:1;if(o+s<=n){var c,l,u,f;switch(s){case 1:i<128&&(a=i);break;case 2:c=t[o+1],128===(192&c)&&(f=(31&i)<<6|63&c,f>127&&(a=f));break;case 3:c=t[o+1],l=t[o+2],128===(192&c)&&128===(192&l)&&(f=(15&i)<<12|(63&c)<<6|63&l,f>2047&&(f<55296||f>57343)&&(a=f));break;case 4:c=t[o+1],l=t[o+2],u=t[o+3],128===(192&c)&&128===(192&l)&&128===(192&u)&&(f=(15&i)<<18|(63&c)<<12|(63&l)<<6|63&u,f>65535&&f<1114112&&(a=f))}}null===a?(a=65533,s=1):a>65535&&(a-=65536,r.push(a>>>10&1023|55296),a=56320|1023&a),r.push(a),o+=s}return j(r)}function j(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var n="",r=0;r<e;)n+=String.fromCharCode.apply(String,t.slice(r,r+=tt));return n}function B(t,e,n){var r="";n=Math.min(t.length,n);for(var o=e;o<n;++o)r+=String.fromCharCode(127&t[o]);return r}function S(t,e,n){var r="";n=Math.min(t.length,n);for(var o=e;o<n;++o)r+=String.fromCharCode(t[o]);return r}function D(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);for(var o="",i=e;i<n;++i)o+=V(t[i]);return o}function N(t,e,n){for(var r=t.slice(e,n),o="",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}function Y(t,e,n){if(t%1!==0||t<0)throw new RangeError("offset is not uint");if(t+e>n)throw new RangeError("Trying to access beyond buffer length")}function F(t,e,n,r,o,i){if(!a.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||e<i)throw new RangeError('"value" argument is out of bounds');if(n+r>t.length)throw new RangeError("Index out of range")}function z(t,e,n,r){e<0&&(e=65535+e+1);for(var o=0,i=Math.min(t.length-n,2);o<i;++o)t[n+o]=(e&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function I(t,e,n,r){e<0&&(e=4294967295+e+1);for(var o=0,i=Math.min(t.length-n,4);o<i;++o)t[n+o]=e>>>8*(r?o:3-o)&255}function L(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function K(t,e,n,r,o){return o||L(t,e,n,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(t,e,n,r,23,4),n+4}function G(t,e,n,r,o){return o||L(t,e,n,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(t,e,n,r,52,8),n+8}function C(t){if(t=X(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function X(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function V(t){return t<16?"0"+t.toString(16):t.toString(16)}function W(t,e){e=e||1/0;for(var n,r=t.length,o=null,i=[],a=0;a<r;++a){if(n=t.charCodeAt(a),n>55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=(o-55296<<10|n-56320)+65536}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function Z(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n));return e}function J(t,e){for(var n,r,o,i=[],a=0;a<t.length&&!((e-=2)<0);++a)n=t.charCodeAt(a),r=n>>8,o=n%256,i.push(o),i.push(r);return i}function U(t){return Q.toByteArray(C(t))}function q(t,e,n,r){for(var o=0;o<r&&!(o+n>=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function H(t){return t!==t}var Q=t("base64-js"),$=t("ieee754"),_=t("isarray");n.Buffer=a,n.SlowBuffer=g,n.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:r(),n.kMaxLength=o(),a.poolSize=8192,a._augment=function(t){return t.__proto__=a.prototype,t},a.from=function(t,e,n){return s(null,t,e,n)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(t,e,n){return l(null,t,e,n)},a.allocUnsafe=function(t){return u(null,t)},a.allocUnsafeSlow=function(t){return u(null,t)},a.isBuffer=function(t){return!(null==t||!t._isBuffer)},a.compare=function(t,e){if(!a.isBuffer(t)||!a.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,o=0,i=Math.min(n,r);o<i;++o)if(t[o]!==e[o]){n=t[o],r=e[o];break}return n<r?-1:r<n?1:0},a.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},a.concat=function(t,e){if(!_(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return a.alloc(0);var n;if(void 0===e)for(e=0,n=0;n<t.length;++n)e+=t[n].length;var r=a.allocUnsafe(e),o=0;for(n=0;n<t.length;++n){var i=t[n];if(!a.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(r,o),o+=i.length}return r},a.byteLength=b,a.prototype._isBuffer=!0,a.prototype.swap16=function(){var t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)v(this,e,e+1);return this},a.prototype.swap32=function(){var t=this.length;if(t%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)v(this,e,e+3),v(this,e+1,e+2);return this},a.prototype.swap64=function(){var t=this.length;if(t%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)v(this,e,e+7),v(this,e+1,e+6),v(this,e+2,e+5),v(this,e+3,e+4);return this},a.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?E(this,0,t):y.apply(this,arguments)},a.prototype.equals=function(t){if(!a.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===a.compare(this,t)},a.prototype.inspect=function(){var t="",e=n.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),"<Buffer "+t+">"},a.prototype.compare=function(t,e,n,r,o){if(!a.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(e>>>=0,n>>>=0,r>>>=0,o>>>=0,this===t)return 0;for(var i=o-r,s=n-e,c=Math.min(i,s),l=this.slice(r,o),u=t.slice(e,n),f=0;f<c;++f)if(l[f]!==u[f]){i=l[f],s=u[f];break}return i<s?-1:s<i?1:0},a.prototype.includes=function(t,e,n){return this.indexOf(t,e,n)!==-1},a.prototype.indexOf=function(t,e,n){return A(this,t,e,n,!0)},a.prototype.lastIndexOf=function(t,e,n){return A(this,t,e,n,!1)},a.prototype.write=function(t,e,n,r){if(void 0===e)r="utf8",n=this.length,e=0;else if(void 0===n&&"string"==typeof e)r=e,n=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e=0|e,isFinite(n)?(n=0|n,void 0===r&&(r="utf8")):(r=n,n=void 0)}var o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":return M(this,t,e,n);case"latin1":case"binary":return T(this,t,e,n);case"base64":return R(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;a.prototype.slice=function(t,e){var n=this.length;t=~~t,e=void 0===e?n:~~e,t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),e<t&&(e=t);var r;if(a.TYPED_ARRAY_SUPPORT)r=this.subarray(t,e),r.__proto__=a.prototype;else{var o=e-t;r=new a(o,(void 0));for(var i=0;i<o;++i)r[i]=this[i+t]}return r},a.prototype.readUIntLE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t],o=1,i=0;++i<e&&(o*=256);)r+=this[t+i]*o;return r},a.prototype.readUIntBE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t+--e],o=1;e>0&&(o*=256);)r+=this[t+--e]*o;return r},a.prototype.readUInt8=function(t,e){return e||Y(t,1,this.length),this[t]},a.prototype.readUInt16LE=function(t,e){return e||Y(t,2,this.length),this[t]|this[t+1]<<8},a.prototype.readUInt16BE=function(t,e){return e||Y(t,2,this.length),this[t]<<8|this[t+1]},a.prototype.readUInt32LE=function(t,e){return e||Y(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},a.prototype.readUInt32BE=function(t,e){return e||Y(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},a.prototype.readIntLE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=this[t],o=1,i=0;++i<e&&(o*=256);)r+=this[t+i]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*e)),r},a.prototype.readIntBE=function(t,e,n){t=0|t,e=0|e,n||Y(t,e,this.length);for(var r=e,o=1,i=this[t+--r];r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},a.prototype.readInt8=function(t,e){return e||Y(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},a.prototype.readInt16LE=function(t,e){e||Y(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt16BE=function(t,e){e||Y(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt32LE=function(t,e){return e||Y(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},a.prototype.readInt32BE=function(t,e){return e||Y(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},a.prototype.readFloatLE=function(t,e){return e||Y(t,4,this.length),$.read(this,t,!0,23,4)},a.prototype.readFloatBE=function(t,e){return e||Y(t,4,this.length),$.read(this,t,!1,23,4)},a.prototype.readDoubleLE=function(t,e){return e||Y(t,8,this.length),$.read(this,t,!0,52,8)},a.prototype.readDoubleBE=function(t,e){return e||Y(t,8,this.length),$.read(this,t,!1,52,8)},a.prototype.writeUIntLE=function(t,e,n,r){if(t=+t,e=0|e,n=0|n,!r){var o=Math.pow(2,8*n)-1;F(this,t,e,n,o,0)}var i=1,a=0;for(this[e]=255&t;++a<n&&(i*=256);)this[e+a]=t/i&255;return e+n},a.prototype.writeUIntBE=function(t,e,n,r){if(t=+t,e=0|e,n=0|n,!r){var o=Math.pow(2,8*n)-1;F(this,t,e,n,o,0)}var i=n-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+n},a.prototype.writeUInt8=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,1,255,0),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},a.prototype.writeUInt16LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):z(this,t,e,!0),e+2},a.prototype.writeUInt16BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):z(this,t,e,!1),e+2},a.prototype.writeUInt32LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):I(this,t,e,!0),e+4},a.prototype.writeUInt32BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},a.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e=0|e,!r){var o=Math.pow(2,8*n-1);F(this,t,e,n,o-1,-o)}var i=0,a=1,s=0;for(this[e]=255&t;++i<n&&(a*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/a>>0)-s&255;return e+n},a.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e=0|e,!r){var o=Math.pow(2,8*n-1);F(this,t,e,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[e+i]=255&t;--i>=0&&(a*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/a>>0)-s&255;return e+n},a.prototype.writeInt8=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,1,127,-128),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},a.prototype.writeInt16LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):z(this,t,e,!0),e+2},a.prototype.writeInt16BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):z(this,t,e,!1),e+2},a.prototype.writeInt32LE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):I(this,t,e,!0),e+4},a.prototype.writeInt32BE=function(t,e,n){return t=+t,e=0|e,n||F(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):I(this,t,e,!1),e+4},a.prototype.writeFloatLE=function(t,e,n){return K(this,t,e,!0,n)},a.prototype.writeFloatBE=function(t,e,n){return K(this,t,e,!1,n)},a.prototype.writeDoubleLE=function(t,e,n){return G(this,t,e,!0,n)},a.prototype.writeDoubleBE=function(t,e,n){return G(this,t,e,!1,n)},a.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e<r-n&&(r=t.length-e+n);var o,i=r-n;if(this===t&&n<e&&e<r)for(o=i-1;o>=0;--o)t[o+e]=this[o+n];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(o=0;o<i;++o)t[o+e]=this[o+n];else Uint8Array.prototype.set.call(t,this.subarray(n,n+i),e);return i},a.prototype.fill=function(t,e,n,r){if("string"==typeof t){if("string"==typeof e?(r=e,e=0,n=this.length):"string"==typeof n&&(r=n,n=this.length),1===t.length){var o=t.charCodeAt(0);o<256&&(t=o)}if(void 0!==r&&"string"!=typeof r)throw new TypeError("encoding must be a string");if("string"==typeof r&&!a.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else"number"==typeof t&&(t=255&t);if(e<0||this.length<e||this.length<n)throw new RangeError("Out of range index");if(n<=e)return this;e>>>=0,n=void 0===n?this.length:n>>>0,t||(t=0);var i;if("number"==typeof t)for(i=e;i<n;++i)this[i]=t;else{var s=a.isBuffer(t)?t:W(new a(t,r).toString()),c=s.length;for(i=0;i<n-e;++i)this[i+e]=s[i%c]}return this};var et=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":1,ieee754:4,isarray:5}],3:[function(e,n,r){(function(e){/*!
+ * @license deepcopy.js Copyright(c) 2013 sasa+1
+ * https://github.com/sasaplus1/deepcopy.js
+ * Released under the MIT license.
+ */
+!function(e,o){"object"==typeof r&&"object"==typeof n?n.exports=o():"function"==typeof t&&t.amd?t([],o):"object"==typeof r?r.deepcopy=o():e.deepcopy=o()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";t.exports=n(3)},function(t,n){"use strict";function r(t,e){if("[object Array]"!==o.call(t))throw new TypeError("array must be an Array");var n=void 0,r=void 0,i=void 0;for(n=0,r=t.length;r>n;++n)if(i=t[n],i===e||i!==i&&e!==e)return n;return-1}n.__esModule=!0;var o=Object.prototype.toString,i="undefined"!=typeof e?function(t){return e.isBuffer(t)}:function(){return!1},a="function"==typeof Object.keys?function(t){return Object.keys(t)}:function(t){var e=typeof t;if(null===t||"function"!==e&&"object"!==e)throw new TypeError("obj must be an Object");var n=[],r=void 0;for(r in t)Object.prototype.hasOwnProperty.call(t,r)&&n.push(r);return n},s="function"==typeof Symbol?function(t){return Object.getOwnPropertySymbols(t)}:function(){return[]};n.getKeys=a,n.getSymbols=s,n.indexOf=r,n.isBuffer=i},function(t,n,r){"use strict";function o(t,e){var n=a(t);return null!==n?n:i(t,e)}function i(t,n){if("function"!=typeof n)throw new TypeError("customizer is must be a Function");if("function"==typeof t){var r=String(t);return/^\s*function\s*\S*\([^\)]*\)\s*{\s*\[native code\]\s*}/.test(r)?t:new Function("return "+String(r))()}var o=c.call(t);if("[object Array]"===o)return[];if("[object Object]"===o&&t.constructor===Object)return{};if("[object Date]"===o)return new Date(t.getTime());if("[object RegExp]"===o){var i=String(t),a=i.lastIndexOf("/");return new RegExp(i.slice(1,a),i.slice(a+1))}if((0,s.isBuffer)(t)){var l=new e(t.length);return t.copy(l),l}var u=n(t);return void 0!==u?u:null}function a(t){var e=typeof t;return null!==t&&"object"!==e&&"function"!==e?t:null}n.__esModule=!0,n.copyValue=n.copyCollection=n.copy=void 0;var s=r(1),c=Object.prototype.toString;n.copy=o,n.copyCollection=i,n.copyValue=a},function(t,e,n){"use strict";function r(t){}function o(t){var e=arguments.length<=1||void 0===arguments[1]?r:arguments[1];if(null===t)return null;var n=(0,a.copyValue)(t);if(null!==n)return n;var o=(0,a.copyCollection)(t,e),s=null!==o?o:t,c=[t],l=[s];return i(t,e,s,c,l)}function i(t,e,n,r,o){if(null===t)return null;var c=(0,a.copyValue)(t);if(null!==c)return c;var l=(0,s.getKeys)(t).concat((0,s.getSymbols)(t)),u=void 0,f=void 0,p=void 0,d=void 0,h=void 0,m=void 0,g=void 0,b=void 0;for(u=0,f=l.length;f>u;++u)p=l[u],d=t[p],h=(0,s.indexOf)(r,d),m=void 0,g=void 0,b=void 0,-1===h?(m=(0,a.copy)(d,e),g=null!==m?m:d,null!==d&&/^(?:function|object)$/.test(typeof d)&&(r.push(d),o.push(g))):b=o[h],n[p]=b||i(d,e,g,r,o);return n}e.__esModule=!0;var a=n(2),s=n(1);e["default"]=o,t.exports=e["default"]}])})}).call(this,e("buffer").Buffer)},{buffer:2}],4:[function(t,e,n){n.read=function(t,e,n,r,o){var i,a,s=8*o-r-1,c=(1<<s)-1,l=c>>1,u=-7,f=n?o-1:0,p=n?-1:1,d=t[e+f];for(f+=p,i=d&(1<<-u)-1,d>>=-u,u+=s;u>0;i=256*i+t[e+f],f+=p,u-=8);for(a=i&(1<<-u)-1,i>>=-u,u+=r;u>0;a=256*a+t[e+f],f+=p,u-=8);if(0===i)i=1-l;else{if(i===c)return a?NaN:(d?-1:1)*(1/0);a+=Math.pow(2,r),i-=l}return(d?-1:1)*a*Math.pow(2,i-r)},n.write=function(t,e,n,r,o,i){var a,s,c,l=8*i-o-1,u=(1<<l)-1,f=u>>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:i-1,h=r?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=u):(a=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-a))<1&&(a--,c*=2),e+=a+f>=1?p/c:p*Math.pow(2,1-f),e*c>=2&&(a++,c/=2),a+f>=u?(s=0,a=u):a+f>=1?(s=(e*c-1)*Math.pow(2,o),a+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,o),a=0));o>=8;t[n+d]=255&s,d+=h,s/=256,o-=8);for(a=a<<o|s,l+=o;l>0;t[n+d]=255&a,d+=h,a/=256,l-=8);t[n+d-h]|=128*m}},{}],5:[function(t,e,n){var r={}.toString;e.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},{}],6:[function(t,e,n){function r(t){return/^[a-z_$][0-9a-z_$]*$/gi.test(t)&&!i.test(t)}function o(t){if(a)return t.toString();var e=t.source.replace(/\//g,function(t,e,n){return 0===e||"\\"!==n[e-1]?"\\/":"/"}),n=(t.global&&"g"||"")+(t.ignoreCase&&"i"||"")+(t.multiline&&"m"||"");return"/"+e+"/"+n}/* toSource by Marcello Bastea-Forte - zlib license */
+e.exports=function(t,e,n,i){function a(t,e,n,i,s){function c(t){return n.slice(1)+t.join(","+(n&&"\n")+l)+(n?" ":"")}var l=i+n;switch(t=e?e(t):t,typeof t){case"string":return JSON.stringify(t);case"boolean":case"number":case"undefined":return""+t;case"function":return t.toString()}if(null===t)return"null";if(t instanceof RegExp)return o(t);if(t instanceof Date)return"new Date("+t.getTime()+")";var u=s.indexOf(t)+1;if(u>0)return"{$circularReference:"+u+"}";if(s.push(t),Array.isArray(t))return"["+c(t.map(function(t){return a(t,e,n,l,s.slice())}))+"]";var f=Object.keys(t);return f.length?"{"+c(f.map(function(o){return(r(o)?o:JSON.stringify(o))+":"+a(t[o],e,n,l,s.slice())}))+"}":"{}"}var s=[];return a(t,e,void 0===n?" ":n||"",i||"",s)};var i=/^(abstract|boolean|break|byte|case|catch|char|class|const|continue|debugger|default|delete|do|double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|undefined|var|void|volatile|while|with)$/,a="\\/"===new RegExp("/").source},{}],7:[function(t,e,n){e.exports={name:"pebble-clay",version:"1.0.4",description:"Pebble Config Framework",scripts:{"test-travis":"./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run --browsers chromeTravisCI && ./node_modules/.bin/eslint ./","test-debug":"(export DEBUG=true && ./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --no-single-run)",test:"./node_modules/.bin/gulp && ./node_modules/.bin/karma start ./test/karma.conf.js --single-run",lint:"./node_modules/.bin/eslint ./",build:"gulp",dev:"gulp dev","pebble-clean":"rm -rf tmp src/js/index.js && pebble clean","pebble-publish":"npm run pebble-clean && npm run build && pebble build && pebble package publish && npm run pebble-clean","pebble-build":"npm run build && pebble build"},repository:{type:"git",url:"git+https://github.com/pebble/clay.git"},keywords:["pebble","config","configuration","pebble-package"],author:"Pebble Technology",license:"MIT",bugs:{url:"https://github.com/pebble/clay/issues"},pebble:{projectType:"package",sdkVersion:"3",targetPlatforms:["aplite","basalt","chalk","diorite","emery"],resources:{media:[]},capabilities:["configurable"]},homepage:"https://github.com/pebble/clay#readme",devDependencies:{autoprefixer:"^6.3.1",bourbon:"^4.2.6",browserify:"^13.0.0","browserify-istanbul":"^0.2.1",chai:"^3.4.1",deamdify:"^0.2.0",deepcopy:"^0.6.1",del:"^2.0.2",eslint:"^1.5.1","eslint-config-pebble":"^1.2.0","eslint-plugin-standard":"^1.3.1",gulp:"^3.9.0","gulp-autoprefixer":"^3.1.0","gulp-htmlmin":"^1.3.0","gulp-inline":"0.0.15","gulp-insert":"^0.5.0","gulp-sass":"^2.1.1","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.5.2",joi:"^6.10.1",karma:"^0.13.19","karma-browserify":"^5.0.1","karma-chrome-launcher":"^0.2.2","karma-coverage":"^0.5.3","karma-mocha":"^0.2.1","karma-mocha-reporter":"^1.1.5","karma-source-map-support":"^1.1.0","karma-threshold-reporter":"^0.1.15",mocha:"^2.3.4",postcss:"^5.0.14","require-from-string":"^1.1.0",sassify:"^0.9.1",sinon:"^1.17.3",stringify:"^3.2.0",through:"^2.3.8",tosource:"^1.0.0","vinyl-buffer":"^1.0.0","vinyl-source-stream":"^1.1.0",watchify:"^3.7.0"},dependencies:{}}},{}],8:[function(t,e,n){"use strict";e.exports={name:"button",template:t("../../templates/components/button.tpl"),style:t("../../styles/clay/components/button.scss"),manipulator:"button",defaults:{primary:!1,attributes:{},description:""}}},{"../../styles/clay/components/button.scss":21,"../../templates/components/button.tpl":30}],9:[function(t,e,n){"use strict";e.exports={name:"checkboxgroup",template:t("../../templates/components/checkboxgroup.tpl"),style:t("../../styles/clay/components/checkboxgroup.scss"),manipulator:"checkboxgroup",defaults:{label:"",options:[],description:""}}},{"../../styles/clay/components/checkboxgroup.scss":22,"../../templates/components/checkboxgroup.tpl":31}],10:[function(t,e,n){"use strict";e.exports={name:"color",template:t("../../templates/components/color.tpl"),style:t("../../styles/clay/components/color.scss"),manipulator:"color",defaults:{label:"",description:""},initialize:function(t,e){function n(t){if("number"==typeof t)t=t.toString(16);else if(!t)return"transparent";return t=r(t),"#"+(f?p[t]:t)}function r(t){for(t=t.toLowerCase();t.length<6;)t="0"+t;return t}function o(t){switch(typeof t){case"number":return r(t.toString(16));case"string":return t.replace(/^#|^0x/,"");default:return t}}function i(t){return t.reduce(function(t,e){return t.concat(e)},[])}function a(t){t=t.replace(/^#|^0x/,"");var e=parseInt(t.slice(0,2),16)/255,n=parseInt(t.slice(2,4),16)/255,r=parseInt(t.slice(4),16)/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92;var o=(.4124*e+.3576*n+.1805*r)/.95047,i=(.2126*e+.7152*n+.0722*r)/1,a=(.0193*e+.1192*n+.9505*r)/1.08883;return o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,i=i>.008856?Math.pow(i,1/3):7.787*i+16/116,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,[116*i-16,500*(o-i),200*(i-a)]}function s(t,e){var n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2];return Math.sqrt(Math.pow(n,2)+Math.pow(r,2)+Math.pow(o,2))}function c(){return!e.meta.activeWatchInfo||2===e.meta.activeWatchInfo.firmware.major||["aplite","diorite"].indexOf(e.meta.activeWatchInfo.platform)>-1&&!u.config.allowGray?d.BLACK_WHITE:["aplite","diorite"].indexOf(e.meta.activeWatchInfo.platform)>-1&&u.config.allowGray?d.GRAY:d.COLOR}var l=t.HTML,u=this;u.roundColorToLayout=function(t){var e=o(t);if(m.indexOf(e)===-1){var n=a(e),r=m.map(function(t){var e=a(o(t));return s(n,e)}),i=Math.min.apply(Math,r),c=r.indexOf(i);e=m[c]}return parseInt(e,16)};var f=u.config.sunlight!==!1,p={"000000":"000000","000055":"001e41","0000aa":"004387","0000ff":"0068ca","005500":"2b4a2c","005555":"27514f","0055aa":"16638d","0055ff":"007dce","00aa00":"5e9860","00aa55":"5c9b72","00aaaa":"57a5a2","00aaff":"4cb4db","00ff00":"8ee391","00ff55":"8ee69e","00ffaa":"8aebc0","00ffff":"84f5f1",550000:"4a161b",550055:"482748","5500aa":"40488a","5500ff":"2f6bcc",555500:"564e36",555555:"545454","5555aa":"4f6790","5555ff":"4180d0","55aa00":"759a64","55aa55":"759d76","55aaaa":"71a6a4","55aaff":"69b5dd","55ff00":"9ee594","55ff55":"9de7a0","55ffaa":"9becc2","55ffff":"95f6f2",aa0000:"99353f",aa0055:"983e5a",aa00aa:"955694",aa00ff:"8f74d2",aa5500:"9d5b4d",aa5555:"9d6064",aa55aa:"9a7099",aa55ff:"9587d5",aaaa00:"afa072",aaaa55:"aea382",aaaaaa:"ababab",ffffff:"ffffff",aaaaff:"a7bae2",aaff00:"c9e89d",aaff55:"c9eaa7",aaffaa:"c7f0c8",aaffff:"c3f9f7",ff0000:"e35462",ff0055:"e25874",ff00aa:"e16aa3",ff00ff:"de83dc",ff5500:"e66e6b",ff5555:"e6727c",ff55aa:"e37fa7",ff55ff:"e194df",ffaa00:"f1aa86",ffaa55:"f1ad93",ffaaaa:"efb5b8",ffaaff:"ecc3eb",ffff00:"ffeeab",ffff55:"fff1b5",ffffaa:"fff6d3"},d={COLOR:[[!1,!1,"55ff00","aaff55",!1,"ffff55","ffffaa",!1,!1],[!1,"aaffaa","55ff55","00ff00","aaff00","ffff00","ffaa55","ffaaaa",!1],["55ffaa","00ff55","00aa00","55aa00","aaaa55","aaaa00","ffaa00","ff5500","ff5555"],["aaffff","00ffaa","00aa55","55aa55","005500","555500","aa5500","ff0000","ff0055"],[!1,"55aaaa","00aaaa","005555","ffffff","000000","aa5555","aa0000",!1],["55ffff","00ffff","00aaff","0055aa","aaaaaa","555555","550000","aa0055","ff55aa"],["55aaff","0055ff","0000ff","0000aa","000055","550055","aa00aa","ff00aa","ffaaff"],[!1,"5555aa","5555ff","5500ff","5500aa","aa00ff","ff00ff","ff55ff",!1],[!1,!1,!1,"aaaaff","aa55ff","aa55aa",!1,!1,!1]],GRAY:[["000000","aaaaaa","ffffff"]],BLACK_WHITE:[["000000","ffffff"]]},h=u.config.layout||c();"string"==typeof h&&(h=d[h]),Array.isArray(h[0])||(h=[h]);var m=i(h).map(function(t){return o(t)}).filter(function(t){return t}),g="",b=h.length,y=0;h.forEach(function(t){y=t.length>y?t.length:y});for(var v=100/y,A=100/b,w=u.$element,k=0;k<b;k++)for(var x=0;x<y;x++){var M=o(h[k][x]),T=M?" selectable":"",R=0===k&&0===x||0===k&&!h[k][x-1]||!h[k][x-1]&&!h[k-1][x]?" rounded-tl":"",P=0===k&&!h[k][x+1]||!h[k][x+1]&&!h[k-1][x]?" rounded-tr ":"",O=k===h.length-1&&0===x||k===h.length-1&&!h[k][x-1]||!h[k][x-1]&&!h[k+1][x]?" rounded-bl":"",E=k===h.length-1&&!h[k][x+1]||!h[k][x+1]&&!h[k+1][x]?" rounded-br":"";g+='<i class="color-box '+T+R+P+O+E+'" '+(M?'data-value="'+parseInt(M,16)+'" ':"")+'style="width:'+v+"%; height:"+A+"%; background:"+n(M)+';"></i>'}var j=0;3===y&&(j=5),2===y&&(j=8);var B=j*v/A+"%",S=j+"%";w.select(".color-box-container").add(l(g)).set("$paddingTop",B).set("$paddingRight",S).set("$paddingBottom",B).set("$paddingLeft",S),w.select(".color-box-wrap").set("$paddingBottom",v/A*100+"%");var D=w.select(".value"),N=w.select(".picker-wrap"),Y=u.$manipulatorTarget.get("disabled");w.select("label").on("click",function(){Y||N.set("show")}),u.on("change",function(){var t=u.get();D.set("$background-color",n(t)),w.select(".color-box").set("-selected"),w.select('.color-box[data-value="'+t+'"]').set("+selected")}),w.select(".color-box.selectable").on("click",function(t){u.set(parseInt(t.target.dataset.value,10)),N.set("-show")}),N.on("click",function(){N.set("-show")}),u.on("disabled",function(){Y=!0}),u.on("enabled",function(){Y=!1}),u._layout=h}}},{"../../styles/clay/components/color.scss":23,"../../templates/components/color.tpl":32}],11:[function(t,e,n){"use strict";e.exports={name:"footer",template:t("../../templates/components/footer.tpl"),manipulator:"html"}},{"../../templates/components/footer.tpl":33}],12:[function(t,e,n){"use strict";e.exports={name:"heading",template:t("../../templates/components/heading.tpl"),manipulator:"html",defaults:{size:4}}},{"../../templates/components/heading.tpl":34}],13:[function(t,e,n){"use strict";e.exports={color:t("./color"),footer:t("./footer"),heading:t("./heading"),input:t("./input"),select:t("./select"),submit:t("./submit"),text:t("./text"),toggle:t("./toggle"),radiogroup:t("./radiogroup"),checkboxgroup:t("./checkboxgroup"),button:t("./button"),slider:t("./slider")}},{"./button":8,"./checkboxgroup":9,"./color":10,"./footer":11,"./heading":12,"./input":14,"./radiogroup":15,"./select":16,"./slider":17,"./submit":18,"./text":19,"./toggle":20}],14:[function(t,e,n){"use strict";e.exports={name:"input",template:t("../../templates/components/input.tpl"),style:t("../../styles/clay/components/input.scss"),manipulator:"val",defaults:{label:"",description:"",attributes:{}}}},{"../../styles/clay/components/input.scss":24,"../../templates/components/input.tpl":35}],15:[function(t,e,n){"use strict";e.exports={name:"radiogroup",template:t("../../templates/components/radiogroup.tpl"),style:t("../../styles/clay/components/radiogroup.scss"),manipulator:"radiogroup",defaults:{label:"",options:[],description:"",attributes:{}}}},{"../../styles/clay/components/radiogroup.scss":25,"../../templates/components/radiogroup.tpl":36}],16:[function(t,e,n){"use strict";e.exports={name:"select",template:t("../../templates/components/select.tpl"),style:t("../../styles/clay/components/select.scss"),manipulator:"val",defaults:{label:"",options:[],description:"",attributes:{}},initialize:function(){function t(){var t=e.$manipulatorTarget.get("selectedIndex"),r=e.$manipulatorTarget.select("option"),o=r[t]&&r[t].innerHTML;n.set("innerHTML",o)}var e=this,n=e.$element.select(".value");t(),e.on("change",t)}}},{"../../styles/clay/components/select.scss":26,"../../templates/components/select.tpl":37}],17:[function(t,e,n){"use strict";e.exports={name:"slider",template:t("../../templates/components/slider.tpl"),style:t("../../styles/clay/components/slider.scss"),manipulator:"slider",defaults:{label:"",description:"",min:0,max:100,step:1,attributes:{}},initialize:function(){function t(){var t=e.get().toFixed(e.precision);n.set("value",t),r.set("innerHTML",t)}var e=this,n=e.$element.select(".value"),r=e.$element.select(".value-pad"),o=e.$manipulatorTarget,i=o.get("step");i=i.toString(10).split(".")[1],e.precision=i?i.length:0,e.on("change",t),o.on("|input",t),t(),n.on("|input",function(){r.set("innerHTML",this.get("value"))}),n.on("|change",function(){e.set(this.get("value")),t()})}}},{"../../styles/clay/components/slider.scss":27,"../../templates/components/slider.tpl":38}],18:[function(t,e,n){"use strict";e.exports={name:"submit",template:t("../../templates/components/submit.tpl"),style:t("../../styles/clay/components/submit.scss"),manipulator:"button",defaults:{attributes:{}}}},{"../../styles/clay/components/submit.scss":28,"../../templates/components/submit.tpl":39}],19:[function(t,e,n){"use strict";e.exports={name:"text",template:t("../../templates/components/text.tpl"),manipulator:"html"}},{"../../templates/components/text.tpl":40}],20:[function(t,e,n){"use strict";e.exports={name:"toggle",template:t("../../templates/components/toggle.tpl"),style:t("../../styles/clay/components/toggle.scss"),manipulator:"checked",defaults:{label:"",description:"",attributes:{}}}},{"../../styles/clay/components/toggle.scss":29,"../../templates/components/toggle.tpl":41}],21:[function(t,e,n){e.exports=".component-button { text-align: center; }\n\n.section .component-button { padding-bottom: 0; }\n\n.component-button .description { padding-left: 0; padding-right: 0; }\n"},{}],22:[function(t,e,n){e.exports=".component-checkbox { display: block; }\n\n.section .component-checkbox { padding-right: 0.375rem; }\n\n.component-checkbox > .label { display: block; padding-bottom: 0.35rem; }\n\n.component-checkbox .checkbox-group { padding-bottom: 0.35rem; }\n\n.component-checkbox .checkbox-group label { padding: 0.35rem 0.375rem; }\n\n.component-checkbox .checkbox-group .label { font-size: 0.9em; }\n\n.component-checkbox .checkbox-group input { opacity: 0; position: absolute; }\n\n.component-checkbox .checkbox-group i { display: block; position: relative; border-radius: 0.25rem; width: 1.4rem; height: 1.4rem; border: 0.11765rem solid #767676; -webkit-flex-shrink: 0; flex-shrink: 0; }\n\n.component-checkbox .checkbox-group input:checked + i { border-color: #ff4700; background: #ff4700; }\n\n.component-checkbox .checkbox-group input:checked + i:after { content: ''; box-sizing: border-box; -webkit-transform: rotate(45deg); transform: rotate(45deg); position: absolute; left: 0.35rem; top: -0.05rem; display: block; width: 0.5rem; height: 1rem; border: 0 solid #ffffff; border-right-width: 0.11765rem; border-bottom-width: 0.11765rem; }\n\n.component-checkbox .description { padding-left: 0; padding-right: 0; }\n"},{}],23:[function(t,e,n){e.exports=".section .component-color { padding: 0; }\n\n.component-color .value { width: 2.2652rem; height: 1.4rem; border-radius: 0.7rem; box-shadow: 0 0.1rem 0.1rem #2f2f2f; display: block; background: #000; }\n\n.component-color .picker-wrap { left: 0; top: 0; right: 0; bottom: 0; position: fixed; padding: 0.7rem 0.375rem; background: rgba(0, 0, 0, 0.65); opacity: 0; -webkit-transition: opacity 100ms ease-in 175ms; transition: opacity 100ms ease-in 175ms; pointer-events: none; z-index: 100; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -webkit-align-items: center; align-items: center; }\n\n.component-color .picker-wrap .picker { padding: 0.7rem 0.75rem; background: #484848; box-shadow: 0 0.17647rem 0.88235rem rgba(0, 0, 0, 0.4); border-radius: 0.25rem; width: 100%; max-width: 26rem; overflow: auto; }\n\n.component-color .picker-wrap.show { -webkit-transition-delay: 0ms; transition-delay: 0ms; pointer-events: auto; opacity: 1; }\n\n.component-color .color-box-wrap { box-sizing: border-box; position: relative; height: 0; width: 100%; padding: 0 0 100% 0; }\n\n.component-color .color-box-wrap .color-box-container { position: absolute; height: 99.97%; width: 100%; left: 0; top: 0; }\n\n.component-color .color-box-wrap .color-box-container .color-box { float: left; cursor: pointer; -webkit-tap-highlight-color: transparent; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-tl { border-top-left-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-tr { border-top-right-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-bl { border-bottom-left-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.rounded-br { border-bottom-right-radius: 0.25rem; }\n\n.component-color .color-box-wrap .color-box-container .color-box.selected { -webkit-transform: scale(1.1); transform: scale(1.1); border-radius: 0.25rem; box-shadow: #111 0 0 0.24rem; position: relative; z-index: 100; }\n"},{}],24:[function(t,e,n){e.exports=".section .component-input { padding: 0; }\n\n.component-input label { display: block; }\n\n.component-input .label { padding-bottom: 0.7rem; }\n\n.component-input .input { position: relative; min-width: 100%; margin-top: 0.7rem; margin-left: 0; }\n\n.component-input input { display: block; width: 100%; background: #333333; border-radius: 0.25rem; padding: 0.35rem 0.375rem; border: none; vertical-align: baseline; color: #ffffff; font-size: inherit; -webkit-appearance: none; appearance: none; min-height: 2.1rem; }\n\n.component-input input::-webkit-input-placeholder { color: #858585; }\n\n.component-input input::-moz-placeholder { color: #858585; }\n\n.component-input input:-moz-placeholder { color: #858585; }\n\n.component-input input:-ms-input-placeholder { color: #858585; }\n\n.component-input input:focus { border: none; box-shadow: none; }\n\n.component-input input:focus::-webkit-input-placeholder { color: #666666; }\n\n.component-input input:focus::-moz-placeholder { color: #666666; }\n\n.component-input input:focus:-moz-placeholder { color: #666666; }\n\n.component-input input:focus:-ms-input-placeholder { color: #666666; }\n"},{}],25:[function(t,e,n){e.exports=".component-radio { display: block; }\n\n.section .component-radio { padding-right: 0.375rem; }\n\n.component-radio > .label { display: block; padding-bottom: 0.35rem; }\n\n.component-radio .radio-group { padding-bottom: 0.35rem; }\n\n.component-radio .radio-group label { padding: 0.35rem 0.375rem; }\n\n.component-radio .radio-group .label { font-size: 0.9em; }\n\n.component-radio .radio-group input { opacity: 0; position: absolute; }\n\n.component-radio .radio-group i { display: block; position: relative; border-radius: 1.4rem; width: 1.4rem; height: 1.4rem; border: 2px solid #767676; -webkit-flex-shrink: 0; flex-shrink: 0; }\n\n.component-radio .radio-group input:checked + i { border-color: #ff4700; }\n\n.component-radio .radio-group input:checked + i:after { content: ''; display: block; position: absolute; left: 15%; right: 15%; top: 15%; bottom: 15%; border-radius: 1.4rem; background: #ff4700; }\n\n.component-radio .description { padding-left: 0; padding-right: 0; }\n"},{}],26:[function(t,e,n){e.exports='.section .component-select { padding: 0; }\n\n.component-select label { position: relative; }\n\n.component-select .value { position: relative; padding-right: 1.1rem; display: block; }\n\n.component-select .value:after { content: ""; position: absolute; right: 0; top: 50%; margin-top: -0.1rem; height: 0; width: 0; border-left: 0.425rem solid transparent; border-right: 0.425rem solid transparent; border-top: 0.425rem solid #ff4700; }\n\n.component-select select { opacity: 0; position: absolute; display: block; left: 0; right: 0; top: 0; bottom: 0; width: 100%; border: none; margin: 0; padding: 0; }\n'},{}],27:[function(t,e,n){e.exports=".section .component-slider { padding: 0; }\n\n.component-slider label { display: block; }\n\n.component-slider .label-container { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center; width: 100%; padding-bottom: 0.7rem; }\n\n.component-slider .label { -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; min-width: 1rem; display: block; padding-right: 0.75rem; }\n\n.component-slider .value-wrap { display: block; position: relative; }\n\n.component-slider .value, .component-slider .value-pad { display: block; background: #333333; border-radius: 0.25rem; padding: 0.35rem 0.375rem; border: none; vertical-align: baseline; color: #ffffff; text-align: right; margin: 0; min-width: 1rem; }\n\n.component-slider .value-pad { visibility: hidden; }\n\n.component-slider .value-pad:before { content: ' '; display: inline-block; }\n\n.component-slider .value { max-width: 100%; position: absolute; left: 0; top: 0; }\n\n.component-slider .input-wrap { padding: 0 0.75rem 0.7rem; }\n\n.component-slider .input { display: block; position: relative; min-width: 100%; height: 1.4rem; overflow: hidden; margin-left: 0; }\n\n.component-slider .input:before { content: ''; display: block; position: absolute; height: 0.17647rem; background: #666666; width: 100%; top: 0.61176rem; }\n\n.component-slider .input .slider { display: block; width: 100%; -webkit-appearance: none; appearance: none; position: relative; height: 1.4rem; margin: 0; background-color: transparent; }\n\n.component-slider .input .slider:focus { outline: none; }\n\n.component-slider .input .slider::-webkit-slider-runnable-track { border: none; height: 1.4rem; width: 100%; background-color: transparent; }\n\n.component-slider .input .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; position: relative; height: 1.4rem; width: 1.4rem; background-color: #ff4700; border-radius: 50%; }\n\n.component-slider .input .slider::-webkit-slider-thumb:before { content: \"\"; position: absolute; left: -1000px; top: 0.61176rem; height: 0.17647rem; width: 1001px; background: #ff4700; }\n"},{}],28:[function(t,e,n){e.exports=".component-submit { text-align: center; }\n"},{}],29:[function(t,e,n){e.exports=".section .component-toggle { padding: 0; }\n\n.component-toggle input { display: none; }\n\n.component-toggle .graphic { display: inline-block; position: relative; }\n\n.component-toggle .graphic .slide { display: block; border-radius: 1.05rem; height: 1.05rem; width: 2.2652rem; background: #2f2f2f; -webkit-transition: background-color 150ms linear; transition: background-color 150ms linear; }\n\n.component-toggle .graphic .marker { background: #ececec; width: 1.4rem; height: 1.4rem; border-radius: 1.4rem; position: absolute; left: 0; display: block; top: -0.175rem; -webkit-transition: -webkit-transform 150ms linear; transition: -webkit-transform 150ms linear; transition: transform 150ms linear; transition: transform 150ms linear, -webkit-transform 150ms linear; box-shadow: 0 0.1rem 0.1rem #2f2f2f; }\n\n.component-toggle input:checked + .graphic .slide { background: #993d19; }\n\n.component-toggle input:checked + .graphic .marker { background: #ff4700; -webkit-transform: translateX(0.8652rem); transform: translateX(0.8652rem); }\n"},{}],30:[function(t,e,n){e.exports='<div class="component component-button">\n <button\n type="button"\n data-manipulator-target\n class="{{primary ? \'primary\' : \'\'}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n ></button>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],31:[function(t,e,n){e.exports='<div class="component component-checkbox">\n <span class="label">{{{label}}}</span>\n <div class="checkbox-group">\n {{each options}}\n <label class="tap-highlight">\n <span class="label">{{{this}}}</span>\n <input type="checkbox" value="1" name="clay-{{clayId}}" />\n <i></i>\n </label>\n {{/each}}\n </div>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],32:[function(t,e,n){e.exports='<div class="component component-color">\n <label class="tap-highlight">\n <input\n data-manipulator-target\n type="hidden"\n />\n <span class="label">{{{label}}}</span>\n <span class="value"></span>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n <div class="picker-wrap">\n <div class="picker">\n <div class="color-box-wrap">\n <div class="color-box-container"></div>\n </div>\n </div>\n </div>\n</div>\n'},{}],33:[function(t,e,n){e.exports='<footer data-manipulator-target class="component component-footer"></footer>\n'},{}],34:[function(t,e,n){e.exports='<div class="component component-heading">\n <h{{size}} data-manipulator-target></h{{size}}>\n</div>\n'},{}],35:[function(t,e,n){e.exports='<div class="component component-input">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="input">\n <input\n data-manipulator-target\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n </span>\n </label>\n\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],36:[function(t,e,n){e.exports='<div class="component component-radio">\n <span class="label">{{{label}}}</span>\n <div class="radio-group">\n {{each options}}\n <label class="tap-highlight">\n <span class="label">{{{this.label}}}</span>\n <input\n type="radio"\n value="{{this.value}}"\n name="clay-{{clayId}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n <i></i>\n </label>\n {{/each}}\n </div>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],37:[function(t,e,n){e.exports='<div class="component component-select">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="value"></span>\n <select data-manipulator-target {{each key: attributes}}{{key}}="{{this}}"{{/each}}>\n {{each options}}\n {{if Array.isArray(this.value)}}\n <optgroup label="{{this.label}}">\n {{each this.value}}\n <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>\n {{/each}}\n </optgroup>\n {{else}}\n <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>\n {{/if}}\n {{/each}}\n </select>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],38:[function(t,e,n){e.exports='<div class="component component-slider">\n <label class="tap-highlight">\n <span class="label-container">\n <span class="label">{{{label}}}</span>\n <span class="value-wrap">\n <span class="value-pad"></span>\n <input type="text" class="value" />\n </span>\n </span>\n <span class="input">\n <input\n data-manipulator-target\n class="slider"\n type="range"\n min="{{min}}"\n max="{{max}}"\n step="{{step}}"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n </span>\n</label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],39:[function(t,e,n){e.exports='<div class="component component-submit">\n <button\n data-manipulator-target\n type="submit"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n ></button>\n</div>\n'},{}],40:[function(t,e,n){e.exports='<div class="component component-text">\n <p data-manipulator-target></p>\n</div>\n'},{}],41:[function(t,e,n){e.exports='<div class="component component-toggle">\n <label class="tap-highlight">\n <span class="label">{{{label}}}</span>\n <span class="input">\n <input\n data-manipulator-target\n type="checkbox"\n {{each key: attributes}}{{key}}="{{this}}"{{/each}}\n />\n <span class="graphic">\n <span class="slide"></span>\n <span class="marker"></span>\n </span>\n </span>\n </label>\n {{if description}}\n <div class="description">{{{description}}}</div>\n {{/if}}\n</div>\n'},{}],42:[function(t,e,n){e.exports='<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><style>@font-face{font-family:PFDinDisplayProRegularWebfont;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;font:inherit;vertical-align:baseline}button,input,textarea{outline:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote:after,blockquote:before,q:after,q:before{content:\'\';content:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body,html{font-weight:400;font-family:PFDinDisplayPro-Regular,PFDinDisplayProRegularWebfont,sans-serif;-webkit-font-smoothing:antialiased;font-size:17px;line-height:1.4;height:100%;color:#fff}body.platform-ios,html.platform-ios{font-size:16px}body{background-color:#333;padding:0 .75rem .7rem}em{font-style:italic}strong{font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;color:#ff4700}.platform-android strong{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}a{color:#858585}a:hover{color:inherit}h1,h2,h3,h4{text-transform:uppercase;font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;text-transform:uppercase;position:relative;top:.05rem;line-height:.9}.platform-android h1,.platform-android h2,.platform-android h3,.platform-android h4{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}h1{font-size:2rem;line-height:2.8rem}h2{font-size:1.8rem;line-height:2.8rem}h3{font-size:1.5rem;line-height:2.8rem}h4{font-size:1.2rem;line-height:1.4rem}h5{font-size:1rem;line-height:1.4rem}h6{font-size:.8rem;line-height:1.4rem}input{font-family:inherit;font-size:inherit;line-height:inherit}label{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center;padding:.7rem .75rem}label .input{white-space:nowrap;display:-webkit-box;display:-webkit-flex;display:flex;max-width:50%;margin-left:.75rem}label.invalid .input:after{content:"!";display:inline-block;color:#fff;background:#ff4700;border-radius:.55rem;width:1.1rem;text-align:center;height:1.1rem;font-size:.825rem;vertical-align:middle;line-height:1.1rem;box-shadow:0 .1rem .1rem #2f2f2f;font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;-webkit-box-flex:0;-webkit-flex:0 0 1.1rem;flex:0 0 1.1rem;margin-left:.3rem}.platform-android label.invalid .input:after{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}.hide{display:none!important}.tap-highlight{-webkit-tap-highlight-color:rgba(255,255,255,.1);border-radius:.25rem}.tap-highlight:active{background-color:rgba(255,255,255,.1)}.component{padding-top:.7rem}.component.disabled{pointer-events:none}.component.disabled>*{opacity:.25}.section{background:#484848;border-radius:.25rem;box-shadow:#2f2f2f 0 .15rem .25rem}.section>.component{padding-bottom:.7rem;padding-right:.75rem;padding-left:.75rem;position:relative;margin-top:1rem}.section>.component:not(.hide)~.component{margin-top:0}.section>.component:first-child:after{display:none}.section>.component:after{content:"";background:#666;display:block;position:absolute;top:0;left:.375rem;right:.375rem;height:1px;pointer-events:none}.section>.component:not(.hide):after{display:none}.section>.component:not(.hide)~.component:not(.hide):after{display:block}.section>.component-heading:first-child{background:#414141;border-radius:.25rem .25rem 0 0}.section>.component-heading:first-child:after,.section>.component-heading:first-child~.component:not(.hide):after{display:none}.section>.component-heading:first-child~.component:not(.hide)~.component:not(.hide):after{display:block}.description{padding:0 .75rem .7rem;font-size:.9rem;line-height:1.4rem;color:#a4a4a4;text-align:left}.inputs{display:block;width:100%;border-collapse:collapse}.button,button{font-weight:400;font-family:PFDinDisplayPro-Medium,PFDinDisplayProRegularWebfont,sans-serif;font-size:1rem;line-height:1.4rem;text-transform:uppercase;background-color:#767676;border-radius:.25rem;border:none;display:inline-block;color:#fff;min-width:12rem;text-align:center;margin:0 auto .7rem;padding:.6rem;-webkit-tap-highlight-color:#858585}.platform-android .button,.platform-android button{font-family:PFDinDisplayProRegularWebfont,sans-serif;font-weight:700;letter-spacing:.025em}.button:active,button:active{background-color:#858585}.platform-ios .button,.platform-ios button{padding:.5rem}.button.primary,.button[type=submit],button.primary,button[type=submit]{background-color:#ff4700;-webkit-tap-highlight-color:red}.button.primary:active,.button[type=submit]:active,button.primary:active,button[type=submit]:active{background-color:red}a.button{text-decoration:none;color:#fff}</style><meta name="viewport"content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><script>window.returnTo="$$RETURN_TO$$",window.clayConfig=$$CONFIG$$,window.claySettings=$$SETTINGS$$,window.customFn=$$CUSTOM_FN$$,window.clayComponents=$$COMPONENTS$$,window.clayMeta=$$META$$</script></head><body><form id="main-form"class="inputs"></form><script>!function t(e,n,r){function i(a,u){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module \'"+a+"\'");throw c.code="MODULE_NOT_FOUND",c}var f=n[a]={exports:{}};e[a][0].call(f.exports,function(t){var n=e[a][1][t];return i(n?n:t)},f,f.exports,t,e,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(t,e,n){"use strict";var r=t("./vendor/minified"),i=t("./lib/clay-config"),o=r.$,a=r._,u=a.extend([],window.clayConfig||[]),s=a.extend({},window.claySettings||{}),c=window.returnTo||"pebblejs://close#",f=window.customFn||function(){},l=window.clayComponents||{},h=window.clayMeta||{},m=window.navigator.userAgent.match(/android/i)?"android":"ios";document.documentElement.classList.add("platform-"+m),a.eachObj(l,function(t,e){i.registerComponent(e)});var p=o("#main-form"),d=new i(s,u,p,h);p.on("submit",function(){location.href=c+encodeURIComponent(JSON.stringify(d.serialize()))}),f.call(d,r),d.build()},{"./lib/clay-config":2,"./vendor/minified":8}],2:[function(t,e,n){"use strict";function r(t,e,n,c){function f(){m=[],p={},d={},g=!1}function l(t,e){if(Array.isArray(t))t.forEach(function(t){l(t,e)});else if(u.includesCapability(c.activeWatchInfo,t.capabilities))if("section"===t.type){var n=i(\'<div class="section">\');e.add(n),l(t.items,n)}else{var r=o.copyObj(t);r.clayId=m.length;var s=new a(r).initialize(v);r.id&&(p[r.id]=s),r.messageKey&&(d[r.messageKey]=s),m.push(s);var f="undefined"!=typeof y[r.messageKey]?y[r.messageKey]:r.defaultValue;s.set("undefined"!=typeof f?f:""),e.add(s.$element)}}function h(t){if(!g)throw new Error("ClayConfig not built. build() must be run before you can run "+t+"()");return!0}var m,p,d,g,v=this,y=o.copyObj(t);v.meta=c,v.$rootContainer=n,v.EVENTS={BEFORE_BUILD:"BEFORE_BUILD",AFTER_BUILD:"AFTER_BUILD",BEFORE_DESTROY:"BEFORE_DESTROY",AFTER_DESTROY:"AFTER_DESTROY"},u.updateProperties(v.EVENTS,{writable:!1}),v.getAllItems=function(){return h("getAllItems"),m},v.getItemByMessageKey=function(t){return h("getItemByMessageKey"),d[t]},v.getItemById=function(t){return h("getItemById"),p[t]},v.getItemsByType=function(t){return h("getItemsByType"),m.filter(function(e){return e.config.type===t})},v.getItemsByGroup=function(t){return h("getItemsByGroup"),m.filter(function(e){return e.config.group===t})},v.serialize=function(){return h("serialize"),y={},o.eachObj(d,function(t,e){y[t]={value:e.get()},e.precision&&(y[t].precision=e.precision)}),y},v.registerComponent=r.registerComponent,v.destroy=function(){var t=n[0];for(v.trigger(v.EVENTS.BEFORE_DESTROY);t.firstChild;)t.removeChild(t.firstChild);return f(),v.trigger(v.EVENTS.AFTER_DESTROY),v},v.build=function(){return g&&v.destroy(),v.trigger(v.EVENTS.BEFORE_BUILD),l(v.config,n),g=!0,v.trigger(v.EVENTS.AFTER_BUILD),v},f(),s.call(v,n),u.updateProperties(v,{writable:!1,configurable:!1}),v.config=e}var i=t("../vendor/minified").HTML,o=t("../vendor/minified")._,a=t("./clay-item"),u=t("../lib/utils"),s=t("./clay-events"),c=t("./component-registry"),f=t("./manipulators");r.registerComponent=function(t){var e=o.copyObj(t);if(c[e.name])return console.warn("Component: "+e.name+" is already registered. If you wish to override the existing functionality, you must provide a new name"),!1;if("string"==typeof e.manipulator&&(e.manipulator=f[t.manipulator],!e.manipulator))throw new Error("The manipulator: "+t.manipulator+" does not exist in the built-in manipulators.");if(!e.manipulator)throw new Error("The manipulator must be defined");if("function"!=typeof e.manipulator.set||"function"!=typeof e.manipulator.get)throw new Error("The manipulator must have both a `get` and `set` method");if(e.style){var n=document.createElement("style");n.type="text/css",n.appendChild(document.createTextNode(e.style)),document.head.appendChild(n)}return c[e.name]=e,!0},e.exports=r},{"../lib/utils":7,"../vendor/minified":8,"./clay-events":3,"./clay-item":4,"./component-registry":5,"./manipulators":6}],3:[function(t,e,n){"use strict";function r(t){function e(t){return t.split(" ").map(function(t){return"|"+t.replace(/^\\|/,"")}).join(" ")}function n(t,e){var n=o.find(u,function(e){return e.handler===t?e:null});return n||(n={handler:t,proxy:e},u.push(n)),n.proxy}function r(t){return o.find(u,function(e){return e.handler===t?e.proxy:null})}var a=this,u=[];a.on=function(r,i){var o=e(r),a=this,u=n(i,function(){i.apply(a,arguments)});return t.on(o,u),a},a.off=function(t){var e=r(t);return e&&i.off(e),a},a.trigger=function(e,n){return t.trigger(e,n),a}}var i=t("../vendor/minified").$,o=t("../vendor/minified")._;e.exports=r},{"../vendor/minified":8}],4:[function(t,e,n){"use strict";function r(t){var e=this,n=i[t.type];if(!n)throw new Error("The component: "+t.type+" is not registered. Make sure to register it with ClayConfig.registerComponent()");var r={i18n:{foo:"bar"}},f=s.extend({},n.defaults||{},t,r),l=s.formatHtml(n.template.trim(),f);e.id=t.id||null,e.messageKey=t.messageKey||null,e.config=t,e.$element=c(l,f),e.$manipulatorTarget=e.$element.select("[data-manipulator-target]"),e.$manipulatorTarget.length||(e.$manipulatorTarget=e.$element),e.initialize=function(t){return"function"==typeof n.initialize&&n.initialize.call(e,o,t),e},u.call(e,e.$manipulatorTarget),s.eachObj(n.manipulator,function(t,n){e[t]=n.bind(e)}),a.updateProperties(e,{writable:!1,configurable:!1})}var i=t("./component-registry"),o=t("../vendor/minified"),a=t("../lib/utils"),u=t("./clay-events"),s=o._,c=o.HTML;e.exports=r},{"../lib/utils":7,"../vendor/minified":8,"./clay-events":3,"./component-registry":5}],5:[function(t,e,n){"use strict";e.exports={}},{}],6:[function(t,e,n){"use strict";function r(){return this.$manipulatorTarget.get("disabled")?this:(this.$element.set("+disabled"),this.$manipulatorTarget.set("disabled",!0),this.trigger("disabled"))}function i(){return this.$manipulatorTarget.get("disabled")?(this.$element.set("-disabled"),this.$manipulatorTarget.set("disabled",!1),this.trigger("enabled")):this}function o(){return this.$element[0].classList.contains("hide")?this:(this.$element.set("+hide"),this.trigger("hide"))}function a(){return this.$element[0].classList.contains("hide")?(this.$element.set("-hide"),this.trigger("show")):this}var u=t("../vendor/minified")._;e.exports={html:{get:function(){return this.$manipulatorTarget.get("innerHTML")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("innerHTML",t),this.trigger("change"))},hide:o,show:a},button:{get:function(){return this.$manipulatorTarget.get("innerHTML")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("innerHTML",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},val:{get:function(){return this.$manipulatorTarget.get("value")},set:function(t){return this.get()===t.toString(10)?this:(this.$manipulatorTarget.set("value",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},slider:{get:function(){return parseFloat(this.$manipulatorTarget.get("value"))},set:function(t){var e=this.get();return this.$manipulatorTarget.set("value",t),this.get()===e?this:this.trigger("change")},disable:r,enable:i,hide:o,show:a},checked:{get:function(){return this.$manipulatorTarget.get("checked")},set:function(t){return!this.get()==!t?this:(this.$manipulatorTarget.set("checked",!!t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},radiogroup:{get:function(){return this.$element.select("input:checked").get("value")},set:function(t){return this.get()===t.toString(10)?this:(this.$element.select(\'input[value="\'+t.replace(\'"\',\'\\\\"\')+\'"]\').set("checked",!0),this.trigger("change"))},disable:r,enable:i,hide:o,show:a},checkboxgroup:{get:function(){var t=[];return this.$element.select("input").each(function(e){t.push(!!e.checked)}),t},set:function(t){var e=this;for(t=Array.isArray(t)?t:[];t.length<this.get().length;)t.push(!1);return u.equals(this.get(),t)?this:(e.$element.select("input").set("checked",!1).each(function(e,n){e.checked=!!t[n]}),e.trigger("change"))},disable:r,enable:i,hide:o,show:a},color:{get:function(){return parseInt(this.$manipulatorTarget.get("value"),10)||0},set:function(t){return t=this.roundColorToLayout(t||0),this.get()===t?this:(this.$manipulatorTarget.set("value",t),this.trigger("change"))},disable:r,enable:i,hide:o,show:a}}},{"../vendor/minified":8}],7:[function(t,e,n){"use strict";e.exports.updateProperties=function(t,e){Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(t,n,e)})},e.exports.capabilityMap={PLATFORM_APLITE:{platforms:["aplite"],minFwMajor:0,minFwMinor:0},PLATFORM_BASALT:{platforms:["basalt"],minFwMajor:0,minFwMinor:0},PLATFORM_CHALK:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},PLATFORM_DIORITE:{platforms:["diorite"],minFwMajor:0,minFwMinor:0},PLATFORM_EMERY:{platforms:["emery"],minFwMajor:0,minFwMinor:0},BW:{platforms:["aplite","diorite"],minFwMajor:0,minFwMinor:0},COLOR:{platforms:["basalt","chalk","emery"],minFwMajor:0,minFwMinor:0},MICROPHONE:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:0,minFwMinor:0},SMARTSTRAP:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:3,minFwMinor:4},SMARTSTRAP_POWER:{platforms:["basalt","chalk","emery"],minFwMajor:3,minFwMinor:4},HEALTH:{platforms:["basalt","chalk","diorite","emery"],minFwMajor:3,minFwMinor:10},RECT:{platforms:["aplite","basalt","diorite","emery"],minFwMajor:0,minFwMinor:0},ROUND:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},DISPLAY_144x168:{platforms:["aplite","basalt","diorite"],minFwMajor:0,minFwMinor:0},DISPLAY_180x180_ROUND:{platforms:["chalk"],minFwMajor:0,minFwMinor:0},DISPLAY_200x228:{platforms:["emery"],minFwMajor:0,minFwMinor:0}},e.exports.includesCapability=function(t,n){var r=/^NOT_/,i=[];if(!n||!n.length)return!0;for(var o=n.length-1;o>=0;o--){var a=n[o],u=e.exports.capabilityMap[a.replace(r,"")];!u||u.platforms.indexOf(t.platform)===-1||u.minFwMajor>t.firmware.major||u.minFwMajor===t.firmware.major&&u.minFwMinor>t.firmware.minor?i.push(!!a.match(r)):i.push(!a.match(r))}return i.indexOf(!1)===-1}},{}],8:[function(t,e,n){e.exports=function(){function t(t){return t.substr(0,3)}function e(t){return t!=lt?""+t:""}function n(t,e){return typeof t==e}function r(t){return n(t,"string")}function i(t){return!!t&&n(t,"object")}function o(t){return t&&t.nodeType}function a(t){return n(t,"number")}function u(t){return i(t)&&!!t.getDay}function s(t){return t===!0||t===!1}function c(t){var e=typeof t;return"object"==e?!(!t||!t.getDay):"string"==e||"number"==e||s(t)}function f(t){return t}function l(t,n,r){return e(t).replace(n,r!=lt?r:"")}function h(t){return l(t,/^\\s+|\\s+$/g)}function m(t,e,n){for(var r in t)t.hasOwnProperty(r)&&e.call(n||t,r,t[r]);return t}function p(t,e,n){if(t)for(var r=0;r<t.length;r++)e.call(n||t,t[r],r);return t}function d(t,e,n){var r=[],i=B(e)?e:function(t){return e!=t};return p(t,function(e,o){i.call(n||t,e,o)&&r.push(e)}),r}function g(t,e,n,r){var i=[];return t(e,function(t,o){P(t=n.call(r||e,t,o))?p(t,function(t){i.push(t)}):t!=lt&&i.push(t)}),i}function v(t){var e=0;return m(t,function(t){e++}),e}function y(t){var e=[];return m(t,function(t){e.push(t)}),e}function b(t,e,n){var r=[];return p(t,function(i,o){r.push(e.call(n||t,i,o))}),r}function w(t,e){var n={};return p(t,function(t,r){n[t]=e}),n}function $(t,e){var n=e||{};for(var r in t)n[r]=t[r];return n}function T(t,e){for(var n=e,r=0;r<t.length;r++)n=$(t[r],n);return n}function M(t){return B(t)?t:function(e,n){if(t===e)return n}}function E(t,e,n){return e==lt?n:e<0?Math.max(t.length+e,0):Math.min(t.length,e)}function F(t,e,n,r){for(var i,o=M(e),a=E(t,r,t.length),u=E(t,n,0);u<a;u++)if((i=o.call(t,t[u],u))!=lt)return i}function x(t,e,n){var r=[];if(t)for(var i=E(t,n,t.length),o=E(t,e,0);o<i;o++)r.push(t[o]);return r}function O(t){return b(t,f)}function j(t,e){var n,r=B(t)?t():t,i=B(e)?e():e;return r==i||r!=lt&&i!=lt&&(c(r)||c(i)?u(r)&&u(i)&&+r==+i:P(r)?r.length==i.length&&!F(r,function(t,e){if(!j(t,i[e]))return!0}):!P(i)&&(n=y(r)).length==v(i)&&!F(n,function(t){if(!j(r[t],i[t]))return!0}))}function A(t,e,n){if(B(t))return t.apply(n&&e,b(n||e,f))}function R(t,e,n){return b(t,function(t){return A(t,e,n)})}function L(t){return"\\\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)}function S(t){return l(t,/[\\x00-\\x1f\'"\\u2028\\u2029]/g,L)}function _(t,e){return t.split(e)}function C(t,e){if(dt[t])return dt[t];var n="with(_.isObject(obj)?obj:{}){"+b(_(t,/{{|}}}?/g),function(t,e){var n,r=h(t),i=l(r,/^{/),o=r==i?"esc(":"";return e%2?(n=/^each\\b(\\s+([\\w_]+(\\s*,\\s*[\\w_]+)?)\\s*:)?(.*)/.exec(i))?"each("+(h(n[4])?n[4]:"this")+", function("+n[2]+"){":(n=/^if\\b(.*)/.exec(i))?"if("+n[1]+"){":(n=/^else\\b\\s*(if\\b(.*))?/.exec(i))?"}else "+(n[1]?"if("+n[2]+")":"")+"{":(n=/^\\/(if)?/.exec(i))?n[1]?"}\\n":"});\\n":(n=/^(var\\s.*)/.exec(i))?n[1]+";":(n=/^#(.*)/.exec(i))?n[1]:(n=/(.*)::\\s*(.*)/.exec(i))?"print("+o+\'_.formatValue("\'+S(n[2])+\'",\'+(h(n[1])?n[1]:"this")+(o&&")")+"));\\n":"print("+o+(h(i)?i:"this")+(o&&")")+");\\n":t?\'print("\'+S(t)+\'");\\n\':void 0}).join("")+"}",r=new Function("obj","each","esc","print","_",n),i=function(t,n){var i=[];return r.call(n||t,t,function(t,e){P(t)?p(t,function(t,n){e.call(t,t,n)}):m(t,function(t,n){e.call(n,t,n)})},e||f,function(){A(i.push,i,arguments)},rt),i.join("")};return gt.push(i)>pt&&delete dt[gt.shift()],dt[t]=i}function I(t){return l(t,/[<>\'"&]/g,function(t){return"&#"+t.charCodeAt(0)+";"})}function N(t,e){return C(t,I)(e)}function D(t){return function(e,n,r){return t(this,e,n,r)}}function B(t){return"function"==typeof t&&!t.item}function P(t){return t&&t.length!=lt&&!r(t)&&!o(t)&&!B(t)&&t!==ot}function H(t){return parseFloat(l(t,/^[^\\d-]+/))}function k(t){return t[at]=t[at]||++ct}function q(t,e){var n,r=[],i={};return Q(t,function(t){Q(e(t),function(t){i[n=k(t)]||(r.push(t),i[n]=!0)})}),r}function U(t,e){var n={$position:"absolute",$visibility:"hidden",$display:"block",$height:lt},r=t.get(n),i=t.set(n).get("clientHeight");return t.set(r),i*e+"px"}function Y(t,n,i,o,a){return B(n)?this.on(lt,t,n,i,o):r(o)?this.on(t,n,i,lt,o):this.each(function(r,u){Q(t?G(t,r):r,function(t){Q(e(n).split(/\\s/),function(e){function n(e,n,r){var f=!a,l=a?r:t;if(a)for(var h=Z(a,t);l&&l!=t&&!(f=h(l));)l=l.parentNode;return!f||s!=e||i.apply(X(l),o||[n,u])&&"?"==c||"|"==c}function r(t){n(s,t,t.target)||(t.preventDefault(),t.stopPropagation())}var s=l(e,/[?|]/g),c=l(e,/[^?|]/g),h=("blur"==s||"focus"==s)&&!!a,m=ct++;t.addEventListener(s,r,h),t.M||(t.M={}),t.M[m]=n,i.M=g(Q,[i.M,function(){t.removeEventListener(s,r,h),delete t.M[m]}],f)})})})}function K(t){R(t.M),t.M=lt}function V(t){ft?ft.push(t):setTimeout(t,0)}function z(t,e,n){return G(t,e,n)[0]}function W(t,e,n){var r=X(document.createElement(t));return P(e)||e!=lt&&!i(e)?r.add(e):r.set(e).add(n)}function J(t){return g(Q,t,function(t){var e;return P(t)?J(t):o(t)?(e=t.cloneNode(!0),e.removeAttribute&&e.removeAttribute("id"),e):t})}function X(t,e,n){return B(t)?V(t):new nt(G(t,e,n))}function G(t,e,n){function i(t){return P(t)?g(Q,t,i):t}function a(t){return d(g(Q,t,i),function(t){for(var r=t;r=r.parentNode;)if(r==e[0]||n)return r==e[0]})}return e?1!=(e=G(e)).length?q(e,function(e){return G(t,e,n)}):r(t)?1!=o(e[0])?[]:n?a(e[0].querySelectorAll(t)):e[0].querySelectorAll(t):a(t):r(t)?document.querySelectorAll(t):g(Q,t,i)}function Z(t,e){function n(t,e){var n=RegExp("(^|\\\\s+)"+t+"(?=$|\\\\s)","i");return function(r){return!t||n.test(r[e])}}var i={},u=i;if(B(t))return t;if(a(t))return function(e,n){return n==t};if(!t||"*"==t||r(t)&&(u=/^([\\w-]*)\\.?([\\w-]*)$/.exec(t))){var s=n(u[1],"tagName"),c=n(u[2],"className");return function(t){return 1==o(t)&&s(t)&&c(t)}}return e?function(n){return X(t,e).find(n)!=lt}:(X(t).each(function(t){i[k(t)]=!0}),function(t){return i[k(t)]})}function Q(t,e){return P(t)?p(t,e):t!=lt&&e(t,0),t}function tt(){this.state=null,this.values=[],this.parent=null}function et(){var t=[],e=arguments,n=e.length,r=0,o=0,a=new tt;a.errHandled=function(){o++,a.parent&&a.parent.errHandled()};var u=a.fire=function(e,n){return null==a.state&&null!=e&&(a.state=!!e,a.values=P(n)?n:[n],setTimeout(function(){p(t,function(t){t()})},0)),a};p(e,function c(t,e){try{t.then?t.then(function(t){var o;(i(t)||B(t))&&B(o=t.then)?c(t,e):(a.values[e]=O(arguments),++r==n&&u(!0,n<2?a.values[e]:a.values))},function(t){a.values[e]=O(arguments),u(!1,n<2?a.values[e]:[a.values[e][0],a.values,e])}):t(function(){u(!0,O(arguments))},function(){u(!1,O(arguments))})}catch(o){u(!1,[o,a.values,e])}}),a.stop=function(){return p(e,function(t){t.stop&&t.stop()}),a.stop0&&A(a.stop0)};var s=a.then=function(e,n){var r=et(),u=function(){try{var t=a.state?e:n;B(t)?!function s(t){try{var e,n=0;if((i(t)||B(t))&&B(e=t.then)){if(t===r)throw new TypeError;e.call(t,function(t){n++||s(t)},function(t){n++||r.fire(!1,[t])}),r.stop0=t.stop}else r.fire(!0,[t])}catch(a){if(!n++&&(r.fire(!1,[a]),!o))throw a}}(A(t,it,a.values)):r.fire(a.state,a.values)}catch(u){if(r.fire(!1,[u]),!o)throw u}};return B(n)&&a.errHandled(),r.stop0=a.stop,r.parent=a,null!=a.state?setTimeout(u,0):t.push(u),r};return a.always=function(t){return s(t,t)},a.error=function(t){return s(0,t)},a}function nt(t,e){var n=this,r=0;if(t)for(var i=0,o=t.length;i<o;i++){var a=t[i];if(e&&P(a))for(var u=0,s=a.length;u<s;u++)n[r++]=a[u];else n[r++]=a}else n[r++]=e;n.length=r,n._=!0}function rt(){return new nt(arguments,(!0))}var it,ot=window,at="Nia",ut={},st={},ct=1,ft=/^[ic]/.test(document.readyState)?lt:[],lt=null,ht=_("January,February,March,April,May,June,July,August,September,October,November,December",/,/g),mt=(b(ht,t),_("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",/,/g)),pt=(b(mt,t),_("am,pm",/,/g),_("am,am,am,am,am,am,am,am,am,am,am,am,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm",/,/g),99),dt={},gt=[];return $({each:D(p),equals:D(j),find:D(F),dummySort:0,select:function(t,e){return X(t,this,e)},get:function(t,e){var n=this,i=n[0];if(i){if(r(t)){var o,a=/^(\\W*)(.*)/.exec(l(t,/^%/,"@data-")),u=a[1];return o=st[u]?st[u](this,a[2]):"$"==t?n.get("className"):"$$"==t?n.get("@style"):"$$slide"==t?n.get("$height"):"$$fade"==t||"$$show"==t?"hidden"==n.get("$visibility")||"none"==n.get("$display")?0:"$$fade"==t?isNaN(n.get("$opacity",!0))?1:n.get("$opacity",!0):1:"$"==u?ot.getComputedStyle(i,lt).getPropertyValue(l(a[2],/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):"@"==u?i.getAttribute(a[2]):i[a[2]],e?H(o):o}var s={};return(P(t)?Q:m)(t,function(t){s[t]=n.get(t,e)}),s}},set:function(t,e){var n=this;if(e!==it){var i=/^(\\W*)(.*)/.exec(l(l(t,/^\\$float$/,"cssFloat"),/^%/,"@data-")),o=i[1];ut[o]?ut[o](this,i[2],e):"$$fade"==t?this.set({$visibility:e?"visible":"hidden",$opacity:e}):"$$slide"==t?n.set({$visibility:e?"visible":"hidden",$overflow:"hidden",$height:/px/.test(e)?e:function(t,n,r){return U(X(r),e)}}):"$$show"==t?e?n.set({$visibility:e?"visible":"hidden",$display:""}).set({$display:function(t){return"none"==t?"block":t}}):n.set({$display:"none"}):"$$"==t?n.set("@style",e):Q(this,function(n,r){var a=B(e)?e(X(n).get(t),r,n):e;"$"==o?i[2]?n.style[i[2]]=a:Q(a&&a.split(/\\s+/),function(t){var e=l(t,/^[+-]/);/^\\+/.test(t)?n.classList.add(e):/^-/.test(t)?n.classList.remove(e):n.classList.toggle(e)}):"$$scrollX"==t?n.scroll(a,X(n).get("$$scrollY")):"$$scrollY"==t?n.scroll(X(n).get("$$scrollX"),a):"@"==o?a==lt?n.removeAttribute(i[2]):n.setAttribute(i[2],a):n[i[2]]=a})}else r(t)||B(t)?n.set("$",t):m(t,function(t,e){n.set(t,e)});return n},add:function(t,e){return this.each(function(n,r){function i(t){if(P(t))Q(t,i);else if(B(t))i(t(n,r));else if(t!=lt){var u=o(t)?t:document.createTextNode(t);a?a.parentNode.insertBefore(u,a.nextSibling):e?e(u,n,n.parentNode):n.appendChild(u),a=u}}var a;i(r&&!B(t)?J(t):t)})},on:Y,trigger:function(t,e){return this.each(function(n,r){for(var i=!0,o=n;o&&i;)m(o.M,function(r,o){i=i&&o(t,e,n)}),o=o.parentNode})},ht:function(t,e){var n=arguments.length>2?T(x(arguments,1)):e;return this.set("innerHTML",B(t)?t(n):/{{/.test(t)?N(t,n):/^#\\S+$/.test(t)?N(z(t).text,n):t)}},nt.prototype),$({request:function(t,n,r,i){var o,a=i||{},u=0,s=et(),c=r&&r.constructor==a.constructor;try{s.xhr=o=new XMLHttpRequest,s.stop0=function(){o.abort()},c&&(r=g(m,r,function(t,e){return g(Q,e,function(e){return encodeURIComponent(t)+(e!=lt?"="+encodeURIComponent(e):"")})}).join("&")),r==lt||/post/i.test(t)||(n+="?"+r,r=lt),o.open(t,n,!0,a.user,a.pass),c&&/post/i.test(t)&&o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),m(a.headers,function(t,e){o.setRequestHeader(t,e)}),m(a.xhr,function(t,e){o[t]=e}),o.onreadystatechange=function(){4!=o.readyState||u++||(o.status>=200&&o.status<300?s.fire(!0,[o.responseText,o]):s.fire(!1,[o.status,o.responseText,o]))},o.send(r)}catch(f){u||s.fire(!1,[0,lt,e(f)])}return s},ready:V,off:K,wait:function(t,e){var n=et(),r=setTimeout(function(){n.fire(!0,e)},t);return n.stop0=function(){n.fire(!1),clearTimeout(r)},n}},X),$({each:p,toObject:w,find:F,equals:j,copyObj:$,extend:function(t){return T(x(arguments,1),t)},eachObj:m,isObject:i,format:function(t,e,n){return C(t,n)(e)},template:C,formatHtml:N,promise:et},rt),document.addEventListener("DOMContentLoaded",function(){R(ft),ft=lt},!1),{HTML:function(){var t=W("div");return rt(A(t.ht,t,arguments)[0].childNodes)},_:rt,$:X,$$:z,M:nt,getter:st,setter:ut}}()},{}]},{},[1])</script></body></html>';
+},{}],"pebble-clay":[function(t,e,n){"use strict";function r(t,e,n){function r(){i.meta={activeWatchInfo:Pebble.getActiveWatchInfo&&Pebble.getActiveWatchInfo(),accountToken:Pebble.getAccountToken(),watchToken:Pebble.getWatchToken(),userData:s(n.userData||{})}}function o(t,e,n){Array.isArray(t)?t.forEach(function(t){o(t,e,n)}):"section"===t.type?o(t.items,e,n):e(t)&&n(t)}var i=this;if(!Array.isArray(t))throw new Error("config must be an Array");if(e&&"function"!=typeof e)throw new Error('customFn must be a function or "null"');n=n||{},i.config=s(t),i.customFn=e||function(){},i.components={},i.meta={activeWatchInfo:null,accountToken:"",watchToken:"",userData:{}},i.version=c,n.autoHandleEvents!==!1&&"undefined"!=typeof Pebble?(Pebble.addEventListener("showConfiguration",function(){r(),Pebble.openURL(i.generateUrl())}),Pebble.addEventListener("webviewclosed",function(t){t&&t.response&&Pebble.sendAppMessage(i.getSettings(t.response),function(){console.log("Sent config data to Pebble")},function(t){console.log("Failed to send config data!"),console.log(JSON.stringify(t))})})):"undefined"!=typeof Pebble&&Pebble.addEventListener("ready",function(){r()}),o(i.config,function(t){return a[t.type]},function(t){i.registerComponent(a[t.type])}),o(i.config,function(t){return t.appKey},function(){throw new Error("appKeys are no longer supported. Please follow the migration guide to upgrade your project")})}var o=t("./tmp/config-page.html"),i=t("tosource"),a=t("./src/scripts/components"),s=t("deepcopy/build/deepcopy.min"),c=t("./package.json").version,l=t("message_keys");r.prototype.registerComponent=function(t){this.components[t.name]=t},r.prototype.generateUrl=function(){var t={},e=!Pebble||"pypkjs"===Pebble.platform,n=e?"$$$RETURN_TO$$$":"pebblejs://close#";try{t=JSON.parse(localStorage.getItem("clay-settings"))||{}}catch(a){console.error(a.toString())}var s=o.replace("$$RETURN_TO$$",n).replace("$$CUSTOM_FN$$",i(this.customFn)).replace("$$CONFIG$$",i(this.config)).replace("$$SETTINGS$$",i(t)).replace("$$COMPONENTS$$",i(this.components)).replace("$$META$$",i(this.meta));return e?r.encodeDataUri(s,"http://clay.pebble.com.s3-website-us-west-2.amazonaws.com/#"):r.encodeDataUri(s)},r.prototype.getSettings=function(t,e){var n={};t=t.match(/^\{/)?t:decodeURIComponent(t);try{n=JSON.parse(t)}catch(o){throw new Error("The provided response was not valid JSON")}var i={};return Object.keys(n).forEach(function(t){"object"==typeof n[t]&&n[t]?i[t]=n[t].value:i[t]=n[t]}),localStorage.setItem("clay-settings",JSON.stringify(i)),e===!1?n:r.prepareSettingsForAppMessage(n)},r.prototype.setSettings=function(t,e){var n={};try{n=JSON.parse(localStorage.getItem("clay-settings"))||{}}catch(r){console.error(r.toString())}if("object"==typeof t){var o=t;Object.keys(o).forEach(function(t){n[t]=o[t]})}else n[t]=e;localStorage.setItem("clay-settings",JSON.stringify(n))},r.encodeDataUri=function(t,e){return e="undefined"!=typeof e?e:"data:text/html;charset=utf-8,",e+encodeURIComponent(t)},r.prepareForAppMessage=function(t){function e(t,e){return Math.floor(t*Math.pow(10,e||0))}var n;return Array.isArray(t)?(n=[],t.forEach(function(t,e){n[e]=r.prepareForAppMessage(t)})):n="object"==typeof t&&t?"number"==typeof t.value?e(t.value,t.precision):Array.isArray(t.value)?t.value.map(function(n){return"number"==typeof n?e(n,t.precision):n}):r.prepareForAppMessage(t.value):"boolean"==typeof t?t?1:0:t,n},r.prepareSettingsForAppMessage=function(t){var e={};Object.keys(t).forEach(function(n){var r=t[n],o=n.match(/(.+?)(?:\[(\d*)\])?$/);if(!o[2])return void(e[n]=r);var i=parseInt(o[2],10);n=o[1],"undefined"==typeof e[n]&&(e[n]=[]),e[n][i]=r});var n={};return Object.keys(e).forEach(function(t){var o=l[t],i=r.prepareForAppMessage(e[t]);i=Array.isArray(i)?i:[i],i.forEach(function(t,e){n[o+e]=t})}),Object.keys(n).forEach(function(t){if(Array.isArray(n[t]))throw new Error('Clay does not support 2 dimensional arrays for item values. Make sure you are not attempting to use array syntax (eg: "myMessageKey[2]") in the messageKey for components that return an array, such as a checkboxgroup')}),n},e.exports=r},{"./package.json":7,"./src/scripts/components":13,"./tmp/config-page.html":42,"deepcopy/build/deepcopy.min":3,message_keys:void 0,tosource:6}]},{},["pebble-clay"])("pebble-clay")});
\ No newline at end of file
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'button',
+ template: require('../../templates/components/button.tpl'),
+ style: require('../../styles/clay/components/button.scss'),
+ manipulator: 'button',
+ defaults: {
+ primary: false,
+ attributes: {},
+ description: ''
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'checkboxgroup',
+ template: require('../../templates/components/checkboxgroup.tpl'),
+ style: require('../../styles/clay/components/checkboxgroup.scss'),
+ manipulator: 'checkboxgroup',
+ defaults: {
+ label: '',
+ options: [],
+ description: ''
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'color',
+ template: require('../../templates/components/color.tpl'),
+ style: require('../../styles/clay/components/color.scss'),
+ manipulator: 'color',
+ defaults: {
+ label: '',
+ description: ''
+ },
+ initialize: function(minified, clay) {
+ var HTML = minified.HTML;
+ var self = this;
+
+ /**
+ * @param {string|boolean|number} color
+ * @returns {string}
+ */
+ function cssColor(color) {
+ if (typeof color === 'number') {
+ color = color.toString(16);
+ } else if (!color) {
+ return 'transparent';
+ }
+
+ color = padColorString(color);
+
+ return '#' + (useSunlight ? sunlightColorMap[color] : color);
+ }
+
+ /**
+ * @param {string} color
+ * @return {string}
+ */
+ function padColorString(color) {
+ color = color.toLowerCase();
+
+ while (color.length < 6) {
+ color = '0' + color;
+ }
+
+ return color;
+ }
+
+ /**
+ * @param {number|string} value
+ * @returns {string|*}
+ */
+ function normalizeColor(value) {
+ switch (typeof value) {
+ case 'number': return padColorString(value.toString(16));
+ case 'string': return value.replace(/^#|^0x/, '');
+ default: return value;
+ }
+ }
+
+ /**
+ * @param {Array.<Array>} layout
+ * @returns {Array}
+ */
+ function flattenLayout(layout) {
+ return layout.reduce(function(a, b) {
+ return a.concat(b);
+ }, []);
+ }
+
+ /**
+ * Convert HEX color to LAB.
+ * Adapted from: https://github.com/antimatter15/rgb-lab
+ * @param {string} hex
+ * @returns {Array} - [l, a, b]
+ */
+ function hex2lab(hex) {
+ hex = hex.replace(/^#|^0x/, '');
+
+ var r = parseInt(hex.slice(0, 2), 16) / 255;
+ var g = parseInt(hex.slice(2, 4), 16) / 255;
+ var b = parseInt(hex.slice(4), 16) / 255;
+
+ r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
+ g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
+ b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
+
+ var x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
+ var y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;
+ var z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
+
+ x = (x > 0.008856) ? Math.pow(x, 1 / 3) : (7.787 * x) + 16 / 116;
+ y = (y > 0.008856) ? Math.pow(y, 1 / 3) : (7.787 * y) + 16 / 116;
+ z = (z > 0.008856) ? Math.pow(z, 1 / 3) : (7.787 * z) + 16 / 116;
+
+ return [(116 * y) - 16, 500 * (x - y), 200 * (y - z)];
+ }
+
+ /**
+ * Find the perceptual color distance between two LAB colors
+ * @param {Array} labA
+ * @param {Array} labB
+ * @returns {number}
+ */
+ function deltaE(labA, labB) {
+ var deltaL = labA[0] - labB[0];
+ var deltaA = labA[1] - labB[1];
+ var deltaB = labA[2] - labB[2];
+
+ return Math.sqrt(Math.pow(deltaL, 2) +
+ Math.pow(deltaA, 2) +
+ Math.pow(deltaB, 2));
+ }
+
+ /**
+ * Returns the layout based on the connected watch
+ * @returns {Array}
+ */
+ function autoLayout() {
+ if (!clay.meta.activeWatchInfo ||
+ clay.meta.activeWatchInfo.firmware.major === 2 ||
+ ['aplite', 'diorite'].indexOf(clay.meta.activeWatchInfo.platform) > -1 &&
+ !self.config.allowGray) {
+ return standardLayouts.BLACK_WHITE;
+ }
+
+ if (['aplite', 'diorite'].indexOf(clay.meta.activeWatchInfo.platform) > -1 &&
+ self.config.allowGray) {
+ return standardLayouts.GRAY;
+ }
+
+ return standardLayouts.COLOR;
+ }
+
+ /**
+ * @param {number|string} color
+ * @return {number}
+ */
+ self.roundColorToLayout = function(color) {
+ var itemValue = normalizeColor(color);
+
+ // if the color is not in the layout we will need find the closest match
+ if (colorList.indexOf(itemValue) === -1) {
+ var itemValueLAB = hex2lab(itemValue);
+ var differenceArr = colorList.map(function(color) {
+ var colorLAB = hex2lab(normalizeColor(color));
+ return deltaE(itemValueLAB, colorLAB);
+ });
+
+ // Get the lowest number from the differenceArray
+ var lowest = Math.min.apply(Math, differenceArr);
+
+ // Get the index for that lowest number
+ var index = differenceArr.indexOf(lowest);
+ itemValue = colorList[index];
+ }
+
+ return parseInt(itemValue, 16);
+ };
+
+ var useSunlight = self.config.sunlight !== false;
+ var sunlightColorMap = {
+ '000000': '000000', '000055': '001e41', '0000aa': '004387', '0000ff': '0068ca',
+ '005500': '2b4a2c', '005555': '27514f', '0055aa': '16638d', '0055ff': '007dce',
+ '00aa00': '5e9860', '00aa55': '5c9b72', '00aaaa': '57a5a2', '00aaff': '4cb4db',
+ '00ff00': '8ee391', '00ff55': '8ee69e', '00ffaa': '8aebc0', '00ffff': '84f5f1',
+ '550000': '4a161b', '550055': '482748', '5500aa': '40488a', '5500ff': '2f6bcc',
+ '555500': '564e36', '555555': '545454', '5555aa': '4f6790', '5555ff': '4180d0',
+ '55aa00': '759a64', '55aa55': '759d76', '55aaaa': '71a6a4', '55aaff': '69b5dd',
+ '55ff00': '9ee594', '55ff55': '9de7a0', '55ffaa': '9becc2', '55ffff': '95f6f2',
+ 'aa0000': '99353f', 'aa0055': '983e5a', 'aa00aa': '955694', 'aa00ff': '8f74d2',
+ 'aa5500': '9d5b4d', 'aa5555': '9d6064', 'aa55aa': '9a7099', 'aa55ff': '9587d5',
+ 'aaaa00': 'afa072', 'aaaa55': 'aea382', 'aaaaaa': 'ababab', 'ffffff': 'ffffff',
+ 'aaaaff': 'a7bae2', 'aaff00': 'c9e89d', 'aaff55': 'c9eaa7', 'aaffaa': 'c7f0c8',
+ 'aaffff': 'c3f9f7', 'ff0000': 'e35462', 'ff0055': 'e25874', 'ff00aa': 'e16aa3',
+ 'ff00ff': 'de83dc', 'ff5500': 'e66e6b', 'ff5555': 'e6727c', 'ff55aa': 'e37fa7',
+ 'ff55ff': 'e194df', 'ffaa00': 'f1aa86', 'ffaa55': 'f1ad93', 'ffaaaa': 'efb5b8',
+ 'ffaaff': 'ecc3eb', 'ffff00': 'ffeeab', 'ffff55': 'fff1b5', 'ffffaa': 'fff6d3'
+ };
+
+ /* eslint-disable comma-spacing, no-multi-spaces, max-len,
+ standard/array-bracket-even-spacing */
+ var standardLayouts = {
+ COLOR: [
+ [false , false , '55ff00', 'aaff55', false , 'ffff55', 'ffffaa', false , false ],
+ [false , 'aaffaa', '55ff55', '00ff00', 'aaff00', 'ffff00', 'ffaa55', 'ffaaaa', false ],
+ ['55ffaa', '00ff55', '00aa00', '55aa00', 'aaaa55', 'aaaa00', 'ffaa00', 'ff5500', 'ff5555'],
+ ['aaffff', '00ffaa', '00aa55', '55aa55', '005500', '555500', 'aa5500', 'ff0000', 'ff0055'],
+ [false , '55aaaa', '00aaaa', '005555', 'ffffff', '000000', 'aa5555', 'aa0000', false ],
+ ['55ffff', '00ffff', '00aaff', '0055aa', 'aaaaaa', '555555', '550000', 'aa0055', 'ff55aa'],
+ ['55aaff', '0055ff', '0000ff', '0000aa', '000055', '550055', 'aa00aa', 'ff00aa', 'ffaaff'],
+ [false , '5555aa', '5555ff', '5500ff', '5500aa', 'aa00ff', 'ff00ff', 'ff55ff', false ],
+ [false , false , false , 'aaaaff', 'aa55ff', 'aa55aa', false , false , false ]
+ ],
+ GRAY: [
+ ['000000', 'aaaaaa', 'ffffff']
+ ],
+ BLACK_WHITE: [
+ ['000000', 'ffffff']
+ ]
+ };
+ /* eslint-enable */
+
+ var layout = self.config.layout || autoLayout();
+
+ if (typeof layout === 'string') {
+ layout = standardLayouts[layout];
+ }
+
+ // make sure layout is a 2D array
+ if (!Array.isArray(layout[0])) {
+ layout = [layout];
+ }
+
+ var colorList = flattenLayout(layout).map(function(item) {
+ return normalizeColor(item);
+ }).filter(function(item) {
+ return item;
+ });
+
+ var grid = '';
+ var rows = layout.length;
+ var cols = 0;
+ layout.forEach(function(row) {
+ cols = row.length > cols ? row.length : cols;
+ });
+ var itemWidth = 100 / cols;
+ var itemHeight = 100 / rows;
+ var $elem = self.$element;
+
+ for (var i = 0; i < rows; i++) {
+ for (var j = 0; j < cols; j++) {
+
+ var color = normalizeColor(layout[i][j]);
+ var selectable = (color ? ' selectable' : '');
+
+ var roundedTL = (i === 0 && j === 0) || i === 0 && !layout[i][j - 1] ||
+ !layout[i][j - 1] && !layout[i - 1][j] ?
+ ' rounded-tl' :
+ '';
+
+ var roundedTR = i === 0 && !layout[i][j + 1] ||
+ !layout[i][j + 1] && !layout[i - 1][j] ?
+ ' rounded-tr ' :
+ '';
+
+ var roundedBL = (i === layout.length - 1 && j === 0) ||
+ i === layout.length - 1 && !layout[i][j - 1] ||
+ !layout[i][j - 1] && !layout[i + 1][j] ?
+ ' rounded-bl' :
+ '';
+
+ var roundedBR = i === layout.length - 1 && !layout[i][j + 1] ||
+ !layout[i][j + 1] && !layout[i + 1][j] ?
+ ' rounded-br' :
+ '';
+
+ grid += '<i ' +
+ 'class="color-box ' + selectable + roundedTL + roundedTR + roundedBL +
+ roundedBR + '" ' +
+ (color ? 'data-value="' + parseInt(color, 16) + '" ' : '') +
+ 'style="' +
+ 'width:' + itemWidth + '%; ' +
+ 'height:' + itemHeight + '%; ' +
+ 'background:' + cssColor(color) + ';">' +
+ '</i>';
+ }
+ }
+
+ // on very small layouts the boxes end up huge. The following adds extra padding
+ // to prevent them from being so big.
+ var extraPadding = 0;
+ if (cols === 3) {
+ extraPadding = 5;
+ }
+ if (cols === 2) {
+ extraPadding = 8;
+ }
+ var vPadding = (extraPadding * itemWidth / itemHeight) + '%';
+ var hPadding = extraPadding + '%';
+ $elem.select('.color-box-container')
+ .add(HTML(grid))
+ .set('$paddingTop', vPadding)
+ .set('$paddingRight', hPadding)
+ .set('$paddingBottom', vPadding)
+ .set('$paddingLeft', hPadding);
+
+ $elem.select('.color-box-wrap').set(
+ '$paddingBottom',
+ (itemWidth / itemHeight * 100) + '%'
+ );
+
+ var $valueDisplay = $elem.select('.value');
+ var $picker = $elem.select('.picker-wrap');
+ var disabled = self.$manipulatorTarget.get('disabled');
+
+ $elem.select('label').on('click', function() {
+ if (!disabled) {
+ $picker.set('show'); // toggle visibility
+ }
+ });
+
+ self.on('change', function() {
+ var value = self.get();
+ $valueDisplay.set('$background-color', cssColor(value));
+ $elem.select('.color-box').set('-selected');
+ $elem.select('.color-box[data-value="' + value + '"]').set('+selected');
+ });
+
+ $elem.select('.color-box.selectable').on('click', function(ev) {
+ self.set(parseInt(ev.target.dataset.value, 10));
+ $picker.set('-show');
+ });
+
+ $picker.on('click', function() {
+ $picker.set('-show');
+ });
+
+ self.on('disabled', function() {
+ disabled = true;
+ });
+
+ self.on('enabled', function() {
+ disabled = false;
+ });
+
+ // expose layout for testing
+ self._layout = layout;
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'footer',
+ template: require('../../templates/components/footer.tpl'),
+ manipulator: 'html'
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'heading',
+ template: require('../../templates/components/heading.tpl'),
+ manipulator: 'html',
+ defaults: {
+ size: 4
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ color: require('./color'),
+ footer: require('./footer'),
+ heading: require('./heading'),
+ input: require('./input'),
+ select: require('./select'),
+ submit: require('./submit'),
+ text: require('./text'),
+ toggle: require('./toggle'),
+ radiogroup: require('./radiogroup'),
+ checkboxgroup: require('./checkboxgroup'),
+ button: require('./button'),
+ slider: require('./slider')
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'input',
+ template: require('../../templates/components/input.tpl'),
+ style: require('../../styles/clay/components/input.scss'),
+ manipulator: 'val',
+ defaults: {
+ label: '',
+ description: '',
+ attributes: {}
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'radiogroup',
+ template: require('../../templates/components/radiogroup.tpl'),
+ style: require('../../styles/clay/components/radiogroup.scss'),
+ manipulator: 'radiogroup',
+ defaults: {
+ label: '',
+ options: [],
+ description: '',
+ attributes: {}
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'select',
+ template: require('../../templates/components/select.tpl'),
+ style: require('../../styles/clay/components/select.scss'),
+ manipulator: 'val',
+ defaults: {
+ label: '',
+ options: [],
+ description: '',
+ attributes: {}
+ },
+ initialize: function() {
+ var self = this;
+
+ var $value = self.$element.select('.value');
+
+ /**
+ * Updates the HTML value of the component to match the slected option's label
+ * @return {void}
+ */
+ function setValueDisplay() {
+ var selectedIndex = self.$manipulatorTarget.get('selectedIndex');
+ var $options = self.$manipulatorTarget.select('option');
+ var value = $options[selectedIndex] && $options[selectedIndex].innerHTML;
+ $value.set('innerHTML', value);
+ }
+
+ setValueDisplay();
+ self.on('change', setValueDisplay);
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'slider',
+ template: require('../../templates/components/slider.tpl'),
+ style: require('../../styles/clay/components/slider.scss'),
+ manipulator: 'slider',
+ defaults: {
+ label: '',
+ description: '',
+ min: 0,
+ max: 100,
+ step: 1,
+ attributes: {}
+ },
+ initialize: function() {
+ var self = this;
+
+ var $value = self.$element.select('.value');
+ var $valuePad = self.$element.select('.value-pad');
+ var $slider = self.$manipulatorTarget;
+
+ /**
+ * Sets the value display
+ * @return {void}
+ */
+ function setValueDisplay() {
+ var value = self.get().toFixed(self.precision);
+ $value.set('value', value);
+ $valuePad.set('innerHTML', value);
+ }
+
+ var step = $slider.get('step');
+ step = step.toString(10).split('.')[1];
+ self.precision = step ? step.length : 0;
+
+ self.on('change', setValueDisplay);
+ $slider.on('|input', setValueDisplay);
+ setValueDisplay();
+
+ $value.on('|input', function() {
+ $valuePad.set('innerHTML', this.get('value'));
+ });
+
+ $value.on('|change', function() {
+ self.set(this.get('value'));
+ setValueDisplay();
+ });
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'submit',
+ template: require('../../templates/components/submit.tpl'),
+ style: require('../../styles/clay/components/submit.scss'),
+ manipulator: 'button',
+ defaults: {
+ attributes: {}
+ }
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'text',
+ template: require('../../templates/components/text.tpl'),
+ manipulator: 'html'
+};
--- /dev/null
+'use strict';
+
+module.exports = {
+ name: 'toggle',
+ template: require('../../templates/components/toggle.tpl'),
+ style: require('../../styles/clay/components/toggle.scss'),
+ manipulator: 'checked',
+ defaults: {
+ label: '',
+ description: '',
+ attributes: {}
+ }
+};
--- /dev/null
+'use strict';
+
+var minified = require('./vendor/minified');
+var ClayConfig = require('./lib/clay-config');
+
+var $ = minified.$;
+var _ = minified._;
+
+var config = _.extend([], window.clayConfig || []);
+var settings = _.extend({}, window.claySettings || {});
+var returnTo = window.returnTo || 'pebblejs://close#';
+var customFn = window.customFn || function() {};
+var clayComponents = window.clayComponents || {};
+var clayMeta = window.clayMeta || {};
+
+var platform = window.navigator.userAgent.match(/android/i) ? 'android' : 'ios';
+document.documentElement.classList.add('platform-' + platform);
+
+// Register the passed components
+_.eachObj(clayComponents, function(key, component) {
+ ClayConfig.registerComponent(component);
+});
+
+var $mainForm = $('#main-form');
+var clayConfig = new ClayConfig(settings, config, $mainForm, clayMeta);
+
+// add listeners here
+$mainForm.on('submit', function() {
+ // Set the return URL depending on the runtime environment
+ location.href = returnTo +
+ encodeURIComponent(JSON.stringify(clayConfig.serialize()));
+});
+
+// Run the custom function in the context of the ClayConfig
+customFn.call(clayConfig, minified);
+
+// Now that we have given the dev's custom code to run and attach listeners,
+// we build the config
+clayConfig.build();
--- /dev/null
+'use strict';
+
+/**
+ * A Clay config Item
+ * @typedef {Object} Clay~ConfigItem
+ * @property {string} type
+ * @property {string|boolean|number} defaultValue
+ * @property {string} [messageKey]
+ * @property {string} [id]
+ * @property {string} [label]
+ * @property {Object} [attributes]
+ * @property {Array} [options]
+ * @property {Array} [items]
+ * @property {Array} [capabilities]
+ */
+
+var HTML = require('../vendor/minified').HTML;
+var _ = require('../vendor/minified')._;
+var ClayItem = require('./clay-item');
+var utils = require('../lib/utils');
+var ClayEvents = require('./clay-events');
+var componentStore = require('./component-registry');
+var manipulators = require('./manipulators');
+
+/**
+ * @extends ClayEvents
+ * @param {Object} settings - setting that were set from a previous session
+ * @param {Array|Object} config
+ * @param {M} $rootContainer
+ * @param {Object} meta
+ * @constructor
+ */
+function ClayConfig(settings, config, $rootContainer, meta) {
+ var self = this;
+
+ var _settings = _.copyObj(settings);
+ var _items;
+ var _itemsById;
+ var _itemsByMessageKey;
+ var _isBuilt;
+
+ /**
+ * Initialize the item arrays and objects
+ * @private
+ * @return {void}
+ */
+ function _initializeItems() {
+ _items = [];
+ _itemsById = {};
+ _itemsByMessageKey = {};
+ _isBuilt = false;
+ }
+
+ /**
+ * Add item(s) to the config
+ * @param {Clay~ConfigItem|Array} item
+ * @param {M} $container
+ * @return {void}
+ */
+ function _addItems(item, $container) {
+ if (Array.isArray(item)) {
+ item.forEach(function(item) {
+ _addItems(item, $container);
+ });
+ } else if (utils.includesCapability(meta.activeWatchInfo, item.capabilities)) {
+ if (item.type === 'section') {
+ var $wrapper = HTML('<div class="section">');
+ $container.add($wrapper);
+ _addItems(item.items, $wrapper);
+ } else {
+ var _item = _.copyObj(item);
+ _item.clayId = _items.length;
+
+ var clayItem = new ClayItem(_item).initialize(self);
+
+ if (_item.id) {
+ _itemsById[_item.id] = clayItem;
+ }
+
+ if (_item.messageKey) {
+ _itemsByMessageKey[_item.messageKey] = clayItem;
+ }
+
+ _items.push(clayItem);
+
+ // set the value of the item via the manipulator to ensure consistency
+ var value = typeof _settings[_item.messageKey] !== 'undefined' ?
+ _settings[_item.messageKey] :
+ _item.defaultValue;
+
+ clayItem.set(typeof value !== 'undefined' ? value : '');
+
+ $container.add(clayItem.$element);
+ }
+ }
+ }
+
+ /**
+ * Throws if the config has not been built yet.
+ * @param {string} fnName
+ * @returns {boolean}
+ * @private
+ */
+ function _checkBuilt(fnName) {
+ if (!_isBuilt) {
+ throw new Error(
+ 'ClayConfig not built. build() must be run before ' +
+ 'you can run ' + fnName + '()'
+ );
+ }
+ return true;
+ }
+
+ self.meta = meta;
+ self.$rootContainer = $rootContainer;
+
+ self.EVENTS = {
+ /**
+ * Called before framework has initialized. This is when you would attach your
+ * custom components.
+ * @const
+ */
+ BEFORE_BUILD: 'BEFORE_BUILD',
+
+ /**
+ * Called after the config has been parsed and all components have their initial
+ * value set
+ * @const
+ */
+ AFTER_BUILD: 'AFTER_BUILD',
+
+ /**
+ * Called if .build() is executed after the page has already been built and
+ * before the existing content is destroyed
+ * @const
+ */
+ BEFORE_DESTROY: 'BEFORE_DESTROY',
+
+ /**
+ * Called if .build() is executed after the page has already been built and after
+ * the existing content is destroyed
+ * @const
+ */
+ AFTER_DESTROY: 'AFTER_DESTROY'
+ };
+ utils.updateProperties(self.EVENTS, {writable: false});
+
+ /**
+ * @returns {Array.<ClayItem>}
+ */
+ self.getAllItems = function() {
+ _checkBuilt('getAllItems');
+ return _items;
+ };
+
+ /**
+ * @param {string} messageKey
+ * @returns {ClayItem}
+ */
+ self.getItemByMessageKey = function(messageKey) {
+ _checkBuilt('getItemByMessageKey');
+ return _itemsByMessageKey[messageKey];
+ };
+
+ /**
+ * @param {string} id
+ * @returns {ClayItem}
+ */
+ self.getItemById = function(id) {
+ _checkBuilt('getItemById');
+ return _itemsById[id];
+ };
+
+ /**
+ * @param {string} type
+ * @returns {Array.<ClayItem>}
+ */
+ self.getItemsByType = function(type) {
+ _checkBuilt('getItemsByType');
+ return _items.filter(function(item) {
+ return item.config.type === type;
+ });
+ };
+
+ /**
+ * @param {string} group
+ * @returns {Array.<ClayItem>}
+ */
+ self.getItemsByGroup = function(group) {
+ _checkBuilt('getItemsByGroup');
+ return _items.filter(function(item) {
+ return item.config.group === group;
+ });
+ };
+
+ /**
+ * @returns {Object}
+ */
+ self.serialize = function() {
+ _checkBuilt('serialize');
+
+ _settings = {};
+
+ _.eachObj(_itemsByMessageKey, function(messageKey, item) {
+ _settings[messageKey] = {
+ value: item.get()
+ };
+
+ if (item.precision) {
+ _settings[messageKey].precision = item.precision;
+ }
+ });
+ return _settings;
+ };
+
+ // @todo maybe don't do this and force the static method
+ self.registerComponent = ClayConfig.registerComponent;
+
+ /**
+ * Empties the root container
+ * @returns {ClayConfig}
+ */
+ self.destroy = function() {
+ var el = $rootContainer[0];
+ self.trigger(self.EVENTS.BEFORE_DESTROY);
+ while (el.firstChild) {
+ el.removeChild(el.firstChild);
+ }
+ _initializeItems();
+ self.trigger(self.EVENTS.AFTER_DESTROY);
+ return self;
+ };
+
+ /**
+ * Build the config page. This must be run before any of the get methods can be run
+ * If you call this method after the page has already been built, teh page will be
+ * destroyed and built again.
+ * @returns {ClayConfig}
+ */
+ self.build = function() {
+ if (_isBuilt) {
+ self.destroy();
+ }
+ self.trigger(self.EVENTS.BEFORE_BUILD);
+ _addItems(self.config, $rootContainer);
+ _isBuilt = true;
+ self.trigger(self.EVENTS.AFTER_BUILD);
+ return self;
+ };
+
+ _initializeItems();
+
+ // attach event methods
+ ClayEvents.call(self, $rootContainer);
+
+ // prevent external modifications of properties
+ utils.updateProperties(self, { writable: false, configurable: false });
+
+ // expose the config to allow developers to update it before the build is run
+ self.config = config;
+}
+
+/**
+ * Register a component to Clay. This must be called prior to .build();
+ * @param {Object} component - the clay component to register
+ * @param {string} component.name - the name of the component
+ * @param {string} component.template - HTML template to use for the component
+ * @param {string|Object} component.manipulator - methods to attach to the component
+ * @param {function} component.manipulator.set - set manipulator method
+ * @param {function} component.manipulator.get - get manipulator method
+ * @param {Object} [component.defaults] - template defaults
+ * @param {function} [component.initialize] - method to scaffold the component
+ * @return {boolean} - Returns true if component was registered correctly
+ */
+ClayConfig.registerComponent = function(component) {
+ var _component = _.copyObj(component);
+
+ if (componentStore[_component.name]) {
+ console.warn('Component: ' + _component.name +
+ ' is already registered. If you wish to override the existing' +
+ ' functionality, you must provide a new name');
+ return false;
+ }
+
+ if (typeof _component.manipulator === 'string') {
+ _component.manipulator = manipulators[component.manipulator];
+
+ if (!_component.manipulator) {
+ throw new Error('The manipulator: ' + component.manipulator +
+ ' does not exist in the built-in manipulators.');
+ }
+ }
+
+ if (!_component.manipulator) {
+ throw new Error('The manipulator must be defined');
+ }
+
+ if (typeof _component.manipulator.set !== 'function' ||
+ typeof _component.manipulator.get !== 'function') {
+ throw new Error('The manipulator must have both a `get` and `set` method');
+ }
+
+ if (_component.style) {
+ var style = document.createElement('style');
+ style.type = 'text/css';
+ style.appendChild(document.createTextNode(_component.style));
+ document.head.appendChild(style);
+ }
+
+ componentStore[_component.name] = _component;
+ return true;
+};
+
+module.exports = ClayConfig;
--- /dev/null
+'use strict';
+
+var $ = require('../vendor/minified').$;
+var _ = require('../vendor/minified')._;
+
+/**
+ * Attaches event methods to the context.
+ * Call with ClayEvents.call(yourObject, $eventTarget)
+ * @param {EventEmitter|M} $eventTarget - An object that will be used as the event
+ * target. Must implement EventEmitter
+ * @constructor
+ */
+function ClayEvents($eventTarget) {
+ var self = this;
+ var _eventProxies = [];
+
+ /**
+ * prefixes events with "|"
+ * @param {string} events
+ * @returns {string}
+ * @private
+ */
+ function _transformEventNames(events) {
+ return events.split(' ').map(function(event) {
+ return '|' + event.replace(/^\|/, '');
+ }).join(' ');
+ }
+
+ /**
+ * @param {function} handler
+ * @param {function} proxy
+ * @returns {function}
+ * @private
+ */
+ function _registerEventProxy(handler, proxy) {
+ var eventProxy = _.find(_eventProxies, function(item) {
+ return item.handler === handler ? item : null;
+ });
+
+ if (!eventProxy) {
+ eventProxy = { handler: handler, proxy: proxy };
+ _eventProxies.push(eventProxy);
+ }
+ return eventProxy.proxy;
+ }
+
+ /**
+ * @param {function} handler
+ * @returns {function}
+ * @private
+ */
+ function _getEventProxy(handler) {
+ return _.find(_eventProxies, function(item) {
+ return item.handler === handler ? item.proxy : null;
+ });
+ }
+
+ /**
+ * Attach an event listener to the item.
+ * @param {string} events - a space separated list of events
+ * @param {function} handler
+ * @returns {ClayEvents}
+ */
+ self.on = function(events, handler) {
+ var _events = _transformEventNames(events);
+ var self = this;
+ var _proxy = _registerEventProxy(handler, function() {
+ handler.apply(self, arguments);
+ });
+ $eventTarget.on(_events, _proxy);
+ return self;
+ };
+
+ /**
+ * Remove the given event handler. NOTE: This will remove the handler from all
+ * registered events
+ * @param {function} handler
+ * @returns {ClayEvents}
+ */
+ self.off = function(handler) {
+ var _proxy = _getEventProxy(handler);
+ if (_proxy) {
+ $.off(_proxy);
+ }
+ return self;
+ };
+
+ /**
+ * Trigger an event.
+ * @param {string} name - a single event name to trigger
+ * @param {Object} [eventObj] - an object to pass to the event handler,
+ * provided the handler does not have custom arguments.
+ * @returns {ClayEvents}
+ */
+ self.trigger = function(name, eventObj) {
+ $eventTarget.trigger(name, eventObj);
+ return self;
+ };
+}
+
+module.exports = ClayEvents;
--- /dev/null
+'use strict';
+
+var componentRegistry = require('./component-registry');
+var minified = require('../vendor/minified');
+var utils = require('../lib/utils');
+var ClayEvents = require('./clay-events');
+
+var _ = minified._;
+var HTML = minified.HTML;
+
+/**
+ * @extends ClayEvents
+ * @param {Clay~ConfigItem} config
+ * @constructor
+ */
+function ClayItem(config) {
+ var self = this;
+
+ var _component = componentRegistry[config.type];
+
+ if (!_component) {
+ throw new Error('The component: ' + config.type + ' is not registered. ' +
+ 'Make sure to register it with ClayConfig.registerComponent()');
+ }
+
+ var extra = {
+ i18n: {
+ foo: 'bar'
+ }
+ };
+ var _templateData = _.extend({}, _component.defaults || {}, config, extra);
+ var _html = _.formatHtml(_component.template.trim(), _templateData);
+
+ /** @type {string|null} */
+ self.id = config.id || null;
+
+ /** @type {string|null} */
+ self.messageKey = config.messageKey || null;
+
+ /** @type {Object} */
+ self.config = config;
+ /** @type {M} */
+ self.$element = HTML(_html, _templateData);
+
+ /** @type {M} */
+ self.$manipulatorTarget = self.$element.select('[data-manipulator-target]');
+
+ // this caters for situations where the manipulator target is the root element
+ if (!self.$manipulatorTarget.length) {
+ self.$manipulatorTarget = self.$element;
+ }
+
+ /**
+ * Run the initializer if it exists and attaches the css to the head.
+ * Passes minified as the first param
+ * @param {ClayConfig} clay
+ * @returns {ClayItem}
+ */
+ self.initialize = function(clay) {
+ if (typeof _component.initialize === 'function') {
+ _component.initialize.call(self, minified, clay);
+ }
+ return self;
+ };
+
+ // attach event methods
+ ClayEvents.call(self, self.$manipulatorTarget);
+
+ // attach the manipulator methods to the clayItem
+ _.eachObj(_component.manipulator, function(methodName, method) {
+ self[methodName] = method.bind(self);
+ });
+
+ // prevent external modifications of properties
+ utils.updateProperties(self, { writable: false, configurable: false });
+}
+
+module.exports = ClayItem;
--- /dev/null
+'use strict';
+
+// module is blank because we dynamically add components
+module.exports = {};
--- /dev/null
+'use strict';
+
+var _ = require('../vendor/minified')._;
+
+/**
+ * @returns {ClayItem|ClayEvents}
+ * @extends {ClayItem}
+ */
+function disable() {
+ if (this.$manipulatorTarget.get('disabled')) { return this; }
+ this.$element.set('+disabled');
+ this.$manipulatorTarget.set('disabled', true);
+ return this.trigger('disabled');
+}
+
+/**
+ * @returns {ClayItem|ClayEvents}
+ * @extends {ClayItem}
+ */
+function enable() {
+ if (!this.$manipulatorTarget.get('disabled')) { return this; }
+ this.$element.set('-disabled');
+ this.$manipulatorTarget.set('disabled', false);
+ return this.trigger('enabled');
+}
+
+/**
+ * @returns {ClayItem|ClayEvents}
+ * @extends {ClayItem}
+ */
+function hide() {
+ if (this.$element[0].classList.contains('hide')) { return this; }
+ this.$element.set('+hide');
+ return this.trigger('hide');
+}
+
+/**
+ * @returns {ClayItem|ClayEvents}
+ * @extends {ClayItem}
+ */
+function show() {
+ if (!this.$element[0].classList.contains('hide')) { return this; }
+ this.$element.set('-hide');
+ return this.trigger('show');
+}
+
+module.exports = {
+ html: {
+ get: function() {
+ return this.$manipulatorTarget.get('innerHTML');
+ },
+ set: function(value) {
+ if (this.get() === value.toString(10)) { return this; }
+ this.$manipulatorTarget.set('innerHTML', value);
+ return this.trigger('change');
+ },
+ hide: hide,
+ show: show
+ },
+ button: {
+ get: function() {
+ return this.$manipulatorTarget.get('innerHTML');
+ },
+ set: function(value) {
+ if (this.get() === value.toString(10)) { return this; }
+ this.$manipulatorTarget.set('innerHTML', value);
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ val: {
+ get: function() {
+ return this.$manipulatorTarget.get('value');
+ },
+ set: function(value) {
+ if (this.get() === value.toString(10)) { return this; }
+ this.$manipulatorTarget.set('value', value);
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ slider: {
+ get: function() {
+ return parseFloat(this.$manipulatorTarget.get('value'));
+ },
+ set: function(value) {
+ var initVal = this.get();
+ this.$manipulatorTarget.set('value', value);
+ if (this.get() === initVal) { return this; }
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ checked: {
+ get: function() {
+ return this.$manipulatorTarget.get('checked');
+ },
+ set: function(value) {
+ if (!this.get() === !value) { return this; }
+ this.$manipulatorTarget.set('checked', !!value);
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ radiogroup: {
+ get: function() {
+ return this.$element.select('input:checked').get('value');
+ },
+ set: function(value) {
+ if (this.get() === value.toString(10)) { return this; }
+ this.$element
+ .select('input[value="' + value.replace('"', '\\"') + '"]')
+ .set('checked', true);
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ checkboxgroup: {
+ get: function() {
+ var result = [];
+ this.$element.select('input').each(function(item) {
+ result.push(!!item.checked);
+ });
+ return result;
+ },
+ set: function(values) {
+ var self = this;
+ values = Array.isArray(values) ? values : [];
+
+ while (values.length < this.get().length) {
+ values.push(false);
+ }
+
+ if (_.equals(this.get(), values)) { return this; }
+
+ self.$element.select('input')
+ .set('checked', false)
+ .each(function(item, index) {
+ item.checked = !!values[index];
+ });
+
+ return self.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ },
+ color: {
+ get: function() {
+ return parseInt(this.$manipulatorTarget.get('value'), 10) || 0;
+ },
+ set: function(value) {
+ value = this.roundColorToLayout(value || 0);
+
+ if (this.get() === value) { return this; }
+ this.$manipulatorTarget.set('value', value);
+ return this.trigger('change');
+ },
+ disable: disable,
+ enable: enable,
+ hide: hide,
+ show: show
+ }
+};
--- /dev/null
+'use strict';
+
+/**
+ * Batch update all the properties of an object.
+ * @param {Object} obj
+ * @param {Object} descriptor
+ * @param {boolean} [descriptor.configurable]
+ * @param {boolean} [descriptor.enumerable]
+ * @param {*} [descriptor.value]
+ * @param {boolean} [descriptor.writable]
+ * @param {function} [descriptor.get]
+ * @param {function} [descriptor.set]
+ * @return {void}
+ */
+module.exports.updateProperties = function(obj, descriptor) {
+ Object.getOwnPropertyNames(obj).forEach(function(prop) {
+ Object.defineProperty(obj, prop, descriptor);
+ });
+};
+
+module.exports.capabilityMap = {
+ PLATFORM_APLITE: {
+ platforms: ['aplite'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ PLATFORM_BASALT: {
+ platforms: ['basalt'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ PLATFORM_CHALK: {
+ platforms: ['chalk'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ PLATFORM_DIORITE: {
+ platforms: ['diorite'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ PLATFORM_EMERY: {
+ platforms: ['emery'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ BW: {
+ platforms: ['aplite', 'diorite'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ COLOR: {
+ platforms: ['basalt', 'chalk', 'emery'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ MICROPHONE: {
+ platforms: ['basalt', 'chalk', 'diorite', 'emery'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ SMARTSTRAP: {
+ platforms: ['basalt', 'chalk', 'diorite', 'emery'],
+ minFwMajor: 3,
+ minFwMinor: 4
+ },
+ SMARTSTRAP_POWER: {
+ platforms: ['basalt', 'chalk', 'emery'],
+ minFwMajor: 3,
+ minFwMinor: 4
+ },
+ HEALTH: {
+ platforms: ['basalt', 'chalk', 'diorite', 'emery'],
+ minFwMajor: 3,
+ minFwMinor: 10
+ },
+ RECT: {
+ platforms: ['aplite', 'basalt', 'diorite', 'emery'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ ROUND: {
+ platforms: ['chalk'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ DISPLAY_144x168: {
+ platforms: ['aplite', 'basalt', 'diorite'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ DISPLAY_180x180_ROUND: {
+ platforms: ['chalk'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ },
+ DISPLAY_200x228: {
+ platforms: ['emery'],
+ minFwMajor: 0,
+ minFwMinor: 0
+ }
+};
+
+/**
+ * Checks if all of the provided capabilities are compatible with the watch
+ * @param {Object} activeWatchInfo
+ * @param {Array<string>} [capabilities]
+ * @return {boolean}
+ */
+module.exports.includesCapability = function(activeWatchInfo, capabilities) {
+ var notRegex = /^NOT_/;
+ var result = [];
+
+ if (!capabilities || !capabilities.length) {
+ return true;
+ }
+
+ for (var i = capabilities.length - 1; i >= 0; i--) {
+ var capability = capabilities[i];
+ var mapping = module.exports.capabilityMap[capability.replace(notRegex, '')];
+
+ if (!mapping ||
+ mapping.platforms.indexOf(activeWatchInfo.platform) === -1 ||
+ mapping.minFwMajor > activeWatchInfo.firmware.major ||
+ mapping.minFwMajor === activeWatchInfo.firmware.major &&
+ mapping.minFwMinor > activeWatchInfo.firmware.minor
+ ) {
+ result.push(!!capability.match(notRegex));
+ } else {
+ result.push(!capability.match(notRegex));
+ }
+ }
+
+ return result.indexOf(false) === -1;
+};
--- /dev/null
+var path = require('path');
+var through = require('through');
+var postcss = require('postcss');
+var autoprefixer = require('autoprefixer');
+var requireFromString = require('require-from-string');
+
+/**
+ * Stringifies the content
+ * @param {string} content
+ * @returns {string}
+ */
+function stringify (content) {
+ return 'module.exports = ' + JSON.stringify(content) + ';\n';
+}
+
+module.exports = function (file, options) {
+
+ /**
+ * The function Browserify will use to transform the input.
+ * @param {string} file
+ * @returns {stream}
+ */
+ function browserifyTransform (file) {
+ var extensions = ['.css', '.sass', '.scss', '.less'];
+ var chunks = [];
+
+ if (extensions.indexOf(path.extname(file)) === -1) {
+ return through();
+ }
+
+ var write = function (buffer) {
+ chunks.push(buffer);
+ };
+
+ var end = function () {
+ var contents = requireFromString(Buffer.concat(chunks).toString('utf8'));
+ contents = postcss([autoprefixer(options)]).process(contents).css;
+ this.queue(stringify(contents));
+ this.queue(null);
+ };
+
+ return through(write, end);
+ }
+
+ if (typeof file !== 'string') {
+ options = file;
+ return browserifyTransform;
+ } else {
+ return browserifyTransform(file);
+ }
+};
--- /dev/null
+// minified.js config start -- use this comment to re-create a configuration in the Builder
+// - Only sections add, always, amdsupport, copyobj, dollardollar,
+// - each, eachobj, equals, error, extend, find, format, formathtml, get, ht,
+// - html, isobject, off, on, ready, request, select, set, template, trigger,
+// - underscore, wait.
+
+
+// WARNING! This file is autogenerated from minified-master.js and others.
+
+/*
+ * Minified.js - Lightweight Client-Side JavaScript Library (full package)
+ * Version: Version 2014 beta 5 b2
+ *
+ * Public Domain. Use, modify and distribute it any way you like. No attribution required.
+ * To the extent possible under law, Tim Jansen has waived all copyright and related or neighboring rights to Minified.
+ * Please see http://creativecommons.org/publicdomain/zero/1.0/.
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+ *
+ * Contains code based on https://github.com/douglascrockford/JSON-js (also Public Domain).
+ *
+ * https://github.com/timjansen/minified.js
+ */
+// ==ClosureCompiler==
+// @output_file_name minified.js
+// @compilation_level ADVANCED_OPTIMIZATIONS
+// ==/ClosureCompiler==
+
+/*$
+ * @id ALL
+ * @doc no
+ * @required
+ * This id allows identifying whether both Web and Util are available.
+ */
+
+///#snippet commonAmdStart
+
+/*$
+ * @id require
+ * @name require()
+ * @syntax require(name)
+ * @group OPTIONS
+ * @module WEB, UTIL
+ * Returns a reference to a module. If you do not use an AMD loader to load Minified, just call <var>require()</var> with the
+ * argument 'minified' to get a reference to Minified. You can also access all modules defined using ##define().
+ *
+ * If you do use an AMD loader, Minified will not define this function and you can use the AMD loader to obtain the
+ * reference to Minified.
+ * Minified's version of <var>require</var> is very simple and will only support Minified and other libraries designed
+ * for Minfied, but <strong>no real AMD libraries</strong>. If you need to work with libraries requiring AMD, you need a real AMD loader.
+ *
+ * @param name the name of the module to request. Minified is available as 'minified'.
+ * @return the reference to the module. Use the name 'minified' to get Minified. You can also access any modules defined using
+ * ##define(). If the name is unknown, it returns <var>undefined</var>.
+ *
+ * @see ##define() allows you to define modules that can be obtained using <var>require()</var>.
+ */
+
+/*$
+ * @id define
+ * @name define()
+ * @syntax define(name, factoryFunction)
+ * @group OPTIONS
+ * @module WEB, UTIL
+ * Defines a module that can be returned by ##require(), in case you don't have a AMD loader. If you have a AMD loader before you include Minified,
+ * <var>define()</var> will not be set and you can use the AMD loader's (more powerful) variant.
+ *
+ * Minified's versions of <var>require()</var> and <var>define()</var> are very simple and can not resolve things like circular references.
+ * Also, they are not AMD-compatible and only useful for simple modules. If you need to work with real AMD libraries that are not written
+ * for Minified, you need a real AMD loader.
+ *
+ * @example Creates a simple module and uses it:
+ * <pre>
+ * define('makeGreen', function(require) {
+ * var MINI = require('minified'), $ = MINI.$; // obtain own ref to Minified
+ * return function(list) {
+ * $(list).set({$color: '#0f0', $backgroundColor: '#050'});
+ * });
+ * });
+ *
+ * var makeGreen = require('makeGreen');
+ * makeGreen('.notGreenEnough');
+ * </pre>
+ *
+ * @param name the name of the module to request. In Minified's implementation, only 'minified' is supported.
+ * @param factoryFunction is a <code>function(require)</code> will be called the first time the name is defined to obtain the module
+ * reference. It received a reference to ##require() (which is required for AMD backward-compatibility) and
+ * must return the value that is returned by ##require(). The function will only be called once, its result will
+ * be cached.
+ * <dl><dt>require</dt><dd>A reference to ##require(). While you could use <var>require()</var> from the global
+ * context, this would prevent backward compatibility with AMD.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The reference to be returned by ##require().</dd></dl>
+ *
+ * @see ##require() can be used to obtain references defined with ##define().
+ */
+
+/*$
+ * @id amdsupport
+ * @name AMD stubs
+ * @configurable default
+ * @group OPTIONS
+ * @doc no
+ * @module WEB, UTIL
+ * If enabled, Minified will create stubs so you can use it without an AMD framework.
+ * It requires AMD's <code>define()</code> function.
+ */
+if (/^u/.test(typeof define)) { // no AMD support available ? define a minimal version
+ (function(def){
+ var require = this['require'] = function(name) { return def[name]; };
+ this['define'] = function(name, f) { def[name] = def[name] || f(require); };
+ })({});
+}
+/*$
+ * @stop
+ */
+
+define('minified', function() {
+
+ ///#/snippet commonAmdStart
+ ///#snippet webVars
+ /*$
+ * @id WEB
+ * @doc no
+ * @required
+ * This id allows identifying whether the Web module is available.
+ */
+
+ /**
+ * @const
+ */
+ var _window = window;
+
+ /**
+ * @const
+ * @type {!string}
+ */
+ var MINIFIED_MAGIC_NODEID = 'Nia';
+
+ /**
+ * @const
+ * @type {!string}
+ */
+ var MINIFIED_MAGIC_PREV = 'NiaP';
+
+ var setter = {}, getter = {};
+
+ var idSequence = 1; // used as node id to identify nodes, and as general id for other maps
+
+
+ /*$
+ * @id ready_vars
+ * @dependency
+ */
+ /** @type {!Array.<function()>} */
+ var DOMREADY_HANDLER = /^[ic]/.test(document['readyState']) ? _null : []; // check for 'interactive' and 'complete'
+ /*$
+ * @stop
+ */
+
+ ///#/snippet webVars
+ ///#snippet utilVars
+ /*$
+ * @id UTIL
+ * @doc no
+ * @required
+ * This id allows identifying whether the Util module is available.
+ */
+
+ var _null = null;
+
+ /** @const */
+ var undef;
+
+ /*$
+ * @id date_constants
+ * @dependency
+ */
+ function val3(v) {return v.substr(0,3);}
+ var MONTH_LONG_NAMES = split('January,February,March,April,May,June,July,August,September,October,November,December', /,/g);
+ var MONTH_SHORT_NAMES = map(MONTH_LONG_NAMES, val3); // ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
+ var WEEK_LONG_NAMES = split('Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday', /,/g);
+ var WEEK_SHORT_NAMES = map(WEEK_LONG_NAMES, val3);
+ var MERIDIAN_NAMES = split('am,pm', /,/g);
+ var MERIDIAN_NAMES_FULL = split('am,am,am,am,am,am,am,am,am,am,am,am,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm,pm', /,/g);
+
+ var FORMAT_DATE_MAP = {
+ 'y': ['FullYear', nonOp],
+ 'Y': ['FullYear', function(d) { return d % 100; }],
+ 'M': ['Month', plusOne],
+ 'n': ['Month', MONTH_SHORT_NAMES],
+ 'N': ['Month', MONTH_LONG_NAMES],
+ 'd': ['Date', nonOp],
+ 'm': ['Minutes', nonOp],
+ 'H': ['Hours', nonOp],
+ 'h': ['Hours', function(d) { return (d % 12) || 12; }],
+ 'k': ['Hours', plusOne],
+ 'K': ['Hours', function(d) { return d % 12; }],
+ 's': ['Seconds', nonOp],
+ 'S': ['Milliseconds', nonOp],
+ 'a': ['Hours', MERIDIAN_NAMES_FULL],
+ 'w': ['Day', WEEK_SHORT_NAMES],
+ 'W': ['Day', WEEK_LONG_NAMES],
+ 'z': ['TimezoneOffset', function(d, dummy, timezone) {
+ if (timezone)
+ return timezone;
+
+ var sign = d > 0 ? '-' : '+';
+ var off = d < 0 ? -d : d;
+ return sign + pad(2, Math.floor(off/60)) + pad(2, off%60);
+ }]
+ };
+
+ var PARSE_DATE_MAP = {
+ 'y': 0, // placeholder -> ctorIndex
+ 'Y': [0, -2000],
+ 'M': [1,1], // placeholder -> [ctorIndex, offset|value array]
+ 'n': [1, MONTH_SHORT_NAMES],
+ 'N': [1, MONTH_LONG_NAMES],
+ 'd': 2,
+ 'm': 4,
+ 'H': 3,
+ 'h': 3,
+ 'K': [3,1],
+ 'k': [3,1],
+ 's': 5,
+ 'S': 6,
+ 'a': [3, MERIDIAN_NAMES]
+ };
+
+ /*$
+ * @stop
+ */
+
+ /** @const */
+ var MAX_CACHED_TEMPLATES = 99;
+ var templateCache={}; // template -> function
+ var templates = []; // list of MAX_CACHED_TEMPLATES templates
+
+ ///#/snippet utilVars
+ ///#snippet commonFunctions
+
+ /** @param s {?} */
+ function toString(s) {
+ return s!=_null ? ''+s : '';
+ }
+ /**
+ * @param s {?}
+ * @param o {string}
+ */
+ function isType(s,o) {
+ return typeof s == o;
+ }
+ /** @param s {?} */
+ function isString(s) {
+ return isType(s, 'string');
+ }
+ function isObject(f) {
+ return !!f && isType(f, 'object');
+ }
+ function isNode(n) {
+ return n && n['nodeType'];
+ }
+ function isNumber(n) {
+ return isType(n, 'number');
+ }
+ function isDate(n) {
+ return isObject(n) && !!n['getDay'];
+ }
+ function isBool(n) {
+ return n === true || n === false;
+ }
+ function isValue(n) {
+ var type = typeof n;
+ return type == 'object' ? !!(n && n['getDay']) : (type == 'string' || type == 'number' || isBool(n));
+ }
+ function nonOp(v) {
+ return v;
+ }
+ function plusOne(d) {
+ return d+1;
+ }
+ function replace(s, regexp, sub) {
+ return toString(s).replace(regexp, sub != _null ? sub : '');
+ }
+ function escapeRegExp(s) {
+ return replace(s, /[\\\[\]\/{}()*+?.$|^-]/g, "\\$&");
+ }
+ function trim(s) {
+ return replace(s, /^\s+|\s+$/g);
+ }
+ function eachObj(obj, cb, ctx) {
+ for (var n in obj)
+ if (obj.hasOwnProperty(n))
+ cb.call(ctx || obj, n, obj[n]);
+ return obj;
+ }
+ function each(list, cb, ctx) {
+ if (list)
+ for (var i = 0; i < list.length; i++)
+ cb.call(ctx || list, list[i], i);
+ return list;
+ }
+ function filter(list, filterFuncOrObject, ctx) {
+ var r = [];
+ var f = isFunction(filterFuncOrObject) ? filterFuncOrObject : function(value) { return filterFuncOrObject != value; };
+ each(list, function(value, index) {
+ if (f.call(ctx || list, value, index))
+ r.push(value);
+ });
+ return r;
+ }
+ function collector(iterator, obj, collectFunc, ctx) {
+ var result = [];
+ iterator(obj, function (a, b) {
+ if (isList(a = collectFunc.call(ctx || obj, a, b))) // extreme variable reusing: a is now the callback result
+ each(a, function(rr) { result.push(rr); });
+ else if (a != _null)
+ result.push(a);
+ });
+ return result;
+ }
+ function collectObj(obj, collectFunc, ctx) {
+ return collector(eachObj, obj, collectFunc, ctx);
+ }
+ function collect(list, collectFunc, ctx) {
+ return collector(each, list, collectFunc, ctx);
+ }
+ function keyCount(obj) {
+ var c = 0;
+ eachObj(obj, function(key) { c++; });
+ return c;
+ }
+ function keys(obj) { // use Object.keys? in IE>=9
+ var list = [];
+ eachObj(obj, function(key) { list.push(key); });
+ return list;
+ }
+ function map(list, mapFunc, ctx) {
+ var result = [];
+ each(list, function(item, index) {
+ result.push(mapFunc.call(ctx || list, item, index));
+ });
+ return result;
+ }
+ function startsWith(base, start) {
+ if (isList(base)) {
+ var s2 = _(start); // convert start as we don't know whether it is a list yet
+ return equals(sub(base, 0, s2.length), s2);
+ }
+ else
+ return start != _null && base.substr(0, start.length) == start;
+ }
+ function endsWith(base, end) {
+ if (isList(base)) {
+ var e2 = _(end);
+ return equals(sub(base, -e2.length), e2) || !e2.length;
+ }
+ else
+ return end != _null && base.substr(base.length - end.length) == end;
+ }
+ function reverse(list) {
+ var len = list.length;
+ if (isList(list))
+ return new M(map(list, function() { return list[--len]; }));
+ else
+ return replace(list, /[\s\S]/g, function() { return list.charAt(--len); });
+ }
+ function toObject(list, value) {
+ var obj = {};
+ each(list, function(item, index) {
+ obj[item] = value;
+ });
+ return obj;
+ }
+ function copyObj(from, to) {
+ var dest = to || {};
+ for (var name in from)
+ dest[name] = from[name];
+ return dest;
+ }
+ function merge(list, target) {
+ var o = target;
+ for (var i = 0; i < list.length; i++)
+ o = copyObj(list[i], o);
+ return o;
+ }
+ function getFindFunc(findFunc) {
+ return isFunction(findFunc) ? findFunc : function(obj, index) { if (findFunc === obj) return index; };
+ }
+ function getFindIndex(list, index, defaultIndex) {
+ return index == _null ? defaultIndex : index < 0 ? Math.max(list.length+index, 0) : Math.min(list.length, index);
+ }
+ function find(list, findFunc, startIndex, endIndex) {
+ var f = getFindFunc(findFunc);
+ var e = getFindIndex(list, endIndex, list.length);
+ var r;
+ for (var i = getFindIndex(list, startIndex, 0); i < e; i++)
+ if ((r = f.call(list, list[i], i)) != _null)
+ return r;
+ }
+ function findLast(list, findFunc, startIndex, endIndex) {
+ var f = getFindFunc(findFunc);
+ var e = getFindIndex(list, endIndex, -1);
+ var r;
+ for (var i = getFindIndex(list, startIndex, list.length-1); i > e; i--)
+ if ((r = f.call(list, list[i], i)) != _null)
+ return r;
+ }
+ function sub(list, startIndex, endIndex) {
+ var r = [];
+ if (list) {
+ var e = getFindIndex(list, endIndex, list.length);
+ for (var i = getFindIndex(list, startIndex, 0); i < e; i++)
+ r.push(list[i]);
+ }
+ return r;
+ }
+ function array(list) {
+ return map(list, nonOp);
+ }
+ function unite(list) {
+ return function() {
+ return new M(callList(list, arguments));
+ };
+ }
+ function uniq(list) {
+ var found = {};
+ return filter(list, function(item) {
+ if (found[item])
+ return false;
+ else
+ return found[item] = 1;
+ });
+ }
+ function intersection(list, otherList) {
+ var keys = toObject(otherList, 1);
+ return filter(list, function(item) {
+ var r = keys[item];
+ keys[item] = 0;
+ return r;
+ });
+ }
+ function contains(list, value) { // TODO: can Array.indexOf be used in >IE8?
+ for (var i = 0; i < list.length; i++)
+ if (list[i] == value)
+ return true;
+ return false;
+ }
+ // equals if a and b have the same elements and all are equal. Supports getters.
+ function equals(x, y) {
+ var a = isFunction(x) ? x() : x;
+ var b = isFunction(y) ? y() : y;
+ var aKeys;
+ if (a == b)
+ return true;
+ else if (a == _null || b == _null)
+ return false;
+ else if (isValue(a) || isValue(b))
+ return isDate(a) && isDate(b) && +a==+b;
+ else if (isList(a)) {
+ return (a.length == b.length) &&
+ !find(a, function(val, index) {
+ if (!equals(val, b[index]))
+ return true;
+ });
+ }
+ else {
+ return !isList(b) &&
+ ((aKeys = keys(a)).length == keyCount(b)) &&
+ !find(aKeys, function(key) {
+ if (!equals(a[key],b[key]))
+ return true;
+ });
+ }
+ }
+
+ function call(f, fThisOrArgs, args) {
+ if (isFunction(f))
+ return f.apply(args && fThisOrArgs, map(args || fThisOrArgs, nonOp));
+ }
+ function callList(list, fThisOrArgs, args) {
+ return map(list, function(f) { return call(f, fThisOrArgs, args);});
+ }
+ function bind(f, fThis, beforeArgs, afterArgs) {
+ return function() {
+ return call(f, fThis, collect([beforeArgs, arguments, afterArgs], nonOp));
+ };
+ }
+ function partial(f, beforeArgs, afterArgs) {
+ return bind(f, this, beforeArgs, afterArgs);
+ }
+ function pad(digits, number) {
+ var signed = number < 0 ? '-' : '';
+ var preDecimal = (signed?-number:number).toFixed(0);
+ while (preDecimal.length < digits)
+ preDecimal = '0' + preDecimal;
+ return signed + preDecimal;
+ }
+
+ function processNumCharTemplate(tpl, input, fwd) {
+ var inHash;
+ var inputPos = 0;
+ var rInput = fwd ? input : reverse(input);
+ var s = (fwd ? tpl : reverse(tpl)).replace(/./g, function(tplChar) {
+ if (tplChar == '0') {
+ inHash = false;
+ return rInput.charAt(inputPos++) || '0';
+ }
+ else if (tplChar == '#') {
+ inHash = true;
+ return rInput.charAt(inputPos++) || '';
+ }
+ else
+ return inHash && !rInput.charAt(inputPos) ? '' : tplChar;
+ });
+ return fwd ? s : (input.substr(0, input.length - inputPos) + reverse(s));
+ }
+
+ function getTimezone(match, idx, refDate) { // internal helper, see below
+ if (idx == _null || !match)
+ return 0;
+ return parseFloat(match[idx]+match[idx+1])*60 + parseFloat(match[idx]+match[idx+2]) + refDate.getTimezoneOffset();
+ }
+
+ // formats number with format string (e.g. "#.000", "#,#", "00000", "000.00", "000.000.000,00", "000,000,000.##")
+ // choice syntax: <cmp><value>:<format>|<cmp><value>:<format>|...
+ // e.g. 0:no item|1:one item|>=2:# items
+ // <value>="null" used to compare with nulls.
+ // choice also works with strings or bools, e.g. ERR:error|WAR:warning|FAT:fatal|ok
+ function formatValue(fmt, value) {
+ var format = replace(fmt, /^\?/);
+ if (isDate(value)) {
+ var timezone, match;
+
+ if (match = /^\[(([+-])(\d\d)(\d\d))\]\s*(.*)/.exec(format)) {
+ timezone = match[1];
+ value = dateAdd(value, 'minutes', getTimezone(match, 2, value));
+ format = match[5];
+ }
+
+ return replace(format, /(\w)(\1*)(?:\[([^\]]+)\])?/g, function(s, placeholderChar, placeholderDigits, params) {
+ var val = FORMAT_DATE_MAP[placeholderChar];
+ if (val) {
+ var d = value['get' + val[0]]();
+ var optionArray = (params && params.split(','));
+
+ if (isList(val[1]))
+ d = (optionArray || val[1])[d];
+ else
+ d = val[1](d, optionArray, timezone);
+ if (d != _null && !isString(d))
+ d = pad(placeholderDigits.length+1, d);
+ return d;
+ }
+ else
+ return s;
+ });
+
+ }
+ else
+ return find(format.split(/\s*\|\s*/), function(fmtPart) {
+ var match, numFmtOrResult;
+ if (match = /^([<>]?)(=?)([^:]*?)\s*:\s*(.*)$/.exec(fmtPart)) {
+ var cmpVal1 = value, cmpVal2 = +(match[3]);
+ if (isNaN(cmpVal2) || !isNumber(cmpVal1)) {
+ cmpVal1 = (cmpVal1==_null) ? "null" : toString(cmpVal1); // not ""+value, because undefined is treated as null here
+ cmpVal2 = match[3];
+ }
+ if (match[1]) {
+ if ((!match[2] && cmpVal1 == cmpVal2 ) ||
+ (match[1] == '<' && cmpVal1 > cmpVal2) ||
+ (match[1] == '>' && cmpVal1 < cmpVal2))
+ return _null;
+ }
+ else if (cmpVal1 != cmpVal2)
+ return _null;
+ numFmtOrResult = match[4];
+ }
+ else
+ numFmtOrResult = fmtPart;
+
+ if (isNumber(value))
+ return numFmtOrResult.replace(/[0#](.*[0#])?/, function(numFmt) {
+ var decimalFmt = /^([^.]+)(\.)([^.]+)$/.exec(numFmt) || /^([^,]+)(,)([^,]+)$/.exec(numFmt);
+ var signed = value < 0 ? '-' : '';
+ var numData = /(\d+)(\.(\d+))?/.exec((signed?-value:value).toFixed(decimalFmt ? decimalFmt[3].length:0));
+ var preDecimalFmt = decimalFmt ? decimalFmt[1] : numFmt;
+ var postDecimal = decimalFmt ? processNumCharTemplate(decimalFmt[3], replace(numData[3], /0+$/), true) : '';
+
+ return (signed ? '-' : '') +
+ (preDecimalFmt == '#' ? numData[1] : processNumCharTemplate(preDecimalFmt, numData[1])) +
+ (postDecimal.length ? decimalFmt[2] : '') +
+ postDecimal;
+ });
+ else
+ return numFmtOrResult;
+ });
+ }
+ // returns date; null if optional and not set; undefined if parsing failed
+ function parseDate(fmt, date) {
+ var indexMap = {}; // contains reGroupPosition -> typeLetter or [typeLetter, value array]
+ var reIndex = 1;
+ var timezoneOffsetMatch;
+ var timezoneIndex;
+ var match;
+
+ var format = replace(fmt, /^\?/);
+ if (format!=fmt && !trim(date))
+ return _null;
+
+ if (match = /^\[([+-])(\d\d)(\d\d)\]\s*(.*)/.exec(format)) {
+ timezoneOffsetMatch = match;
+ format = match[4];
+ }
+
+ var parser = new RegExp(format.replace(/(.)(\1*)(?:\[([^\]]*)\])?/g, function(wholeMatch, placeholderChar, placeholderDigits, param) {
+ if (/[dmhkyhs]/i.test(placeholderChar)) {
+ indexMap[reIndex++] = placeholderChar;
+ var plen = placeholderDigits.length+1;
+ return "(\\d"+(plen<2?"+":("{1,"+plen+"}"))+")";
+ }
+ else if (placeholderChar == 'z') {
+ timezoneIndex = reIndex;
+ reIndex += 3;
+ return "([+-])(\\d\\d)(\\d\\d)";
+ }
+ else if (/[Nna]/.test(placeholderChar)) {
+ indexMap[reIndex++] = [placeholderChar, param && param.split(',')];
+ return "([a-zA-Z\\u0080-\\u1fff]+)";
+ }
+ else if (/w/i.test(placeholderChar))
+ return "[a-zA-Z\\u0080-\\u1fff]+";
+ else if (/\s/.test(placeholderChar))
+ return "\\s+";
+ else
+ return escapeRegExp(wholeMatch);
+ }));
+
+ if (!(match = parser.exec(date)))
+ return undef;
+
+ var ctorArgs = [0, 0, 0, 0, 0, 0, 0];
+ for (var i = 1; i < reIndex; i++) {
+ var matchVal = match[i];
+ var indexEntry = indexMap[i];
+ if (isList(indexEntry)) { // for a, n or N
+ var placeholderChar = indexEntry[0];
+ var mapEntry = PARSE_DATE_MAP[placeholderChar];
+ var ctorIndex = mapEntry[0];
+ var valList = indexEntry[1] || mapEntry[1];
+ var listValue = find(valList, function(v, index) { if (startsWith(matchVal.toLowerCase(), v.toLowerCase())) return index; });
+ if (listValue == _null)
+ return undef;
+ if (placeholderChar == 'a')
+ ctorArgs[ctorIndex] += listValue * 12;
+ else
+ ctorArgs[ctorIndex] = listValue;
+ }
+ else if (indexEntry) { // for numeric values (yHmMs)
+ var value = parseFloat(matchVal);
+ var mapEntry = PARSE_DATE_MAP[indexEntry];
+ if (isList(mapEntry))
+ ctorArgs[mapEntry[0]] += value - mapEntry[1];
+ else
+ ctorArgs[mapEntry] += value;
+ }
+ }
+ var d = new Date(ctorArgs[0], ctorArgs[1], ctorArgs[2], ctorArgs[3], ctorArgs[4], ctorArgs[5], ctorArgs[6]);
+ return dateAdd(d, 'minutes', -getTimezone(timezoneOffsetMatch, 1, d) - getTimezone(match, timezoneIndex, d));
+ }
+ // format ?##00,00##
+ // returns number; null if optional and not set; undefined if parsing failed
+ function parseNumber(fmt, value) {
+ var format = replace(fmt, /^\?/);
+ if (format!=fmt && !trim(value))
+ return _null;
+ var decSep = (/(^|[^0#.,])(,|[0#.]*,[0#]+|[0#]+\.[0#]+\.[0#.,]*)($|[^0#.,])/.test(format)) ? ',' : '.';
+ var r = parseFloat(replace(replace(replace(value, decSep == ',' ? /\./g : /,/g), decSep, '.'), /^[^\d-]*(-?\d)/, '$1'));
+ return isNaN(r) ? undef : r;
+ }
+ function now() {
+ return new Date();
+ }
+ function dateClone(date) {
+ return new Date(+date);
+ }
+ function capWord(w) {
+ return w.charAt(0).toUpperCase() + w.substr(1);
+ }
+ function dateAddInline(d, cProp, value) {
+ d['set'+cProp](d['get'+cProp]() + value);
+ return d;
+ }
+ function dateAdd(date, property, value) {
+ if (value == _null)
+ return dateAdd(now(), date, property);
+ return dateAddInline(dateClone(date), capWord(property), value);
+ }
+ function dateMidnight(date) {
+ var od = date || now();
+ return new Date(od.getFullYear(), od.getMonth(), od.getDate());
+ }
+ function dateDiff(property, date1, date2) {
+ var d1t = +date1;
+ var d2t = +date2;
+ var dt = d2t - d1t;
+ if (dt < 0)
+ return -dateDiff(property, date2, date1);
+
+ var propValues = {'milliseconds': 1, 'seconds': 1000, 'minutes': 60000, 'hours': 3600000};
+ var ft = propValues[property];
+ if (ft)
+ return dt / ft;
+
+ var cProp = capWord(property);
+ var calApproxValues = {'fullYear': 8.64e7*365, 'month': 8.64e7*365/12, 'date': 8.64e7}; // minimum values, a little bit below avg values
+ var minimumResult = Math.floor((dt / calApproxValues[property])-2); // -2 to remove the imperfections caused by the values above
+
+ var d = dateAddInline(new Date(d1t), cProp, minimumResult);
+ for (var i = minimumResult; i < minimumResult*1.2+4; i++) { // try out 20% more than needed, just to be sure
+ if (+dateAddInline(d, cProp, 1) > d2t)
+ return i;
+ }
+ // should never ever be reached
+ }
+
+ function ucode(a) {
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ }
+
+ function escapeJavaScriptString(s) {
+ return replace(s, /[\x00-\x1f'"\u2028\u2029]/g, ucode);
+ }
+
+ // reimplemented split for IE8
+ function split(str, regexp) {
+
+ return str.split(regexp);
+ }
+
+ function template(template, escapeFunction) {
+ if (templateCache[template])
+ return templateCache[template];
+ else {
+ var funcBody = 'with(_.isObject(obj)?obj:{}){'+
+ map(split(template, /{{|}}}?/g), function(chunk, index) {
+ var match, c1 = trim(chunk), c2 = replace(c1, /^{/), escapeSnippet = (c1==c2) ? 'esc(' : '';
+ if (index%2) { // odd means JS code
+ if (match = /^each\b(\s+([\w_]+(\s*,\s*[\w_]+)?)\s*:)?(.*)/.exec(c2))
+ return 'each('+(trim(match[4])?match[4]:'this')+', function('+match[2]+'){';
+ else if (match = /^if\b(.*)/.exec(c2))
+ return 'if('+match[1]+'){';
+ else if (match = /^else\b\s*(if\b(.*))?/.exec(c2))
+ return '}else ' + (match[1] ? 'if('+match[2] +')' : '')+'{';
+ else if (match = /^\/(if)?/.exec(c2))
+ return match[1] ? '}\n' : '});\n';
+ else if (match = /^(var\s.*)/.exec(c2))
+ return match[1]+';';
+ else if (match = /^#(.*)/.exec(c2))
+ return match[1];
+ else if (match = /(.*)::\s*(.*)/.exec(c2))
+ return 'print('+escapeSnippet+'_.formatValue("'+escapeJavaScriptString(match[2])+'",'+(trim(match[1])?match[1]:'this')+(escapeSnippet&&')')+'));\n';
+ else
+ return 'print('+escapeSnippet+(trim(c2)?c2:'this')+(escapeSnippet&&')')+');\n';
+ }
+ else if (chunk){
+ return 'print("'+escapeJavaScriptString(chunk)+'");\n';
+ }
+ }).join('')+'}';
+ var f = (new Function('obj', 'each', 'esc', 'print', '_', funcBody));
+ var t = function(obj, thisContext) {
+ var result = [];
+ f.call(thisContext || obj, obj, function(obj, func) {
+ if (isList(obj))
+ each(obj, function(value, index) { func.call(value, value, index); });
+ else
+ eachObj(obj, function(key, value) { func.call(value, key, value); });
+ }, escapeFunction || nonOp, function() {call(result['push'], result, arguments);}, _);
+ return result.join('');
+ };
+ if (templates.push(t) > MAX_CACHED_TEMPLATES)
+ delete templateCache[templates.shift()];
+ return templateCache[template] = t;
+ }
+ }
+
+ function escapeHtml(s) {
+ return replace(s, /[<>'"&]/g, function(s) {
+ return '&#'+s.charCodeAt(0)+';';
+ });
+ }
+
+ function formatHtml(tpl, obj) {
+ return template(tpl, escapeHtml)(obj);
+ }
+
+ function listBindArray(func) {
+ return function(arg1, arg2) {
+ return new M(func(this, arg1, arg2));
+ };
+ }
+ function listBind(func) {
+ return function(arg1, arg2, arg3) {
+ return func(this, arg1, arg2, arg3);
+ };
+ }
+ function funcArrayBind(func) {
+ return function(arg1, arg2, arg3) {
+ return new M(func(arg1, arg2, arg3));
+ };
+ }
+
+ ///#/snippet commonFunctions
+ ///#snippet webFunctions
+
+ // note: only the web version has the f.item check
+ function isFunction(f) {
+ return typeof f == 'function' && !f['item']; // item check as work-around for webkit bug 14547
+ }
+
+ function isList(v) {
+ return v && v.length != _null && !isString(v) && !isNode(v) && !isFunction(v) && v !== _window;
+ }
+
+ // used by IE impl of on() only
+ function push(obj, prop, value) {
+ (obj[prop] = (obj[prop] || [])).push(value);
+ }
+ // used by IE impl of on()/off() only
+ function removeFromArray(array, value) {
+ for (var i = 0; array && i < array.length; i++)
+ if (array[i] === value)
+ array['splice'](i--, 1);
+ }
+
+ function extractNumber(v) {
+ return parseFloat(replace(v, /^[^\d-]+/));
+ }
+
+ // retrieves the node id of the element, create one if needed.
+ function getNodeId(el) {
+ return (el[MINIFIED_MAGIC_NODEID] = (el[MINIFIED_MAGIC_NODEID] || ++idSequence));
+ }
+
+ // collect variant that filters out duplicate nodes from the given list, returns a new array
+ function collectUniqNodes(list, func) {
+ var result = [];
+ var nodeIds = {};
+ var currentNodeId;
+
+ flexiEach(list, function(value) {
+ flexiEach(func(value), function(node) {
+ if (!nodeIds[currentNodeId = getNodeId(node)]) {
+ result.push(node);
+ nodeIds[currentNodeId] = true;
+ }
+ });
+ });
+ return result;
+ }
+
+ // finds out the 'natural' height of the first element, the one if $$slide=1
+ function getNaturalHeight(elementList, factor) {
+ var q = {'$position': 'absolute', '$visibility': 'hidden', '$display': 'block', '$height': _null};
+ var oldStyles = elementList['get'](q);
+ var h = elementList['set'](q)['get']('clientHeight');
+ elementList['set'](oldStyles);
+ return h*factor + 'px';
+ }
+
+
+
+
+ // @condblock !ie8compatibility
+ function on(subSelector, eventSpec, handler, args, bubbleSelector) {
+ if (isFunction(eventSpec))
+ return this['on'](_null, subSelector, eventSpec, handler, args);
+ else if (isString(args))
+ return this['on'](subSelector, eventSpec, handler, _null, args);
+ else
+ return this['each'](function(baseElement, index) {
+ flexiEach(subSelector ? dollarRaw(subSelector, baseElement) : baseElement, function(registeredOn) {
+ flexiEach(toString(eventSpec).split(/\s/), function(namePrefixed) {
+ var name = replace(namePrefixed, /[?|]/g);
+ var prefix = replace(namePrefixed, /[^?|]/g);
+ var capture = (name == 'blur' || name == 'focus') && !!bubbleSelector; // bubble selectors for 'blur' and 'focus' registered as capuring!
+ var triggerId = idSequence++;
+
+ // returns true if processing should be continued
+ function triggerHandler(eventName, event, target) {
+ var match = !bubbleSelector;
+ var el = bubbleSelector ? target : registeredOn;
+ if (bubbleSelector) {
+ var selectorFilter = getFilterFunc(bubbleSelector, registeredOn);
+ while (el && el != registeredOn && !(match = selectorFilter(el)))
+ el = el['parentNode'];
+ }
+ return (!match) || (name != eventName) || ((handler.apply($(el), args || [event, index]) && prefix=='?') || prefix == '|');
+ };
+
+ function eventHandler(event) {
+ if (!triggerHandler(name, event, event['target'])) {
+ event['preventDefault']();
+ event['stopPropagation']();
+ }
+ };
+
+ registeredOn.addEventListener(name, eventHandler, capture);
+
+ if (!registeredOn['M'])
+ registeredOn['M'] = {};
+ registeredOn['M'][triggerId] = triggerHandler; // to be called by trigger()
+
+ handler['M'] = collector(flexiEach, [handler['M'], function () { // this function will be called by off()
+ registeredOn.removeEventListener(name, eventHandler, capture);
+ delete registeredOn['M'][triggerId];
+ }], nonOp);
+
+ });
+ });
+ });
+ }
+ // @condend !ie8compatibility
+
+
+ // @condblock !ie8compatibility
+ function off(handler) {
+ callList(handler['M']);
+ handler['M'] = _null;
+ }
+ // @condend !ie8compatibility
+
+ // for remove & window.unload, IE only
+ function detachHandlerList(dummy, handlerList) {
+ flexiEach(handlerList, function(h) {
+ h.element.detachEvent('on'+h.eventType, h.handlerFunc);
+ });
+ }
+
+ function ready(handler) {
+ if (DOMREADY_HANDLER)
+ DOMREADY_HANDLER.push(handler);
+ else
+ setTimeout(handler, 0);
+ }
+
+ function $$(selector, context, childrenOnly) {
+ return dollarRaw(selector, context, childrenOnly)[0];
+ }
+
+ function EE(elementName, attributes, children) {
+ var e = $(document.createElement(elementName));
+ // @condblock UTIL
+ // this attributes != null check is only required with Util's isObject() implementation. Web's isObject() is simpler.
+ return (isList(attributes) || (attributes != _null && !isObject(attributes)) ) ? e['add'](attributes) : e['set'](attributes)['add'](children);
+ // @condend UTIL
+ // @cond !UTIL return (isList(attributes) || (!isObject(attributes)) ) ? e['add'](attributes) : e['set'](attributes)['add'](children);
+ }
+
+ function clone(listOrNode) {
+ return collector(flexiEach, listOrNode, function(e) {
+ var c;
+ if (isList(e))
+ return clone(e);
+ else if (isNode(e)) {
+ c = e['cloneNode'](true);
+ c['removeAttribute'] && c['removeAttribute']('id');
+ return c;
+ }
+ else
+ return e;
+ });
+ }
+
+ /*$
+ * @stop
+ */
+
+ function $(selector, context, childOnly) {
+ // @condblock ready
+ return isFunction(selector) ? ready(selector) : new M(dollarRaw(selector, context, childOnly));
+ // @condend
+ // @cond !ready return new M(dollarRaw(selector, context));
+ }
+
+ // implementation of $ that does not produce a Minified list, but just an array
+
+
+
+
+
+
+
+
+
+
+ // @condblock !ie7compatibility
+ function dollarRaw(selector, context, childOnly) {
+ function flatten(a) { // flatten list, keep non-lists, remove nulls
+ return isList(a) ? collector(flexiEach, a, flatten) : a;
+ }
+ function filterElements(list) { // converts into array, makes sure context is respected
+ return filter(collector(flexiEach, list, flatten), function(node) {
+ var a = node;
+ while (a = a['parentNode'])
+ if (a == context[0] || childOnly)
+ return a == context[0];
+ // fall through to return undef
+ });
+ }
+
+ if (context) {
+ if ((context = dollarRaw(context)).length != 1)
+ return collectUniqNodes(context, function(ci) { return dollarRaw(selector, ci, childOnly);});
+ else if (isString(selector)) {
+ if (isNode(context[0]) != 1)
+ return [];
+ else
+ return childOnly ? filterElements(context[0].querySelectorAll(selector)) : context[0].querySelectorAll(selector);
+ }
+ else
+ return filterElements(selector);
+
+ }
+ else if (isString(selector))
+ return document.querySelectorAll(selector);
+ else
+ return collector(flexiEach, selector, flatten);
+ };
+ // @condend !ie7compatibility
+
+ // If context is set, live updates will be possible.
+ // Please note that the context is not evaluated for the '*' and 'tagname.classname' patterns, because context is used only
+ // by on(), and in on() only nodes in the right context will be checked
+ function getFilterFunc(selector, context) {
+ function wordRegExpTester(name, prop) {
+ var re = RegExp('(^|\\s+)' + name + '(?=$|\\s)', 'i');
+ return function(obj) {return name ? re.test(obj[prop]) : true;};
+ }
+
+ var nodeSet = {};
+ var dotPos = nodeSet;
+ if (isFunction(selector))
+ return selector;
+ else if (isNumber(selector))
+ return function(v, index) { return index == selector; };
+ else if (!selector || selector == '*' ||
+ (isString(selector) && (dotPos = /^([\w-]*)\.?([\w-]*)$/.exec(selector)))) {
+ var nodeNameFilter = wordRegExpTester(dotPos[1], 'tagName');
+ var classNameFilter = wordRegExpTester(dotPos[2], 'className');
+ return function(v) {
+ return isNode(v) == 1 && nodeNameFilter(v) && classNameFilter(v);
+ };
+ }
+ else if (context)
+ return function(v) {
+ return $(selector, context)['find'](v)!=_null; // live search instead of node set, for on()
+ };
+ else {
+ $(selector)['each'](function(node) {
+ nodeSet[getNodeId(node)] = true;
+ });
+ return function(v) {
+ return nodeSet[getNodeId(v)];
+ };
+ }
+ }
+
+ function getInverseFilterFunc(selector) {
+ var f = getFilterFunc(selector);
+ return function(v) {return f(v) ? _null : true;};
+ }
+ ///#/snippet webFunctions
+
+ ///#snippet extrasFunctions
+ function flexiEach(list, cb) {
+ if (isList(list))
+ each(list, cb);
+ else if (list != _null)
+ cb(list, 0);
+ return list;
+ }
+
+ function Promise() {
+ this['state'] = null;
+ this['values'] = [];
+ this['parent'] = null;
+ }
+
+ /*$
+ * @id promise
+ * @name _.promise()
+ * @syntax _.promise()
+ * @syntax _.promise(otherPromises...)
+ * @module WEB+UTIL
+ *
+ * Creates a new ##promiseClass#Promise##, optionally assimilating other promises. If no other promise is given,
+ * a fresh new promise is returned.
+ *
+ * The returned promise provides the methods ##fulfill() and ##reject() that can be called directly to change the promise's state,
+ * as well as the more powerful ##fire().
+ *
+ * If one promise is given as parameter, the new promise assimilates the given promise as-is, and just forwards
+ * fulfillment and rejection with the original values.
+ *
+ * If more than one promise are given, it will assimilate all of them with slightly different rules:
+ * <ul><li>the new promise is fulfilled if all assimilated promises have been fulfilled. The fulfillment values
+ * of all assimilated promises are given to the handler as arguments. Note that the fulfillment values themselves are always
+ * arrays, as a promise can have several fulfillment values in Minified's implementation.</li>
+ * <li>when one of the promises is rejected, the new promise is rejected immediately. The rejection handler gets the
+ * promises rejection value (first argument if it got several) as first argument, an array of the result values
+ * of all promises as a second (that means one array of arguments for each promise), and the index of the failed
+ * promise as third.
+ * </li></ul>
+ *
+ * @example A simple promise that is fulfilled after 1 second, using Minified's invocation syntax:
+ * <pre>var p = _.promise();
+ * setTimeout(function() {
+ * p.fire(true);
+ * }, 1000);
+ * </pre>
+ *
+ * @example Request three files in parallel. When all three have been downloaded, concatenate them into a single string.
+ * <pre>
+ * var files = _('fileA.txt', 'fileA.txt', 'fileC.txt');
+ * var content;
+ * _.promise(files.map(function(file) {
+ * return $.request('get', '/txts/' + file);
+ * })).then(function(fileRslt1, fileRslt2, fileRslt3) {
+ * content = _(fileRslt1, fileRslt2, fileRslt3).map( function(result) { return result[0]; }).join('');
+ * }).error(function(status, response, xhr, url) {
+ * alert('failed to load file '+url);
+ * });
+ * </pre>
+ *
+ * @param otherPromises one or more promises to assimilate (varargs). You can also pass lists of promises.
+ * @return the new promise.
+ */
+ function promise() {
+ var deferred = []; // this function calls the functions supplied by then()
+
+ var assimilatedPromises = arguments;
+ var assimilatedNum = assimilatedPromises.length;
+ var numCompleted = 0; // number of completed, assimilated promises
+ var rejectionHandlerNum = 0;
+
+ var obj = new Promise();
+
+ obj['errHandled'] = function() {
+ rejectionHandlerNum++;
+ if (obj['parent'])
+ obj['parent']['errHandled']();
+ };
+
+ /*$
+ * @id fire
+ * @name promise.fire()
+ * @syntax _.fire(newState)
+ * @syntax _.fire(newState, values)
+ * @module WEB+UTIL
+ *
+ * Changes the state of the promise into either fulfilled or rejected. This will also notify all ##then() handlers. If the promise
+ * already has a state, the call will be ignored.
+ *
+ * <var>fire()</var> can be invoked as a function without context ('this'). Every promise has its own instance.
+ *
+ * @example A simple promise that is fulfilled after 1 second, using Minified's invocation syntax:
+ * <pre>var p = _.promise();
+ * setTimeout(function() {
+ * p.fire(true, []);
+ * }, 1000);
+ * </pre>
+ *
+ * @example Call <var>fire()</var> without a context:
+ * <pre>var p = _.promise(function(resolve, reject) {
+ * setTimeout(resolve.fire, 1000);
+ * });
+ * </pre>
+ *
+ * @param newState <var>true</var> to set the Promise to fulfilled, <var>false</var> to set the state as rejected. If you pass <var>null</var> or
+ * <var>undefined</var>, the promise's state does not change.
+ * @param values optional an array of values to pass to ##then() handlers as arguments. You can also pass a non-list argument, which will then
+ * be passed as only argument.
+ * @return the promise
+ */
+ var fire = obj['fire'] = function(newState, newValues) {
+ if (obj['state'] == null && newState != null) {
+ obj['state'] = !!newState;
+ obj['values'] = isList(newValues) ? newValues : [newValues];
+ setTimeout(function() {
+ each(deferred, function(f) {f();});
+ }, 0);
+ }
+ return obj;
+ };
+
+ // use promise varargs
+ each(assimilatedPromises, function assimilate(promise, index) {
+ try {
+ if (promise['then'])
+ promise['then'](function(v) {
+ var then;
+ if ((isObject(v) || isFunction(v)) && isFunction(then = v['then']))
+ assimilate(v, index);
+ else {
+ obj['values'][index] = array(arguments);
+ if (++numCompleted == assimilatedNum)
+ fire(true, assimilatedNum < 2 ? obj['values'][index] : obj['values']);
+ }
+ },
+ function(e) {
+ obj['values'][index] = array(arguments);
+ fire(false, assimilatedNum < 2 ? obj['values'][index] : [obj['values'][index][0], obj['values'], index]);
+ });
+ else
+ promise(function() {fire(true, array(arguments));}, function() {fire(false, array(arguments)); });
+ }
+ catch (e) {
+ fire(false, [e, obj['values'], index]);
+ }
+ });
+
+ /*$
+ * @id stop
+ * @name promise.stop()
+ * @syntax promise.stop()
+ * @module WEB+UTIL
+ * Stops an ongoing operation, if supported. Currently the only promises supporting this are those returned by ##request(), ##animate(), ##wait() and
+ * ##asyncEach().
+ * stop() invocation will be propagated over promises returned by ##then() and promises assimilated by ##promise(). You only need to invoke stop
+ * with the last promise, and all dependent promises will automatically stop as well.
+ *
+ * <var>stop()</var> can be invoked as a function without context ('this'). Every promise has its own instance.
+ *
+ * @return In some cases, the <var>stop()</var> can return a value. This is currently only done by ##animate() and ##wait(), which will return the actual duration.
+ * ##asyncEach()'s promise will also return any value it got from the promise that it stopped.
+ *
+ * @example Animation chain that can be stopped.
+ * <pre>
+ * var div = $('#myMovingDiv').set({$left: '0px', $top: '0px'});
+ * var prom = div.animate({$left: '200px', $top: '0px'}, 600, 0)
+ * .then(function() {
+ * return _.promise(div.animate({$left: '200px', $top: '200px'}, 800, 0),
+ * div.animate({$backgroundColor: '#f00'}, 200));
+ * }).then(function() {
+ * return div.animate({$left: '100px', $top: '100px'}, 400);
+ * });
+ *
+ * $('#stopButton').on('click', prom.stop);
+ * </pre>
+ */
+ obj['stop'] = function() {
+ each(assimilatedPromises, function(promise) {
+ if (promise['stop'])
+ promise['stop']();
+ });
+
+ return obj['stop0'] && call(obj['stop0']);
+ };
+
+ /*$
+ * @id then
+ * @name promise.then()
+ * @syntax promise.then()
+ * @syntax promise.then(onSuccess)
+ * @syntax promise.then(onSuccess, onError)
+ *
+ * @module WEB
+ * Registers two callbacks that will be invoked when the ##promise#Promise##'s asynchronous operation finished
+ * successfully (<var>onSuccess</var>) or an error occurred (<var>onError</var>). The callbacks will be called after
+ * <var>then()</var> returned, from the browser's event loop.
+ * You can chain <var>then()</var> invocations, as <var>then()</var> returns another Promise object that you can attach to.
+ *
+ * The full distribution of Minified implements the Promises/A+ specification, allowing interoperability with other Promises frameworks.
+ *
+ * <strong>Note:</strong> If you use the Web module, you will get a simplified Promises implementation that cuts some corners. The most notable
+ * difference is that when a <code>then()</code> handler throws an exception, this will not be caught and the promise returned by
+ * <code>then</code> will not be automatically rejected.
+ *
+ * @example Simple handler for an HTTP request. Handles only success and ignores errors.
+ * <pre>
+ * $.request('get', '/weather.html')
+ * .then(function(txt) {
+ * alert('Got response!');
+ * });
+ * </pre>
+ *
+ * @example Including an error handler.
+ * <pre>
+ * $.request('get', '/weather.html')
+ * .then(function(txt) {
+ * alert('Got response!');
+ * }, function(err) {
+ * alert('Error!');
+ * }));
+ * </pre>
+ *
+ * @example Chained handler.
+ * <pre>
+ * $.request('get', '/weather.do')
+ * .then(function(txt) {
+ * showWeather(txt);
+ * }
+ * .then(function() {
+ * return $.request('get', '/traffic.do');
+ * }
+ * .then(function(txt) {
+ * showTraffic(txt);
+ * }
+ * .then(function() {
+ * alert('All result displayed');
+ * }, function() {
+ * alert('An error occurred');
+ * });
+ * </pre>
+ *
+ * @param onSuccess optional a callback function to be called when the operation has been completed successfully. The exact arguments it receives depend on the operation.
+ * If the function returns a ##promise#Promise##, that Promise will be evaluated to determine the state of the promise returned by <var>then()</var>. If it returns any other value, the
+ * returned Promise will also succeed. If the function throws an error, the returned Promise will be in error state.
+ * Pass <var>null</var> or <var>undefined</var> if you do not need the success handler.
+ * @param onError optional a callback function to be called when the operation failed. The exact arguments it receives depend on the operation. If the function returns a ##promise#Promise##, that promise will
+ * be evaluated to determine the state of the Promise returned by <var>then()</var>. If it returns anything else, the returned Promise will
+ * have success status. If the function throws an error, the returned Promise will be in the error state.
+ * You can pass <var>null</var> or <var>undefined</var> if you do not need the error handler.
+ * @return a new ##promise#Promise## object. If you specified a callback for success or error, the new Promises's state will be determined by that callback if it is called.
+ * If no callback has been provided and the original Promise changes to that state, the new Promise will change to that state as well.
+ */
+ var then = obj['then'] = function (onFulfilled, onRejected) {
+ var promise2 = promise();
+ var callCallbacks = function() {
+ try {
+ var f = (obj['state'] ? onFulfilled : onRejected);
+ if (isFunction(f)) {
+ (function resolve(x) {
+ try {
+ var then, cbCalled = 0;
+ if ((isObject(x) || isFunction(x)) && isFunction(then = x['then'])) {
+ if (x === promise2)
+ throw new TypeError();
+ then.call(x, function(x) { if (!cbCalled++) resolve(x); }, function(value) { if (!cbCalled++) promise2['fire'](false, [value]);});
+ promise2['stop0'] = x['stop'];
+ }
+ else
+ promise2['fire'](true, [x]);
+ }
+ catch(e) {
+ if (!(cbCalled++)) {
+ promise2['fire'](false, [e]);
+ if (!rejectionHandlerNum)
+ throw e;
+ }
+ }
+ })(call(f, undef, obj['values']));
+ }
+ else
+ promise2['fire'](obj['state'], obj['values']);
+ }
+ catch (e) {
+ promise2['fire'](false, [e]);
+ if (!rejectionHandlerNum)
+ throw e;
+ }
+ };
+ if (isFunction(onRejected))
+ obj['errHandled']();
+ promise2['stop0'] = obj['stop'];
+ promise2['parent'] = obj;
+ if (obj['state'] != null)
+ setTimeout(callCallbacks, 0);
+ else
+ deferred.push(callCallbacks);
+ return promise2;
+ };
+
+ /*$
+ * @id always
+ * @group REQUEST
+ * @name promise.always()
+ * @syntax promise.always(callback)
+ * @configurable default
+ * @module WEB+UTIL
+ * Registers a callback that will always be called when the ##promise#Promise##'s operation ended, no matter whether the operation succeeded or not.
+ * This is a convenience function that will call ##then() with the same function for both arguments. It shares all of its semantics.
+ *
+ * @example Simple handler for a HTTP request.
+ * <pre>
+ * $.request('get', '/weather.html')
+ * .always(function() {
+ * alert('Got response or error!');
+ * });
+ * </pre>
+ *
+ * @param callback a function to be called when the operation has been finished, no matter what its result was. The exact arguments depend on the operation and may
+ * vary depending on whether it succeeded or not. If the function returns a ##promise#Promise##, that Promise will
+ * be evaluated to determine the state of the returned Promise. If provided and it returns regularly, the returned promise will
+ * have success status. If it throws an error, the returned Promise will be in the error state.
+ * @return a new ##promise#Promise## object. Its state is determined by the callback.
+ */
+ obj['always'] = function(func) { return then(func, func); };
+
+ /*$
+ * @id error
+ * @group REQUEST
+ * @name promise.error()
+ * @syntax promise.error(callback)
+ * @configurable default
+ * @module WEB, UTIL
+ * Registers a callback that will be called when the operation failed.
+ * This is a convenience function that will invoke ##then() with only the second argument set. It shares all of its semantics.
+ *
+ * @example Simple handler for a HTTP request.
+ * <pre>
+ * $.request('get', '/weather.html')
+ * .error(function() {
+ * alert('Got error!');
+ * });
+ * </pre>
+ *
+ * @param callback a function to be called when the operation has failed. The exact arguments depend on the operation. If the function returns a ##promise#Promise##, that Promise will
+ * be evaluated to determine the state of the returned Promise. If it returns regularly, the returned Promise will
+ * have success status. If it throws an error, the returned Promise will be in error state.
+ * @return a new ##promise#Promise## object. Its state is determined by the callback.
+ */
+ obj['error'] = function(func) { return then(0, func); };
+
+ return obj;
+ }
+
+ ///#/snippet extrasFunctions
+ ///#snippet extrasDocs
+ /*$
+ * @id length
+ * @group SELECTORS
+ * @requires dollar
+ * @name list.length
+ * @syntax length
+ * @module WEB, UTIL
+ *
+ * Contains the number of elements in the ##list#Minified list##.
+ *
+ * @example With Web module:
+ * <pre>
+ * var list = $('input');
+ * var myValues = {};
+ * for (var i = 0; i < list.length; i++)
+ * myValues[list[i].name] = list[i].value;
+ * </pre>
+ *
+ * @example With Util module:
+ * <pre>
+ * var list = _(1, 2, 3);
+ * var sum = 0;
+ * for (var i = 0; i < list.length; i++)
+ * sum += list[i];
+ * </pre>
+ */
+ /*$
+ * @stop
+ */
+ ///#/snippet extrasDocs
+
+ ///#snippet utilM
+
+ /*
+ * syntax: M(list, assimilateSublists)
+ * M(null, singleElement)
+ *
+ *
+ */
+ /** @constructor */
+ function M(list, assimilateSublists) {
+ var self = this, idx = 0;
+ if (list)
+ for (var i = 0, len = list.length; i < len; i++) {
+ var item = list[i];
+ if (assimilateSublists && isList(item))
+ for (var j = 0, len2 = item.length; j < len2; j++)
+ self[idx++] = item[j];
+ else
+ self[idx++] = item;
+ }
+ else
+ self[idx++] = assimilateSublists;
+
+ self['length'] = idx;
+ self['_'] = true;
+ }
+
+ function _() {
+ return new M(arguments, true);
+ }
+
+ ///#/snippet utilM
+
+ //// LIST FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ copyObj({
+ ///#snippet utilListFuncs
+ /*$
+ * @id each
+ * @group LIST
+ * @requires
+ * @configurable default
+ * @name .each()
+ * @altname _.each()
+ * @syntax list.each(callback)
+ * @syntax list.each(callback, ctx)
+ * @syntax _.each(list, callback)
+ * @syntax _.each(list, callback, ctx)
+ * @module UTIL, WEB
+ * Invokes the given function once for each item in the list. The function will be called with the item as first parameter and
+ * the zero-based index as second. Unlike JavaScript's built-in <var>forEach()</var> it will be invoked for each item in the list,
+ * even if it is <var>undefined</var>.
+ *
+ * @example Creates the sum of all list entries.
+ * <pre>
+ * var sum = 0;
+ * _(17, 4, 22).each(function(item, index) {
+ * sum += item;
+ * });
+ * </pre>
+ *
+ * @example The previous example with a native array:
+ * <pre>
+ * var sum = 0;
+ * _.each([17, 4, 22], function(item, index) {
+ * sum += item;
+ * });
+ * </pre>
+ *
+ * @example This goes through all h2 elements of the class 'section' on a web page and changes their content:
+ * <pre>
+ * $('h2.section').each(function(item, index) {
+ * item.innerHTML = 'Section ' + index + ': ' + item.innerHTML;
+ * });
+ * </pre>
+ *
+ * @param list a list to iterate. Can be an array, a ##list#Minified list## or any other array-like structure with
+ * <var>length</var> property.
+ * @param callback The callback <code>function(item, index)</code> to invoke for each list element.
+ * <dl><dt>item</dt><dd>The current list element.</dd>
+ * <dt>index</dt><dd>The second the zero-based index of the current element.</dd>
+ * <dt class="this">this</dt><dd>The given context if not null. Otherwise the list.</dd>
+ * The callback's return value will be ignored.
+ * @param ctx optional a context to pass to the callback as 'this'. Only supported in UTIL module.
+ * @return the list
+ *
+ * @see ##per() works like <var>each()</var>, but wraps the list elements in a list.
+ * @see ##find() can be used instead of <var>each()</var> if you need to abort the loop.
+ * @see ##eachObj() iterates through the properties of an object.
+ */
+ 'each': listBind(each),
+
+ /*$
+ * @id equals
+ * @group LIST
+ * @requires
+ * @configurable default
+ * @name .equals()
+ * @altname _.equals()
+ * @syntax list.equals(otherObject)
+ * @syntax _.equals(thisObject, otherObject)
+ * @module UTIL
+ * Checks whether two values, lists or objects are equal in a deep comparison.
+ *
+ * First <var>equals()</var> checks whether it got a function as parameter.
+ * If yes, it will be invoked without arguments and <var>equals()</var> calls itself recursively with the function's result.
+ *
+ * Once both values are no functions anymore, the values will be evaluated, If the first value is...
+ * <ul><li>...<var>null</var> or <var>undefined</var>, they are only equal if the other one is also either <var>null</var> or <var>undefined</var>.</li>
+ * <li>...a value as defined by ##_.isValue(), but not a Date, they are equal if the other value is the same type and is equal according to the '==' operator.</li>
+ * <li>...a Date, they are equal if the other value is a Date representing the same time.</li>
+ * <li>...a list or array, they are equal if the other value is also either a list or an array, has the same number of items and all items equal the items of the other
+ * list at the same position. The equality of list items is determined recursively using the same rules, so you can also nest lists.</li>
+ * <li>...a function, it will be invoked without arguments and its return value is evaluated using these rules as if the value has been passed. </li>
+ * <li>...any other object, they are equal if they contain exactly the same keys (as defined by ##_.eachObj()) and all values are equal as determined using these rules
+ * recursively.</li>
+ * </ul>
+ *
+ * Please note that, according to the rules, a ##list#Minified list## is equal to an array, as long as their content is equal. <var>equals</var> does not
+ * differentiate between <var>null</var> and <var>undefined</var>.
+ *
+ * <var>equals</var> is commutative. If you swap the parameters, the result is the same as long as no functions are involved.
+ *
+ * @example Compare a list and an array:
+ * <pre>
+ * _.equals([1, 2, 3], _(1, 2, 3)); // returns true
+ * </pre>
+ *
+ * @example Same result, but with a list method:
+ * <pre>
+ * _(1, 2, 3).equals([1, 2, 3]); // returns true
+ * </pre>
+ *
+ * @param thisObject The first reference to evaluate.
+ * @param otherObject The second reference to evaluate.
+ * @return true if both references are equal. False otherwise.
+ */
+ 'equals': listBind(equals),
+
+ /*$
+ * @id find
+ * @group LIST
+ * @requires
+ * @configurable default
+ * @name .find()
+ * @altname _.find()
+ * @syntax list.find(findFunc)
+ * @syntax list.find(element)
+ * @syntax list.find(findFunc, startIndex)
+ * @syntax list.find(element, startIndex)
+ * @syntax _.find(list, findFunc)
+ * @syntax _.find(list, element)
+ * @syntax _.find(list, findFunc, startIndex)
+ * @syntax _.find(list, element, startIndex)
+ * @module WEB, UTIL
+ * Finds a specific value in the list. There are two ways of calling <var>find()</var>:
+ * <ol>
+ * <li>With a value as argument. Then <var>find()</var> will search for the first occurrence of an identical value in the list,
+ * using the '===' operator for comparisons, and return the index. If it is not found,
+ * <var>find()</var> returns <var>undefined</var>.</li>
+ * <li>With a callback function. <var>find()</var> will then call the given function for each list element until the function
+ * returns a value that is not <var>null</var> or <var>undefined</var>. This value will be returned.</li>
+ * </ol>
+ *
+ * <var>find()</var> can also be used as an alternative to ##each() if you need to abort the loop.
+ *
+ * @example Finds the first negative number in the list:
+ * <pre>
+ * var i = _(1, 2, -4, 5, 2, -1).find(function(value, index) { if (value < 0) return index; }); // returns 2
+ * </pre>
+
+ * @example Finds the index of the first 5 in the array:
+ * <pre>
+ * var i = _.find([3, 6, 7, 6, 5, 4, 5], 5); // returns 4 (index of first 5)
+ * </pre>
+ *
+ * @example Determines the position of the element with the id '#wanted' among all li elements:
+ * <pre>
+ * var elementIndex = $('li').find($$('#wanted'));
+ * </pre>
+ *
+ * @example Goes through the elements to find the first div that has the class 'myClass', and returns this element:
+ * <pre>
+ * var myClassElement = $('div').find(function(e) { if ($(e).is('.myClass')) return e; });
+ * </pre>
+ *
+ * @param list A list to use as input. Can be an array, a ##list#Minified list## or any other array-like structure with
+ * <var>length</var> property.
+ * @param findFunc The callback <code>function(item, index)</code> that will be invoked for every list item until it returns a non-null value:
+ * <dl><dt>item</dt><dd>The current list element.</dd><dt>index</dt><dd>The second the zero-based index of the current element.</dd>
+ * <dt class="this">this</dt><dd>This list.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>If the callback returns something other than <var>null</var> or
+ * <var>undefined</var>, <var>find()</var> will return it directly. Otherwise it will continue. </dd></dl>
+ * @param element the element to search for
+ * @param startIndex optional the 0-based index of the first element to search.
+ * @return if called with an element, either the element's index in the list or <var>undefined</var> if not found. If called with a callback function,
+ * it returns either the value returned by the callback or <var>undefined</var>.
+ *
+ * @see ##findLast() is the equivalent to <var>find()</var> for the list's end.
+ */
+ 'find': listBind(find),
+
+ /*$
+ * @stop
+ */
+ dummySort:0
+ ,
+ ///#/snippet utilListFuncs
+ ///#snippet webListFuncs
+
+ /*$
+ * @id select
+ * @group SELECTORS
+ * @requires dollar
+ * @configurable default
+ * @name .select()
+ * @syntax list.select(selector)
+ * @syntax list.select(selector, childrenOnly)
+ * @module WEB
+ * Executes a selector with the list as context. <code>list.select(selector, childrenOnly)</code> is equivalent
+ * to <code>$(selector, list, childrenOnly)</code>.
+ *
+ * @example Returns a list of all list elements:
+ * <pre>
+ * var parents = $('ol.myList').select('li', true);
+ * </pre>
+ *
+ * @example Returns a list of all child elements:
+ * <pre>
+ * var children = $('.myElements').select('*', true);
+ * </pre>
+ *
+ * @param selector a selector or any other valid first argument for #dollar#$().
+ * @param childrenOnly optional if set, only direct children of the context nodes are included in the list. Children of children will be filtered out. If omitted or not
+ * true, all descendants of the context will be included.
+ * @return the new list containing the selected descendants.
+ *
+ * @see ##only() executes a selector on the list elements, instead of their descendants.
+ */
+ 'select': function(selector, childOnly) {
+ return $(selector, this, childOnly);
+ },
+
+ /*$
+ * @id get
+ * @group SELECTORS
+ * @requires dollar
+ * @configurable default
+ * @name .get()
+ * @syntax list.get(name)
+ * @syntax list.get(name, toNumber)
+ * @syntax list.get(list)
+ * @syntax list.get(list, toNumber)
+ * @syntax list.get(map)
+ * @syntax list.get(map, toNumber)
+ * @module WEB
+ * Retrieves properties, attributes and styles from the list's first element. The syntax to request those values is mostly identical with ##set(). You can either
+ * get a single value if you specify only one name, or get an object map when you specify several names using an array or an object map.
+ *
+ * The <var>name</var> parameter defines what kind of data you are reading. The following name schemes are supported:
+ * <table>
+ * <tr><th>Name Schema</th><th>Example</th><th>Sets what?</th><th>Description</th></tr>
+ * <tr><td>name</td><td>innerHTML</td><td>Property</td><td>A name without prefix of '$' or '@' gets a property of the object.</td></tr>
+ * <tr><td>@name</td><td>@href</td><td>Attribute</td><td>Gets the HTML attribute using getAttribute().</td></tr>
+ * <tr><td>%name</td><td>%phone</td><td>Data-Attribute</td><td>Gets a data attribute using getAttribute(). Data attributes are
+ * attributes whose names start with 'data-'. '%myattr' and '@data-myattr' are equivalent.</td></tr>
+ * <tr><td>$name</td><td>$fontSize</td><td>CSS Property</td><td>Gets a style using the element's <var>style</var> object.
+ * The syntax for the CSS styles is camel-case (e.g. "$backgroundColor", not "$background-color"). Shorthand properties like "border" or "margin" are
+ * not supported. You must use the full name, e.g. "$marginTop". Minified will try to determine the effective style
+ * and thus will return the value set in style sheets if not overwritten using a regular style.</td></tr>
+ * <tr><td>$</td><td>$</td><td>CSS Classes</td><td>A simple <var>$</var> returns the CSS classes of the element and is identical with "className".</td></tr>
+ * <tr><td>$$</td><td>$$</td><td>Style</td><td>Reads the element's style attribute in a browser-independent way. On legacy IEs it uses
+ * <var>style.cssText</var>, and on everything else just the "style" attribute.</td></tr>
+ * <tr><td>$$show</td><td>$$show</td><td>Show/Hide</td><td>Returns 1 if the element is visible and 0 if it is not visible. An element counts as
+ * visible if '$visibility' is not 'hidden' and '$display' is not 'none'. Other properties will be ignored, even if they can also be used to hide the element.</td></tr>
+ * <tr><td>$$fade</td><td>$$fade</td><td>Fade Effect</td><td>The name '$$fade' returns the opacity of the element as a value between 0 and 1.
+ * '$$fade' will also automatically evaluate the element's 'visibility' and 'display' styles to find out whether the element is actually visible.</td></tr>
+ * <tr><td>$$slide</td><td>$$slide</td><td>Slide Effect</td><td>'$$slide' returns the height of the element in pixels with a 'px' suffix and is equivalent to '$height'.
+ * Please note that you can pass that 'px' value to '$$slide' in ##set(), which will then set the according '$height'.</td></tr>
+ * <tr><td>$$scrollX, $$scrollY</td><td>$$scrollY</td><td>Scroll Coordinates</td><td>The names '$$scrollX' and
+ * '$$scrollY' can be used on <code>$(window)</code> to retrieve the scroll coordinates of the document.
+ * The coordinates are specified in pixels without a 'px' unit postfix.</td></tr>
+ * </table>
+ *
+ * @example Retrieves the id, title attribute and the background color of the element '#myElement':
+ * <pre>
+ * var id = $('#myElement).get('id');
+ * var title = $('#myElement).get('@title');
+ * var bgColor = $('#myElement).get('$backgroundColor');
+ * </pre>
+ *
+ * @example Retrieves the id, title attribute and the background color of the element '#myElement' as a map:
+ * <pre>
+ * var m = $('#myElement).get(['id', '@title', '$backgroundColor']);
+ * var id = m.id;
+ * var title = m['@title'];
+ * var bgColor = m.$backgroundColor;
+ * </pre>
+ *
+ * @example Uses ##get() and ##set() to reposition an element:
+ * <pre>
+ * var coords = $('#myElement').get({$top: 0, $left: 0}, true);
+ * coords.$top = coords.$top + 10 + 'px';
+ * coords.$left = coords.$left + 20 + 'px';
+ * $('#myElement').set(coords);
+ * </pre>
+ * Please note that the values of $top and $left in the <var>get()</var> invocation do not matter and will be ignored!
+ *
+ * @param name the name of a single property or attribute to modify. Unprefixed names set properties, a '$' prefix sets CSS styles and
+ * '@' sets attributes. Please see the table above for special properties and other options.
+ * @param list in order to retrieve more than one value, you can specify several names in an array or list. <var>get()</var> will then return an object map
+ * containing the values.
+ * @param map if you specify an object that is neither list nor string, <var>get()</var> will use it as a map of property names. Each property name will be requested.
+ * The values of the properties in the map will be ignored. <var>get()</var> will then return a new object map containing of results.
+ * @param toNumber if 'true', <var>get()</var> converts all returned values into numbers. If they are strings,
+ * <var>get()</var> removes any non-numeric characters before the conversion. This is useful when you request
+ * a CSS property such as '$marginTop' that returns a value with a unit suffix, like "21px". <var>get()</var> will convert it
+ * into a number and return 21. If the returned value is not parsable as a number, <var>NaN</var> will be returned.
+ * @return if <var>get()</var> was called with a single name, it returns the corresponding value.
+ * If a list or map was given, <var>get()</var> returns a new object map with the names as keys and the values as values.
+ * It returns <var>undefined</var> if the list is empty.
+ *
+ * @see ##set() sets values using the same property syntax.
+ */
+ 'get': function(spec, toNumber) {
+ var self = this;
+ var element = self[0];
+
+ if (element) {
+ if (isString(spec)) {
+ var match = /^(\W*)(.*)/.exec(replace(spec, /^%/,'@data-'));
+ var prefix = match[1];
+ var s;
+
+ if (getter[prefix])
+ s = getter[prefix](this, match[2]);
+ else if (spec == '$')
+ s = self['get']('className');
+ else if (spec == '$$') {
+ s = self['get']('@style');
+ }
+ else if (spec == '$$slide')
+ s = self['get']('$height');
+ else if (spec == '$$fade' || spec == '$$show') {
+ if (self['get']('$visibility') == 'hidden' || self['get']('$display') == 'none')
+ s = 0;
+ else if (spec == '$$fade') {
+ s =
+ isNaN(self['get']('$opacity', true)) ? 1 : self['get']('$opacity', true);
+ }
+ else // $$show
+ s = 1;
+ }
+ else if (prefix == '$') {
+ s = _window['getComputedStyle'](element, _null)['getPropertyValue'](replace(match[2], /[A-Z]/g, function (match2) { return '-' + match2.toLowerCase(); }));
+ }
+ else if (prefix == '@')
+ s = element.getAttribute(match[2]);
+ else
+ s = element[match[2]];
+ return toNumber ? extractNumber(s) : s;
+ }
+ else {
+ var r = {};
+ (isList(spec) ? flexiEach : eachObj)(spec, function(name) {
+ r[name] = self['get'](name, toNumber);
+ });
+ return r;
+ }
+ }
+ },
+
+ /*$
+ * @id set
+ * @group SELECTORS
+ * @requires dollar get
+ * @configurable default
+ * @name .set()
+ * @syntax list.set(name, value)
+ * @syntax list.set(properties)
+ * @syntax list.set(cssClasses)
+ * @module WEB
+ *
+ * Modifies the list's elements by setting their properties, attributes, CSS styles and/or CSS classes. You can either supply a
+ * single name and value to set only one property, or you can provide an object that contains name/value pairs to describe more than one property.
+ * More complex operations can be accomplished by supplying functions as values. They will then be called for each element that will
+ * be set.
+ *
+ * The <var>name</var> parameter defines what kind of data you are setting. The following name schemes are supported:
+ *
+ * <table>
+ * <tr><th>Name Schema</th><th>Example</th><th>Sets what?</th><th>Description</th></tr>
+ * <tr><td>name</td><td>innerHTML</td><td>Property</td><td>A name without prefix of '$' or '@' sets a property of the object.</td></tr>
+ * <tr><td>@name</td><td>@href</td><td>Attribute</td><td>Sets the HTML attribute using setAttribute(). In order to stay compatible with Internet Explorer 7 and earlier,
+ * you should not set the attributes '@class' and '@style'. Instead use '$' and '$$' as shown below.</td></tr>
+ * <tr><td>%name</td><td>%phone</td><td>Data-Attribute</td><td>Sets a data attribute using setAttribute(). Data attributes are
+ * attributes whose names start with 'data-'. '%myattr' and '@data-myattr' are equivalent.</td></tr>
+ * <tr><td>$name</td><td>$fontSize</td><td>CSS Property</td><td>Sets a style using the element's <var>style</var> object.
+ * The syntax for the CSS styles is camel-case (e.g. "$backgroundColor", not "$background-color"). </td></tr>
+ * <tr><td>$</td><td>$</td><td>CSS Classes</td><td>A simple <var>$</var> modifies the element's CSS classes using the object's <var>className</var> property. The value is a
+ * space-separated list of class names. If prefixed with '-' the class is removed, a '+' prefix adds the class and a class name without prefix toggles the class.
+ * The name '$' can also be omitted if <var>set</var> is called with class names as only argument.</td></tr>
+ * <tr><td>$$</td><td>$$</td><td>Style</td><td>Sets the element's style attribute in a browser-independent way.</td></tr>
+ * <tr><td>$$show</td><td>$$show</td><td>Show/Hide</td><td>If <var>true</var> or a number not 0, it will make sure the element is visible by
+ * making sure '$display' is not 'none' and by setting '$visibility' to 'visible'. Please see ##show() for details. If the value is <var>false</var> or 0, it
+ * will be hidden by setting '$display' to 'none'.</td></tr>
+ * <tr><td>$$fade</td><td>$$fade</td><td>Fade Effect</td><td>The name '$$fade' sets the opacity of the element in a browser-independent way. The value must be a number
+ * between 0 and 1. '$$fade' will also automatically control the element's 'visibility' style. If the value is 0,
+ * the element's visibility will automatically be set to 'hidden'. If the value is larger, the visibility will be set to
+ * 'visible'. '$$fade' only works with block elements.</td></tr>
+ * <tr><td>$$slide</td><td>$$slide</td><td>Slide Effect</td><td>The name '$$slide' allows a vertical slide-out or slide-in effect. The value must be a number
+ * between 0 and 1 and will be used to set the element's '$height'. '$$slide' will also automatically control the element's 'visibility'
+ * style. If the value is 0, the element's visibility will automatically be set to 'hidden'. If the value is larger,
+ * the visibility will be set to 'visible'. '$$slide' only works with block elements and will not set the
+ * element's margin or padding. If you need a margin or padding, you should wrap the elements in a simple <div>.</td></tr>
+ * <tr><td>$$scrollX, $$scrollY</td><td>$$scrollY</td><td>Scroll Coordinates</td><td>The names '$$scrollX' and
+ * '$$scrollY' can be used on <code>$(window)</code> to set the scroll coordinates of the document.
+ * The coordinates are specified in pixels, but must not use a 'px' unit postfix.</td></tr>
+ * </table>
+ *
+ * @example Unchecking checkboxes:
+ * <pre>
+ * $('input.checkbox').set('checked', false);
+ * </pre>
+ *
+ * @example Changing the <var>innerHTML</var> property of an element:
+ * <pre>
+ * $('#toc').set('innerHTML', 'Content');
+ * </pre>
+ *
+ * @example Changing attributes:
+ * <pre>
+ * $('a.someLinks').set('@href', 'http://www.example.com/');
+ * </pre>
+ *
+ * @example Removing attributes:
+ * <pre>
+ * $('a.someLinks').set('@title', null);
+ * </pre>
+ *
+ * @example Changing styles:
+ * <pre>
+ * $('.bigText').set('$fontSize', 'x-large');
+ * </pre>
+ *
+ * @example Adding and removing CSS classes:
+ * <pre>
+ * $('.myElem').set('$', '+myClass -otherClass');
+ * </pre>
+ *
+ * @example Toggling a CSS class:
+ * <pre>
+ * $('.myElem').set('$', 'on');
+ * </pre>
+ *
+ * @example Shortcut for CSS manipulation:
+ * <pre>
+ * $('.myElem').set('+myClass -otherClass on');
+ * </pre>
+ *
+ * @example Making an element transparent:
+ * <pre>
+ * $('.seeThrough').set('$$fade', 0.5);
+ * </pre>
+ *
+ * @example Making an element visible. Note that $$fade will set the element's display style to 'block' and visibility style to 'visible'.
+ * <pre>
+ * $('.myElem').set('$$fade', 1);
+ * </pre>
+ *
+ * @example Using a map to change several properties:
+ * <pre>
+ * $('input.checkbox').set({checked: false,
+ * '@title': 'Check this'});
+ * </pre>
+ *
+ * @example Changing CSS with a map:
+ * <pre>
+ * $('.importantText').set({$fontSize: 'x-large',
+ * $color: 'black',
+ * $backgroundColor: 'red',
+ * $: '+selected -default'});
+ * </pre>
+ *
+ * @example You can specify a function as value to modify a value instead of just setting it:
+ * <pre>
+ * $('h2').set('innerHTML', function(oldValue, index) {
+ * return 'Chapter ' + index + ': ' + oldValue.toUpperCase();
+ * });
+ * </pre>
+ *
+ * @param name the name of a single property or attribute to modify. Unprefixed names set properties, a '$' prefix sets CSS styles and
+ * '@' sets attributes. Please see the table above for special properties and other options.
+ * @param value the value to set. If value is <var>null</var> and name specified an attribute, the attribute will be removed.
+ * If dollar ('$') has been passed as name, the value can contain space-separated CSS class names. If prefixed with a '+' the class will be added,
+ * with a '-' prefix the class will be removed. Without prefix, the class will be toggled.
+ * If <var>value</var> is a function, the <code>function(oldValue, index, obj)</code> will be invoked for each list element
+ * to evaluate the new value:
+ * <dl><dt>oldValue</dt><dd>The old value of the property to be changed, as returned by ##get().
+ * For the CSS style names, this is the computed style of the property </dd>
+ * <dt>index</dt><dd>The list index of the object owning the property</dd>
+ * <dt>obj</dt><dd>The list element owning the property.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The value to be set.</dd></dl>
+ * Functions are not supported by '$'.
+ * @param properties a Object as map containing names as keys and the values to set as map values. See above for the name and value syntax.
+ * @param cssClasses if <var>set()</var> is invoked with a string as single argument, the name "$" (CSS classes) is assumed and the argument is the
+ * value. See above for CSS syntax.
+ * Instead of a string, you can also specify a <code>function(oldValue, index, obj)</code> to modify the existing classes.
+ * @return the list
+ *
+ * @see ##get() retrieves values using the same property syntax.
+ * @see ##animate() animates values using the same property syntax.
+ * @see ##toggle() can toggle between two sets of values.
+ * @see ##dial() allows smooth transitions between two sets of values.
+ */
+ 'set': function (name, value) {
+ var self = this;
+ if (value !== undef) {
+ var match = /^(\W*)(.*)/.exec(replace(replace(name, /^\$float$/, 'cssFloat'), /^%/,'@data-'));
+ var prefix = match[1];
+
+ if (setter[prefix])
+ setter[prefix](this, match[2], value);
+ else if (name == '$$fade') {
+ this['set']({'$visibility': value ? 'visible' : 'hidden', '$opacity': value});
+ }
+ else if (name == '$$slide') {
+ self['set']({'$visibility': value ? 'visible' : 'hidden', '$overflow': 'hidden',
+ '$height': /px/.test(value) ? value : function(oldValue, idx, element) { return getNaturalHeight($(element), value);}
+ });
+ }
+ else if (name == '$$show') {
+ if (value)
+ self['set']({'$visibility': value ? 'visible' : 'hidden', '$display': ''}) // that value? part is only for gzip
+ ['set']({'$display': function(oldVal) { // set for 2nd time: now we get the stylesheet's $display
+ return oldVal == 'none' ? 'block' : oldVal;
+ }});
+ else
+ self['set']({'$display': 'none'});
+ }
+ else if (name == '$$') {
+ self['set']('@style', value);
+ }
+ else
+ flexiEach(this, function(obj, c) {
+ var newValue = isFunction(value) ? value($(obj)['get'](name), c, obj) : value;
+ if (prefix == '$') {
+ if (match[2])
+ obj['style'][match[2]] = newValue;
+ else {
+ flexiEach(newValue && newValue.split(/\s+/), function(clzz) {
+ var cName = replace(clzz, /^[+-]/);
+
+ if (/^\+/.test(clzz))
+ obj['classList'].add(cName);
+ else if (/^-/.test(clzz))
+ obj['classList'].remove(cName);
+ else
+ obj['classList'].toggle(cName);
+ });
+ }
+ }
+ else if (name == '$$scrollX')
+ obj['scroll'](newValue, $(obj)['get']('$$scrollY'));
+ else if (name == '$$scrollY')
+ obj['scroll']($(obj)['get']('$$scrollX'), newValue);
+ else if (prefix == '@') {
+ if (newValue == _null)
+ obj.removeAttribute(match[2]);
+ else
+ obj.setAttribute(match[2], newValue);
+ }
+ else
+ obj[match[2]] = newValue;
+ });
+ }
+ else if (isString(name) || isFunction(name))
+ self['set']('$', name);
+ else
+ eachObj(name, function(n,v) { self['set'](n, v); });
+ return self;
+ },
+
+ /*$
+ * @id add
+ * @group ELEMENT
+ * @requires dollar each
+ * @configurable default
+ * @name .add()
+ * @syntax list.add(text)
+ * @syntax list.add(node)
+ * @syntax list.add(list)
+ * @syntax list.add(factoryFunction)
+ * @module WEB
+ * Adds the given node(s) as children to the list's HTML elements. If a string has been given, it will be added as text node.
+ * DOM nodes will be added directly. If you pass a list, all its elements will be added using the rules above.
+ *
+ * When you pass a DOM node and the target list has more than one element, the original node will be added to the first list element,
+ * and ##clone#clones## to all following list elements.
+ *
+ * ##EE(), ##HTML() and ##clone() are compatible with <var>add()</var> and can help you create new HTML nodes.
+ *
+ * @example Using the following HTML:
+ * <pre>
+ * <div id="comments">Here is some text.<br/></div>
+ * </pre>
+ * The next line appends a text node to the div:
+ * <pre>
+ * $('#comments').add('Some additional text.');
+ * </pre>
+ * This results in:
+ * <pre>
+ * <div id="comments">Here is some text.<br/>Some additional text.</div>
+ * </pre>
+ *
+ * @example Using the following HTML:
+ * <pre>
+ * <ul id="myList">
+ * <li>First list entry</li>
+ * <li>Second list entry</li>
+ * </ul>
+ * </pre>
+ * The following Javascript adds an element to the list:
+ * <pre>
+ * $('#myList').add(EE('li', 'My extra point');
+ * </pre>
+ * This results in
+ * <pre>
+ * <ul id="myList">
+ * <li>First list entry</li>
+ * <li>Second list entry</li>
+ * <li>My extra point</li>
+ * </ul>
+ * </pre>
+ *
+ * @example Use a list to add several elements at once:
+ * <pre>
+ * $('#comments').add([
+ * EE('br'),
+ * 'Some text',
+ * EE('span', {'className': 'highlight'}, 'Some highlighted text')
+ * ]);
+ * </pre>
+ *
+ * @example If you need to customize the content, you can write a factory function:
+ * <pre>
+ * $('.chapter').add(function(parent, index) { return EE('h2', 'Chapter number ' + index); });
+ * </pre>
+ *
+ * @param text a string or number to add as text node
+ * @param node a DOM node to add to the list. If the list has more than one element, the given node will be added to the first element.
+ * For all additional elements, the node will be cloned using ##clone().
+ * @param list a list containing text and/or nodes. May also contain nested lists with nodes or text..
+ * @param factoryFunction a <code>function(listItem, listIndex)</code> that will be invoked for each list element to create the nodes:
+ * <dl><dt>listItem</dt><dd>The list element that will receive the new children.</dd>
+ * <dt>listIndex</dt><dd>The index of the list element that will receive the new children.</dd>
+ * <dt class="returnValue">(callback return value)<dt><dd>The node(s) to be added to the list element.
+ * Can be either a string for a text node, an HTML element or a list containing strings and/or DOM nodes.
+ * If a function is returned, it will be invoked recursively with the same arguments.</dd></dl>
+ * @return the current list
+ *
+ * @see ##fill() works like <var>add()</var>, but deletes all children before adding the new nodes.
+ * @see ##addFront() adds nodes as first child, not as last.
+ * @see ##addAfter() adds nodes not as children but as siblings.
+ * @see ##addBefore() also adds nodes not as children but as siblings.
+ * @see ##replace() replaces existing nodes.
+ */
+ 'add': function (children, addFunction) {
+ return this['each'](function(e, index) {
+ var lastAdded;
+ function appendChildren(c) {
+ if (isList(c))
+ flexiEach(c, appendChildren);
+ else if (isFunction(c))
+ appendChildren(c(e, index));
+ else if (c != _null) { // must check null, as 0 is a valid parameter
+ var n = isNode(c) ? c : document.createTextNode(c);
+ if (lastAdded)
+ lastAdded['parentNode']['insertBefore'](n, lastAdded['nextSibling']);
+ else if (addFunction)
+ addFunction(n, e, e['parentNode']);
+ else
+ e.appendChild(n);
+ lastAdded = n;
+ }
+ }
+ appendChildren(index &&!isFunction(children) ? clone(children) : children);
+ });
+ },
+
+ /*$
+ * @id on
+ * @group EVENTS
+ * @requires dollar each
+ * @configurable default
+ * @name .on()
+ * @syntax list.on(names, eventHandler)
+ * @syntax list.on(selector, names, eventHandler)
+ * @syntax list.on(names, customFunc, args)
+ * @syntax list.on(selector, names, customFunc, args)
+ * @syntax list.on(names, eventHandler, bubbleSelector)
+ * @syntax list.on(names, customFunc, args, bubbleSelector)
+ * @module WEB
+ * Registers the function as event handler for all items in the list.
+ *
+ * By default, Minified cancels event propagation and disables element's default behavior for all elements that have an event handler.
+ * You can override this, either by prefixing the event name with a '|', or by prefixing them with '?' and returning a <var>true</var>
+ * in the handler. Both will reinstate the original JavaScript behavior.
+ *
+ * Handlers are called with the original event object as first argument, the index of the source element in the
+ * list as second argument and 'this' set to the source element of the event (e.g. the button that has been clicked).
+ *
+ * Instead of the event objects, you can also pass an array of arguments that will be passed instead of event object and index.
+ *
+ * Optionally you can specify two a selector strings to qualify only certain events. The first one is a selector
+ * that allows you to select only specific children of the list elements. This is mostly useful for adding events to DOM trees
+ * generated using ##HTML() or ##EE().
+ *
+ * The second type of selector is the bubble selector that allows you to receive only events that bubbled up from
+ * elements matching the selector. The selector is executed in the context of the element you registered on to identify whether the
+ * original target of the event qualifies. If not, the handler is not called.
+ *
+ * Minified always registers event handlers with event bubbling enabled. Event capture is not supported.
+ *
+ * Event handlers can be unregistered using #off#$.off().
+ *
+ * @example Adds a handler to all divs which paints the div background color to red when clicked.
+ * <pre>
+ * $('div').on('click', function() {
+ * this.style.backgroundColor = 'red'; // 'this' contains the element that caused the event
+ * });
+ * </pre>
+ *
+ * @example Registers a handler to call a method setStatus('running') using an inline function:
+ * <pre>
+ * $('#myButton').on('click', function() {
+ * setStatus('running');
+ * });
+ * </pre>
+ * The previous example can bere written like this, using <var>on()</var>'s <var>args</var> parameter:
+ * <pre>
+ * $('#myButton').on('click', setStatus, ['running']);
+ * </pre>
+ *
+ * @example Adds two handlers on an input field. The event names are prefixed with '|' and thus keep their original behavior:
+ * <pre>
+ * $('#myInput').on('|keypress |keydown', function() {
+ * // do something
+ * });
+ * </pre>
+ *
+ * @example Adds a click handler that will abort the operation by returning false, unless the user confirms it:
+ * <pre>
+ * $('#myLink').on('?click', function() {
+ * return window.confirm('Really leave?');
+ * });
+ * </pre>
+ *
+ * @example Adds a button and registers a click handler for it using a sub-selector.
+ * <pre>
+ * $('#myForm').add(HTML("<li><button>click me</button></li>").on('button', 'click', myClickHandler));
+ * </pre>
+ *
+ * @example Adds listeners for all clicks on a table's rows using the bubble selector 'tr'.
+ * <pre>
+ * $('#table').on('change', 'tr', function(event, index, selectedIndex) {
+ * alert("Click on table row number: " + selectedIndex);
+ * }, 'tr');
+ * </pre>
+ * Please note that bubble selectors will even listen to events for
+ * table rows that have been added <strong>after you registered for the events</strong>.
+ *
+ * @param selector optional a selector string for ##dollar#$()## to register the event only on those children of the list elements that
+ * match the selector.
+ * Supports all valid parameters for <var>$()</var> except functions.
+ * @param names the space-separated names of the events to register for, e.g. 'click'. Case-sensitive. The 'on' prefix in front of
+ * the name must not used. You can register the handler for more than one event by specifying several
+ * space-separated event names. If the name is prefixed
+ * with '|' (pipe), the event will be passed through and the event's default actions will be executed by the browser.
+ * If the name is prefixed with '?', the event will only be passed through if the handler returns <var>true</var>.
+ * @param eventHandler the callback <code>function(event, index)</code> to invoke when the event has been triggered:
+ * <dl>
+ * <dt>event</dt><dd>The original DOM event object.</dd>
+ * <dt>index</dt><dd>The index of the target object in the ##list#Minified list## .</dd>
+ * <dt class="this">this</dt><dd>A ##list#Minified list## containing the target element as only item (same as <var>event.target</var>).</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The return value will only be used if the event name prefix was '?'.
+ * Then, a return value <var>false</var> will stop all further processing of the event and disable event bubbling.
+ * <var>true</var> will keep the event alive.</dd>
+ * </dl>
+ * @param customFunc a function to be called instead of a regular event handler with the arguments given in <var>args</var>.
+ * 'this' will be a ##list#Minified list## containing the target element as only item (same element as <var>event.target</var>).
+ * @param args optional an array of arguments to pass to the custom callback function instead of the event objects. If omitted, the function is
+ * called as event handler with the event object as argument.
+ * @param bubbleSelector optional a selector string for ##dollar#$()## to receive only events that bubbled up from an
+ * element that matches this selector.
+ * Supports all valid parameters for <var>$()</var> except functions. Analog to ##is(),
+ * the selector is optimized for the simple patterns '.classname', 'tagname' and 'tagname.classname'.
+ * @return the list
+ * @see ##off() allows you to unregister an event handler.
+ * @see ##onClick() as a shortcut for 'click' events.
+ * @see ##onOver() to simplify mouseover/mouseout events.
+ * @see ##onFocus() as convenient way to register for focus events.
+ * @see ##onChange() to get notified when an input's content changes.
+ */
+ 'on': on,
+
+ /*$
+ * @id trigger
+ * @group EVENTS
+ * @requires on each
+ * @configurable default
+ * @name .trigger()
+ * @syntax list.trigger(name)
+ * @syntax list.trigger(name, eventObject)
+ * @module WEB
+ *
+ * Triggers event handlers registered with ##on().
+ * Any event that has been previously registered using ##on() can be invoked with <var>trigger()</var>. Please note that
+ * it will not simulate the default behavior on the elements, such as a form submit when you click on a submit button. Event bubbling
+ * is supported, thus unless there's an event handler that cancels the event, the event will be triggered on all parent elements.
+ *
+ *
+ * @example Simulates a 'click' event on the button.
+ * <pre>
+ * $('#myButton').trigger('click');
+ * </pre>
+ *
+ * @param name a single event name to trigger
+ * @param eventObj optional an object to pass to the event handler, provided the handler does not have custom arguments.
+ * Anything you pass here will be directly given to event handlers as event object, so you need to know what
+ * they expect.
+ * @return the list
+ * @see ##on() registers events that can be triggered.
+ */
+ 'trigger': function (eventName, eventObj) {
+ return this['each'](function(element, index) {
+ var bubbleOn = true, el = element;
+ while(el && bubbleOn) {
+ eachObj(el['M'], function(id, f) {
+ bubbleOn = bubbleOn && f(eventName, eventObj, element);
+ });
+ el = el['parentNode'];
+ }
+ });
+ }
+
+ /*$
+ * @stop
+ */
+ // @cond !trigger dummyTrigger:0
+ ,
+ ///#/snippet webListFuncs
+ ///#snippet extrasListFuncs
+
+ /*$
+ * @id ht
+ * @group ELEMENT
+ * @requires set template
+ * @configurable default
+ * @name .ht()
+ * @syntax list.ht(templateString, object...)
+ * @syntax list.ht(templateFunction, object...)
+ * @syntax list.ht(idSelector, object...)
+ * @module WEB+UTIL
+ * Replaces the content of the list elements with the HTML generated using the given template. The template uses
+ * ##template() syntax and HTML-escaped its output using ##escapeHtml().
+ *
+ * @example When you have a HTML snippet like this:
+ * <pre>
+ * <div id="price"></div>
+ * </pre>
+ * Then you can format the price value like this:
+ * <pre>
+ * var price = 14.9;
+ * $('#price').ht('<b>${{::0.00}}</b>', price);
+ * </pre>
+ * Results in:
+ * <pre>
+ * <div id="price"><b>$14.90</b></div>
+ * </pre>
+ *
+ * @example Render a list of names:
+ * <pre>
+ * var names = [ {first: 'James', last: 'Sullivan'},
+ * {first: 'Michael', last: 'Wazowski'} ];
+ * $('#list').ht('<h2>{{listName}}</h2>'+
+ * '<ul>{{each n: names}}<li>{{n.first}} {{n.last}}</li>{{/each}}</ul>',
+ * {listName: 'Guys', names: names});
+ * </pre>
+ * The code creates this:
+ * <pre>
+ * <h2>Guys</h2>
+ * <ul><li>James Sullivan<li><li>Michael Wazowski</li></ul>
+ * </pre>
+ *
+ * @example You can store templates in <script> tags. First you need to create a <script> tag with a type not
+ * supported by the browser and put your template in there, like this:
+ * <pre><script id="myTimeTpl" type="minified-template">The time is {{HH:mm:ss}}.</script></pre>
+ * Then you can specify the tag's id directly to access it:
+ * <pre>$('#timeDisplay').ht('#myTimeTpl', new Date());</pre>
+ *
+ * @param templateString the template using ##template() syntax. Please note, because this is a template, you should
+ * avoid creating the template itself dynamically, as compiling templates is expensive and
+ * Minified will cache only a limited number of templates. Exception: If the template string does not use
+ * any template functionality (no {{}}), it does not need to be compiled and won't be cached.<br/>
+ * The template will use ##escapeHtml() as escape function, so all template substitutions will be HTML-escaped,
+ * unless you use triple curly-braces.
+ * @param templateFunction instead of a HTML template, <var>ht()</var> can also use a template function, e.g. one
+ * created by ##template(). It will be invoked with the object as only argument.
+ * @param idSelector if you pass an ID CSS selector in the form "#myScript", Minified will recognize this and use the content
+ * of the specified <script> element as template. This allows you to put your template into
+ * a <script> tag with a non-JavaScript type (see example). Any string that starts with '#' and does not
+ * contain any spaces is used as selector.
+ * @param object optional one or more objects to pass to the template. If object is not set, the template is called with <var>undefined</var>
+ * as object. If exactly one object is given, it is passed directly to the template. If you specify more than one
+ * object, they are ##merge#merged##.
+ * @return the current list
+ *
+ * @see ##HTML() creates only the nodes and can be used with ##add() and other methods to add the nodes to the DOM, giving you more flexibility than <var>ht()</var>.
+ */
+ 'ht': function(htmlTemplate, object) {
+ var o = arguments.length > 2 ? merge(sub(arguments, 1)) : object;
+ return this['set']('innerHTML', isFunction(htmlTemplate) ? htmlTemplate(o) :
+ /{{/.test(htmlTemplate) ? formatHtml(htmlTemplate, o) :
+ /^#\S+$/.test(htmlTemplate) ? formatHtml($$(htmlTemplate)['text'], o) : htmlTemplate);
+ }
+ /*$
+ * @stop
+ */
+ // @cond !ht dummyHt:0
+ ///#/snippet extrasListFuncs
+ }, M.prototype);
+
+ //// DOLLAR FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ copyObj({
+ ///#snippet webDollarFuncs
+ /*$
+ * @id request
+ * @group REQUEST
+ * @requires
+ * @configurable default
+ * @name $.request()
+ * @syntax $.request(method, url)
+ * @syntax $.request(method, url, data)
+ * @syntax $.request(method, url, data, settings)
+ * @module WEB
+ * Initiates a HTTP request to the given URL, using XMLHttpRequest. It returns a ##promiseClass#Promise## object that allows you to obtain the result.
+ *
+ * @example Invokes a REST web service and parses the resulting document using JSON:
+ * <pre>
+ * $.request('get', 'http://service.example.com/weather', {zipcode: 90210})
+ * .then(function(txt) {
+ * var json = $.parseJSON(txt);
+ * $('#weatherResult').fill('Today's forecast is is: ' + json.today.forecast);
+ * })
+ * .error(function(status, statusText, responseText) {
+ * $('#weatherResult').fill('The weather service was not available.');
+ * });
+ * </pre>
+ *
+ * @example Sending a JSON object to a REST web service:
+ * <pre>
+ * var myRequest = { // create a request object that can be serialized via JSON
+ * request: 'register',
+ * entries: [
+ * {name: 'Joe',
+ * job: 'Plumber'
+ * }
+ * ]};
+ *
+ * function failureHandler() {
+ * $('#registrationResult').fill('Registration failed');
+ * }
+ *
+ * $.request('post', 'http://service.example.com/directory', $.toJSON(myRequest))
+ * .then(function(txt) {
+ * if (txt == 'OK')
+ * $('#registrationResult').fill('Registration succeeded');
+ * else
+ * failureHandler();
+ * })
+ * .error(failureHandler);
+ * </pre>
+ *
+ * @example Using HTTP authentication and a custom XMLHttpRequest property.
+ * <pre>var handler = $.request('get', 'http://service.example.com/userinfo', null, {xhr: {withCredentials: true}, user: 'me', pass: 'secret'});</pre>
+ *
+ *
+ * @param method the HTTP method, e.g. 'get', 'post' or 'head' (rule of thumb: use 'post' for requests that change data
+ * on the server, and 'get' to request data). Not case sensitive.
+ * @param url the server URL to request. May be a relative URL (relative to the document) or an absolute URL. Note that unless you do something
+ * fancy on the server (keyword to google: Access-Control-Allow-Origin), you can only call URLs on the server your script originates from.
+ * @param data optional data to send in the request, either as POST body or as URL parameters. It can be either a plain object as map of
+ * parameters (for all HTTP methods), a string (for all HTTP methods), a DOM document ('post' only) or a FormData object ('post' only).
+ * If the method is 'post', it will be sent as body, otherwise parameters are appended to the URL. In order to send several parameters with the
+ * same name, use an array of values in the map. Use null as value for a parameter without value.
+ * @param settings optional a map of additional parameters. Supports the following properties (all optional):
+ * <dl><dt>headers</dt><dd>a map of HTTP headers to add to the request. Note that you should use the proper capitalization for the
+ * header 'Content-Type', if you set it, because otherwise it may be overwritten.</dd>
+ * <dt>xhr</dt><dd>a map of properties to set in the XMLHttpRequest object before the request is sent, for example <code>{withCredentials: true}</code>.</dd>
+ * <dt>user</dt><dd>username for HTTP authentication, together with the <var>pass</var> parameter</dd>
+ * <dt>pass</dt><dd>password for HTTP authentication, together with the <var>user</var> parameter</dd>
+ * </dl>
+ * @return a ##promiseClass#Promise## containing the request's status. If the request has successfully completed with a HTTP status 2xx,
+ * the promise's completion handler will be called as <code>function(text, xhr)</code>:
+ * <dl><dt>text</dt><dd>The response sent by the server as text.</dd>
+ * <dt>xhr</dt><dd>The XMLHttpRequest used for the request. This allows you to retrieve the response in different
+ * formats (e.g. <var>responseXml</var> for an XML document</var>), to retrieve headers and more.</dd></dl>
+ * The failure handler will be called as <code>function(statusCode, statusText, text)</code>:
+ * <dl><dt>statusCode</dt><dd>The HTTP status (never 200; 0 if no HTTP request took place).</dd>
+ * <dt>text</dt><dd>The response's body text, if there was any, or the exception as string if the browser threw one.</dd>
+ * <dt>xhr</dt><dd>The XMLHttpRequest used for the request. This allows you to retrieve the response in different
+ * formats (e.g. <var>responseXml</var> for an XML document</var>), to retrieve headers and more..</dd></dl>
+ * The returned promise supports ##stop(). Calling <var>stop()</var> will invoke the XHR's <var>abort()</var> method.
+ * The underlying XmlHttpRequest can also be obtained from the promise's <var>xhr</var> property.
+ *
+ * @see ##values() serializes an HTML form in a format ready to be sent by <var>$.request</var>.
+ * @see ##$.parseJSON() can be used to parse JSON responses.
+ * @see ##$.toJSON() can create JSON messages.
+ * @see ##_.format() can be useful for creating REST-like URLs, if you use JavaScript's built-in <var>escape()</var> function.
+ */
+ 'request': function (method, url, data, settings0) {
+ var settings = settings0 || {};
+ var xhr, callbackCalled = 0, prom = promise(), dataIsMap = data && (data['constructor'] == settings['constructor']);
+ try {
+ prom['xhr'] = xhr = new XMLHttpRequest();
+
+ prom['stop0'] = function() { xhr['abort'](); };
+ // @condend
+
+ if (dataIsMap) { // if data is parameter map...
+ data = collector(eachObj, data, function processParam(paramName, paramValue) {
+ return collector(flexiEach, paramValue, function(v) {
+ return encodeURIComponent(paramName) + ((v != _null) ? '=' + encodeURIComponent(v) : '');
+ });
+ }).join('&');
+ }
+
+ if (data != _null && !/post/i.test(method)) {
+ url += '?' + data;
+ data = _null;
+ }
+
+ xhr['open'](method, url, true, settings['user'], settings['pass']);
+ if (dataIsMap && /post/i.test(method))
+ xhr['setRequestHeader']('Content-Type', 'application/x-www-form-urlencoded');
+
+ eachObj(settings['headers'], function(hdrName, hdrValue) {
+ xhr['setRequestHeader'](hdrName, hdrValue);
+ });
+ eachObj(settings['xhr'], function(name, value) {
+ xhr[name] = value;
+ });
+
+ xhr['onreadystatechange'] = function() {
+ if (xhr['readyState'] == 4 && !callbackCalled++) {
+ if (xhr['status'] >= 200 && xhr['status'] < 300)
+ prom['fire'](true, [xhr['responseText'], xhr]);
+ else
+ prom['fire'](false, [xhr['status'], xhr['responseText'], xhr]);
+ }
+ };
+
+ xhr['send'](data);
+ }
+ catch (e) {
+ if (!callbackCalled)
+ prom['fire'](false, [0, _null, toString(e)]);
+ }
+
+ return prom;
+ },
+
+ /*
+ * JSON Module. Uses browser built-ins or json.org implementation if available. Otherwise its own implementation,
+ * originally based on public domain implementation http://www.JSON.org/json2.js / http://www.JSON.org/js.html.
+ * Extremely simplified code, made variables local, removed all side-effects (especially new properties for String, Date and Number).
+ */
+
+ /*$
+ * @id ready
+ * @group EVENTS
+ * @requires ready_vars ready_init
+ * @configurable default
+ * @name $.ready()
+ * @syntax $.ready(handler)
+ * @module WEB
+ * Registers a handler to be called as soon as the HTML has been fully loaded in the browser. Does not necessarily wait for images and other elements,
+ * only the main HTML document needs to be complete. On older browsers it is the same as <var>window.onload</var>.
+ *
+ * If you call <var>ready()</var> after the page is completed, the handler is scheduled for invocation in the event loop as soon as possible.
+ *
+ * A shortcut for <var>ready()</var> is to call ##dollar#$()## with the handler function. It does the same with fewer characters.
+ *
+ * @example Registers a handler that sets some text in an element:
+ * <pre>
+ * $.ready(function() {
+ * $('#someElement').fill('ready() called');
+ * });
+ * </pre>
+ *
+ * @param handler the <code>function()</code> to be called when the HTML is ready.
+ * @see ##dollar#$()## calls <var>ready()</var> when invoked with a function, offering a more convenient syntax.
+ */
+ 'ready': ready,
+
+ /*$
+ * @id off
+ * @group EVENTS
+ * @requires on
+ * @configurable default
+ * @name $.off()
+ * @syntax $.off(handler)
+ * @module WEB
+ * Removes the given event handler. The call will be ignored if the given handler has not been registered using ##on().
+ * If the handler has been registered for more than one element or event, it will be removed from all instances.
+ *
+ * Please note that you can not unregister event handlers registered using ##onOver() or ##onChange().
+ *
+ * @example Adds a handler to an element:
+ * <pre>
+ * function myEventHandler() {
+ * this.style.backgroundColor = 'red'; // 'this' contains the element that caused the event
+ * }
+ * $('#myElement').on('click', myEventHandler); // add event handler
+ *
+ * window.setInterval(function() { // after 5s, remove event handler
+ * $.off(myEventHandler);
+ * }, 5000);
+ * </pre>
+ *
+ * @param handler the handler to unregister, as given to ##on(). It must be a handler that has previously been registered using ##on().
+ * If the handler is not registered as event handler, the function does nothing.
+ *
+ * @see ##on() registers an event handler.
+ */
+ 'off': off
+
+ /*$
+ * @stop
+ */
+ // @cond !off dummyOff:null
+ ,
+ ///#/snippet webDollarFuncs
+ ///#snippet extrasDollarFuncs
+
+ /*$
+ * @id wait
+ * @group EVENTS
+ * @configurable default
+ * @requires promise
+ * @name $.wait()
+ * @syntax $.wait()
+ * @syntax $.wait(durationMs)
+ * @syntax $.wait(durationMs, args)
+ * @module WEB+UTIL
+ *
+ * Creates a new ##promise#Promise## that will be fulfilled as soon as the specified number of milliseconds have passed. This is mainly useful for animation,
+ * because it allows you to chain delays into your animation chain.
+ *
+ * The operation can be interrupted by calling the promise's ##stop() function.
+ *
+ * @example Chained animation using Promise callbacks. The element is first moved to the position 200/0, then to 200/200, waits for 50ms
+ * and finally moves to 100/100.
+ * <pre>
+ * var div = $('#myMovingDiv').set({$left: '0px', $top: '0px'});
+ * div.animate({$left: '200px', $top: '0px'}, 600, 0)
+ * .then(function() {
+ * div.animate({$left: '200px', $top: '200px'}, 800, 0);
+ * }).then(function() {
+ * return _.wait(50);
+ * }).then(function() {
+ * div.animate({$left: '100px', $top: '100px'}, 400);
+ * });
+ * });
+ * </pre>
+ *
+ *
+ * @param durationMs optional the number of milliseconds to wait. If omitted, the promise will be fulfilled as soon as the browser can run it
+ * from the event loop.
+ * @param args optional an array or list of arguments to pass to the promise handler
+ * @return a ##promise#Promise## object that will be fulfilled when the time is over, or fail when the promise's ##stop() has been called.
+ * The promise argument of a fulfilled promise is the <var>args</var> parameter as given to <var>wait()</var>. The returned promise supports ##stop()
+ * to interrupt the promise.
+ */
+ 'wait': function(durationMs, args) {
+ var p = promise();
+ var id = setTimeout(function() {
+ p['fire'](true, args);
+ }, durationMs);
+ p['stop0'] = function() { p['fire'](false); clearTimeout(id); };
+ return p;
+ }
+
+ /*$
+ * @stop
+ */
+ // @cond !wait dummyWait:0
+
+ ///#/snippet extrasDollarFuncs
+ }, $);
+
+ //// UNDERSCORE FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ copyObj({
+ ///#snippet utilUnderscoreFuncs
+ // @condblock each
+ 'each': each,
+ // @condend
+ // @condblock each
+ 'toObject': toObject,
+ // @condend
+ // @condblock find
+ 'find': find,
+ // @condend
+ // @condblock equals
+ 'equals': equals,
+ // @condend
+
+ /*$
+ * @id copyobj
+ * @group OBJECT
+ * @requires
+ * @configurable default
+ * @name _.copyObj()
+ * @syntax _.copyObj(from)
+ * @syntax _.copyObj(from, to)
+ * @module UTIL
+ * Copies every property of the first object into the second object. The properties are copied as shallow-copies.
+ *
+ * @example Copying properties:
+ * <pre>var target = {a:3, c: 3};
+ * _.copyObj({a: 1, b: 2}, target); // target is now {a: 1, b: 2, c: 3}</pre>
+ *
+ * @example Inline property merge:
+ * <pre>var target = _.copyObj({a: 1, b: 2}, {a:3, c: 3}); // target is now {a: 1, b: 2, c: 3}</pre>
+ *
+ * @example Duplicating an object:
+ * <pre>var target = _.copyObj({a: 1, b: 2}); // target is now {a: 1, b: 2}</pre>
+ *
+ * @param from the object to copy from
+ * @param to optional the object to copy to. If not given, a new object will be created.
+ * @return the object that has been copied to
+ *
+ * @see ##_.extend() is very similar to <var>copyObj()</var>, but with a slightly different syntax.
+ * @see ##_.merge() copies a list of objects into a new object.
+ */
+ 'copyObj': copyObj,
+
+ /*$
+ * @id extend
+ * @group OBJECT
+ * @requires
+ * @configurable default
+ * @name _.extend()
+ * @syntax _.extend(target, src...)
+ * @module UTIL
+ * Copies every property of the source objects into the first object. The source objects are specified using variable arguments.
+ * There can be more than one.
+ * The properties are copied as shallow-copies.
+ *
+ * <b>Please note:</b> Unlike jQuery, <var>extend</var> does not directly add a function to extend Minified, although
+ * you can use it to for this. To add a function to ##list#Minified lists##, add a property to
+ * ##M#MINI.M##. If you want to extend <var>$</var> or <var>_</var>, just assign the new function(s) as property.
+ *
+ * @example Copying properties:
+ * <pre>var target = {a:3, c: 3};
+ * _.extend(target, {a: 1, b: 2}); // target is now {a: 1, b: 2, c: 3}</pre>
+ *
+ * @example Using several source values:
+ * <pre>var extend = _.extend({a: 1, b: 2}, {a:3, c: 3}, {d: 5}); // target is now {a: 1, b: 2, c: 3, d: 5}</pre>
+ *
+ * @param target the object to copy to
+ * @param src the object(s) to copy from. Variable argument, there can be any number of sources. Nulls and <var>undefined</var>
+ * parameters will be ignored.
+ * @return the target
+ *
+ * @see ##_.copyObj() is very similar to <var>extend()</var>, but with a slightly different and more straightforward syntax.
+ * @see ##_.merge() copies a list of objects into a new object.
+ */
+ 'extend': function(target) {
+ return merge(sub(arguments, 1), target);
+ },
+
+ /*$
+ * @id eachobj
+ * @group OBJECT
+ * @requires
+ * @configurable default
+ * @name _.eachObj()
+ * @syntax _.eachObj(obj, callback)
+ * @syntax _.eachObj(obj, callback, ctx)
+ * @module UTIL
+ * Invokes the given function once for each property of the given object. The callback is not invoked for inherited properties.
+ *
+ * @example Dumps all properties of an object.
+ * <pre>
+ * var s = '';
+ * _.eachObj({a: 1, b: 5, c: 2}, function(key, value) {
+ * s += 'key=' + key + ' value=' + value + '\n';
+ * });
+ * </pre>
+ *
+ * @param obj the object to use
+ * @param callback The callback <code>function(key, value)</code> to invoke for each property.
+ * <dl><dt>key</dt><dd>The name of the current property.</dd>
+ * <dt>value</dt><dd>The value of the current property.</dd>
+ * <dt class="this">this</dt><dd>The given context. If not set, the object itself.</dd>
+ * The callback's return value will be ignored.
+ * @param ctx optional a context to pass to the callback as 'this'.
+ * @return the object
+ *
+ * @see ##_.each() iterates through a list.
+ */
+ 'eachObj': eachObj,
+
+ /*$
+ * @id isobject
+ * @group TYPE
+ * @requires
+ * @configurable default
+ * @name _.isObject()
+ * @syntax _.isObject(obj)
+ * @module UTIL
+ * Checks whether the given reference is an object as defined by <var>typeof</var>.
+ *
+ * @param obj the object to test
+ * @return <var>true</var> if the object is an object, <var>false</var> otherwise.
+ */
+ 'isObject': isObject,
+
+ /*$
+ * @id format
+ * @group FORMAT
+ * @requires template
+ * @configurable default
+ * @name _.format()
+ * @syntax _.format()
+ * @syntax _.format(template, object)
+ * @syntax _.format(template, object, escapeFunction)
+ * @module UTIL
+ * Formats an object using a ##template#template##. The template syntax is shared with ##_.template(). The only difference is that
+ * <var>format()</var> frees you from the extra step of creating the template. In any case, whether you use
+ * <var>format()</var> or ##_.template(), the template will be cached. Be careful when you create templates dynamically, as
+ * every template is cached and consumes memory.<br/>
+ * If you only want to format a single value, use ##_.formatValue().
+ *
+ * @example Format a name:
+ * <pre>var s = _.formatHtml("{{first}} {{last}}", {first: 'Tim', last: 'Taylor'});</pre>
+ *
+ * @example Format a list of dates:
+ * <pre>var s = _.format("{{each}}{{this :: yyyy-MM-dd}}{{/each}}", dateList);</pre>
+ *
+ * @param template The ##template#template## as a string. The template, once created, will be cached.
+ * @param object the object to format
+ * @param escapeFunction optional The callback <code>function(inputString)</code> that will be used
+ * to escape all output:
+ * <dl><dt>inputString</dt><dd>The string to escape.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The escaped string.</dd></dl>
+ * If no escapeFunction has been given, the output will not be escaped.
+ * ##_.escapeHtml() can be used as an escape function for HTML, and ##_.escapeRegExp() for regular expressions.
+ * JavaScript's built-in <var>escape()</var> function can escape URL components.
+ * See ##_.htmlFormat() for a version of <var>format()</var> that already includes HTML escaping.
+ * @return the string created by the template
+ *
+ * @see ##_.template() creates a template function, using the same syntax.
+ * @see ##_.formatHtml() is a variant of <var>format()</var> with HTML-escpaping built it.
+ * @see ##_.formatValue() formats a single number or date.
+ * @see ##_.escapeRegExp() can be used by <var>format()</var> to escape regular expressions.
+ */
+ 'format': function(tpl, object, escapeFunction) {
+ return template(tpl, escapeFunction)(object);
+ },
+
+ /*$
+ * @id template
+ * @group FORMAT
+ * @requires date_constants
+ * @configurable default
+ * @name _.template()
+ * @syntax _.template(template)
+ * @syntax _.template(template, escapeFunction)
+ * @module UTIL
+ * Parses a Handlebars-like template to create a reusable template function.
+ *
+ * The syntax of the template uses a syntax that superficially looks like
+ * <a href="http://handlebarsjs.com/">Handlebars</a>. Unlike Handlebars, it is based on raw JavaScript expressions and thus gives you
+ * complete freedom, but also offers you shortcuts for formatting, iteration and conditionals.
+ *
+ * Every template can receive exactly one object as input. If you need more than one value as input, put all required values
+ * into an object.
+ *
+ * Use double curly braces to embed a JavaScript expression and insert its result:
+ * <pre>{{a}} plus {{b}} is {{a+b}}</pre>
+ *
+ * To use such a template, create it with <var>template()</var> and then execute the resulting function:
+ * <pre>var myTemplate = _.template('{{a}} plus {{b}} is {{a+b}}');
+ * var result = myTemplate({a: 5, b: 7});</pre>
+ * If you pass an object as input, its properties will be mapped using JavaScript's <code>with</code>
+ * statement and are available as variables throughout the template.
+ *
+ * If you have only a simple value to render, you can pass it directly and access it through the pre-defined
+ * variable <var>obj</var>:
+ * <pre>var myTemplate = _.template('The result is {{obj}}.');
+ * var result = myTemplate(17);</pre>
+ * Alternatively, you could also access the input as <var>this</var>, but be aware that JavaScript wraps simples types
+ * such as Number and Boolean. <var>this</var> is the default, so you can omit it to get the same result:
+ * <pre>var myTemplate = _.template('The result is {{ }}.');
+ * var result = myTemplate(17);</pre>
+ *
+ * Minified templates can use ##_.formatValue() formats directly. Just separate them from the expression by
+ * a double-colon:
+ * <pre>The price is {{obj::#.00}}.</pre>
+ *
+ * Conditions can be expressed using <code>if</code> and <code>else</code>:
+ * <pre>Hello {{if visits==0}}New{{else if visits<10}}Returning{{else}}Regular{{/if}} Customer.</pre>
+ * You can use any JavaScript expression as condition.
+ *
+ * Use <code>each</code> to iterate through a list:
+ * <pre>var myTemplate = _.template(
+ * '{{each names}}{{this.firstName}} {{this.lastName}}{{/each}}');
+ * var result = myTemplate({names: [{firstName: 'Joe', lastName: 'Jones'},
+ * {firstName: 'Marc', lastName: 'Meyer'}]});</pre>
+ * <code>each</code> will iterate through the members of the given object. It
+ * calls its body for each item and put a reference to the item into <var>this</var>.
+ * Optionally, you can specify up to two variables to store the value in and
+ * the zero-based index of the current item:
+ * <pre>var myTemplate = _.template(
+ * '{{each value, index: names}}{{index}}. {{value.firstName}} {{value.lastName}}{{/each}}');
+ * </pre>
+ *
+ * If you do not pass an expression to <code>each</code>, it will take the list from <var>this</var>:
+ * <pre>var myTemplate = _.template('{{each value:}}{{value}};{{/each}}');
+ * var result = myTemplate([1, 2, 3]);</pre>
+ *
+ * Beside lists, you can also iterate through the properties of an object. The property name will be stored
+ * in the first given parameter and the value in <var>this</var> and the second parameter:
+ * <pre>var myTemplate = _.template('{{each key, value: nicknames}}{{key}}: {{value}}{{/each}}');
+ * var result = myTemplate({nicknames: {Matt: 'Matthew', John: 'Jonathan'} });</pre>
+ *
+ * Shorter version of the previous example that uses <var>this</var> for the value:
+ * <pre>var myTemplate = _.template('{{each key: nicknames}}{{key}}: {{this}}{{/each}}');</pre>
+ *
+ * If you do not need the key, you can omit the variable specification:
+ * <pre>var myTemplate = _.template('{{each nicknames}}{{this}}{{/each}}');</pre>
+ *
+ * You can define your own variables, using the regular JavaScript syntax, with 'var':
+ * <pre>var myTemplate = _.template('{{var s=very.long.name, sum=a+b;}}{{s.desc}}, {{sum}}');</pre>
+ *
+ * In some situations, it may be inevitable to embed raw JavaScript in the template.
+ * To embed JavaScript code, prefix the code with a '#':
+ * <pre>var myTemplate = _.template(
+ * '{{each}}{{#var sum = 0; for (var i = 0; i < 3; i++) sum += this.numbers[i]; }}{{sum}}{{/each}}');
+ * var result = myTemplate([['Foreword', 'Intro'], ['Something', 'Something else']]);</pre>
+ *
+ *
+ * By default, all output will be escaped. You can prevent this by using triple-curly-braces:
+ * <pre>Here's the original: {{{rawText}}}</pre>.
+ *
+ * The template's JavaScript code is executed in a sandbox without access to global variables. Minified defines the
+ * following variables for you:
+ * <table>
+ * <tr><th>Name</th><th>Desciption</th></tr>
+ * <tr><td>this</td><td>The template object outside of <code>each</code>. Inside <code>each</code>s, the current value.</td></tr>
+ * <tr><td>obj</td><td>The parameter given to the template function.</td></tr>
+ * <tr><td>_</td><td>A reference to Minified Util.</td></tr>
+ * <tr><td>esc</td><td>The escape function given when the template has been defined. If no function has been given,
+ * a default function that returns the input unmodified.</td></tr>
+ * <tr><td>print</td><td>A <code>function(text,...)</code> that appends one or more strings to the template result.</td></tr>
+ * <tr><td>each</td><td>A <code>function(listOrObject, eachCallback)</code> that can iterate over lists or object properties.
+ * The <var>eachCallback</var> is a <code>function(key, value)</code> for objects or <code>function(value, index)</code>
+ * for arrays that will be invoked for each item.
+ * </table>
+ *
+ * Every template you create is already cached, so it not an expensive operation to call ##_.template() a second
+ * time with the same template. However, because of caching, you should be careful when creating templates
+ * dynamically, as this will fill the cache up quickly.
+ *
+ * @param template The template as a string using the syntax described below.
+ * @param escapeFunction optional The callback <code>function(inputString)</code> that will be used
+ * to escape all output:
+ * <dl><dt>inputString</dt><dd>The string to escape.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The escaped string.</dd></dl>
+ * If no escapeFunction has been given, the output will not be escaped.
+ * ##_.escapeHtml() can be used as an escape function for HTML, and ##_.escapeRegExp() for regular expressions.
+ * JavaScript's built-in <var>escape()</var> function can escape URL components.
+ * @return the value returned by the last invocation of <var>func</var>
+ *
+ * @see ##_.format() shares <var>template()</var>'s syntax but returns the result directly.
+ * @see ##_.formatHtml() is a variant of <var>format()</var> with HTML escaping.
+ * @see ##_.escapeHtml() can be used by <var>template()</var> to escape HTML.
+ * @see ##_.escapeRegExp() can be used by <var>template()</var> to escape regular expressions.
+ * @see ##HTML() creates a HTML element tree from a template.
+ */
+ 'template': template,
+
+ /*$
+ * @id formathtml
+ * @group FORMAT
+ * @requires template
+ * @configurable default
+ * @name _.formatHtml()
+ * @syntax _.formatHtml()
+ * @syntax _.formatHtml(template, object)
+ * @module UTIL
+ * Formats an object using a ##template#template## with HTML escaping for the output.
+ * The template syntax is shared with ##_.template(). Output in double curly braces is automatically escaped using ##_.escapeHtml().
+ * <var>formatHtml()</var> just creates a new template with HTML escaping and invokes it immediately.
+ * The template will be cached. Be careful when you create templates dynamically, as
+ * every template is cached and consumes memory.<br/>
+ * If you only want to format a single value, use ##_.formatValue().
+ *
+ * @example Format a name:
+ * <pre>var s = _.formatHtml("{{first}} {{last}}", {first: 'Tim', last: 'Taylor'});</pre>
+ *
+ * @example Format a list of dates:
+ * <pre>var s = _.formatHtml("{{each}}{{::yyyy-MM-dd}}{{/each}}", dateList);</pre>
+ *
+ * @param template The ##template#template## as a string. The template, once created, will be cached.
+ * @param object the object to format
+ * @return the string created by the template
+ *
+ * @see ##ht() works uses <var>formatHtml</var> to set element's innerHTML.
+ * @see ##HTML() create HTML nodes using <var>formatHtml</var>.
+ * @see ##_.template() creates a template function, using the same syntax.
+ * @see ##_.format() allows you to specify alternative escape mechanisms.
+ */
+ 'formatHtml': formatHtml
+ /*$
+ * @stop
+ */
+
+ // @cond !format dummyFormatHtml:0
+ ,
+
+ ///#/snippet utilUnderscoreFuncs
+ ///#snippet extrasUnderscoreFuncs
+ // @condblock promise
+ 'promise': promise
+ // @condend promise
+
+ /*$
+ * @stop
+ */
+ // @cond !promise dummyPromise:0
+
+ ///#/snippet extrasUnderscoreFuncs
+ }, _);
+
+ ////INITIALIZATION ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ ///#snippet webInit
+ /*$
+ * @id ready_init
+ * @dependency
+ */
+ document.addEventListener("DOMContentLoaded", function() {
+ callList(DOMREADY_HANDLER);
+ DOMREADY_HANDLER = _null;
+ }, false);
+ /*$
+ @stop
+ */
+
+
+ ///#/snippet webInit
+
+ return {
+ ///#snippet extrasExports
+
+ /*$
+ * @id html
+ * @group ELEMENT
+ * @requires template ht
+ * @configurable default
+ * @name HTML()
+ * @syntax HTML(templateString, object...)
+ * @syntax HTML(templateFunction, object...)
+ * @syntax HTML(idSelector, object...)
+ * @module WEB
+ * Creates a ##list#list## of HTML nodes from the given HTML template. The list is compatible with ##add(), ##fill() and related methods.
+ * The template uses the ##template() syntax with ##escapeHtml() escaping for values.
+ *
+ * Please note that the function <var>HTML</var> will not be automatically exported by Minified. You should always import it
+ * using the recommended import statement:
+ * <pre>
+ * var MINI = require('minified'), $ = MINI.$, $$ = MINI.$$, EE = MINI.EE, <strong>HTML = MINI.HTML</strong>;
+ * </pre>
+ *
+ * @example Creating a HTML element showing a number:
+ * <pre>
+ * <div id="price">-</div>
+ * </pre>
+ * Then the price can be set like this:
+ * <pre>
+ * var price = 14.9;
+ * $('#price').fill(HTML('<b>${{::0.99}}</b>', price));
+ * </pre>
+ * Results in:
+ * <pre>
+ * <div id="price"><b>$14.90</b></div>
+ * </pre>
+ *
+ * @example Adding elements to an existing list:
+ * <pre>
+ * var names = [ {first: 'James', last: 'Sullivan'},
+ * {first: 'Michael', last: 'Wazowski'} ];
+ * $('#list').add(HTML('{{each}}<li>{{this.first}} {{this.last}}</li>{{/each}}', names);
+ * </pre>
+ * The code adds this to #list:
+ * <pre>
+ * <li>James Sullivan<li><li>Michael Wazowski</li>
+ * </pre>
+ *
+ * @example You can store templates in <script> tags. First you need to create a <script> tag with a type not
+ * supported by the browser and put your template in there, like this:
+ * <pre><script id="myTimeTpl" type="minified-template">The time is {{HH:mm:ss}}.</script></pre>
+ * Then you can specify the tag's id directly to access it:
+ * <pre>$('#timeDisplay').fill(HTML('#myTimeTpl', new Date()));</pre>
+ *
+ * @param templateString the template using ##template() syntax. Please note, because this is a template, you should
+ * avoid creating the template itself dynamically, as compiling templates is expensive and
+ * Minified will cache only a limited number of templates. Exception: If the template string does not use
+ * any template functionality (no {{}}), it does not need to be compiled and won't be cached.
+ * The template will use ##escapeHtml() as escape function, so all template substitutions will be HTML-escaped,
+ * unless you use triple curly-braces.
+ * @param templateFunction instead of a HTML template <var>HTML()</var> also accepts a template function, e.g. one
+ * created by ##template(). It will be invoked with the object as only argument.
+ * @param idSelector if you pass an ID CSS selector in the form "#myScript", Minified will recognize this and use the content
+ * of the specified <script> element as template. This allows you to put your template into
+ * a <script> tag with a non-JavaScript type (see example). Any string that starts with '#' and does not
+ * contain any spaces is used as selector.
+ * @param object optional one or more objects to pass to the template. If object is not set, the template is called with <var>undefined</var>
+ * as object. If exactly one object is given, it is passed directly to the template. If you specify more than one
+ * object, they are ##merge#merged##.
+ * @return the list containing the new HTML nodes
+ *
+ * @see ##ht() is a shortcut for <code>fill(HTML())</code>.
+ * @see ##EE() is a different way of creating HTML nodes.
+ */
+ 'HTML': function () {
+ var div = EE('div');
+ return _(call(div['ht'], div, arguments)[0].childNodes);
+ },
+ /*$
+ * @stop
+ */
+
+ ///#/snippet extrasExports
+ ///#snippet utilExports
+ /*$
+ * @id underscore
+ * @group LIST
+ * @name _()
+ * @syntax _(item...)
+ * @configurable default
+ * @module UTIL
+ * Creates a new Minified list. Supports variable arguments so you can add items directly to the list. For arguments that are lists
+ * (as defined by ##_.isList()), the list content will be added to the new list. Unlike #dollar#$()#, this is not done recursively
+ * and thus you can create a list of lists by wrapping arguments in a list. Another difference between <var>_()</var> and <var>$()</var>
+ * is that <var>$()</var> will automatically remove <var>null</var> values while <var>_()</var> will keep them.
+ *
+ * @example Creating an empty list:
+ * <pre>_()</pre>
+ *
+ * @example Creating a list with three items:
+ * <pre>_(1, 2, 3)</pre>
+ *
+ * @example Creating the same list, but by passing an array. One array level will be flattened:
+ * <pre>_([1, 2, 3])</pre>
+ *
+ * @example Creating a list containing the arrays [1, 2] and [3, 4].
+ * <pre>_([[1, 2], [3, 4]])</pre>
+ *
+ * @example Merging two lists:
+ * <pre>var a = _("a", "b", "c");
+ * var b = _("x", "y", "z");
+ * var merged = _(a, b); // contains _("a", "b", "c", "x", "y", "z")
+ * </pre>
+ *
+ * @example Adding two elements to a list:
+ * <pre>var a = _(1, 2, 3);
+ * var a4 = _(a, 4); // contains _(1, 2, 3, 4)
+ * </pre>
+ *
+ * @example Mixing different list types and single elements:
+ * <pre>_(1, [], [2, 3], _(), _(4, 5)); // same content as _(1, 2, 3, 4, 5)</pre>
+ *
+ * @param item an item to add to the new list. If it is a list (as defined by ##_.isList()), its content will be to the new
+ * ##Minified list#list## (but NOT recursively).
+ */
+ '_': _,
+ /*$
+ * @stop
+ */
+ ///#/snippet utilExports
+ ///#snippet webExports
+
+ /*$
+ * @id dollar
+ * @group SELECTORS
+ * @requires
+ * @dependency yes
+ * @name $()
+ * @syntax $()
+ * @syntax $(selector)
+ * @syntax $(selector, context)
+ * @syntax $(selector, context, childOnly)
+ * @syntax $(list)
+ * @syntax $(list, context)
+ * @syntax $(list, context, childOnly)
+ * @syntax $(object)
+ * @syntax $(object, context)
+ * @syntax $(object, context, childOnly)
+ * @syntax $(domreadyFunction)
+ * @module WEB
+ * Creates a new ##list#Minified list##, or register a DOMReady-handler.
+ * The most common usage is with a CSS-like selector. <var>$()</var> will then create a list containing all elements of the current HTML
+ * document that fulfill the filter conditions. Alternatively you can also specify a list of objects or a single object.
+ * Nested lists will automatically be flattened, and nulls will automatically be removed from the resulting list.
+ * If you call <var>$()</var> without any arguments, it will return an empty list.
+ *
+ * Additionally, you can specify a second argument to provide a context. Contexts only make sense if you selected
+ * HTML nodes with the first parameter. Then the context limits the resulting list to include only those nodes
+ * that are descendants of the context nodes. The context can be either a selector, a list or a single HTML node, and will be
+ * processed like the first argument. A third arguments allows you to limit the list to
+ * only those elements that are direct children of the context nodes (so a child of a child would be filtered out).
+ *
+ * The lists created by <var>$()</var> are the same type as the ##list#Minified lists## created by Util's #underscore#_() constructor and other
+ * Util methods. All Util methods work on lists created by <var>$()</var>. If you want to add your own methods to those lists,
+ * use ##M#MINI.M##.
+ *
+ * As a special shortcut, if you pass a function to <var>$()</var>, it will be registered using #ready#$.ready() to be executed
+ * when the DOM model is complete.
+ *
+ * @example A simple selector to find an element by id.
+ * <pre>
+ * var l0 = $('#myElementId');
+ * </pre>
+ *
+ * @example You can pass an object reference to create a list containing only this element:
+ * <pre>
+ * var l1 = $(document.getElementById('myElementId'));
+ * </pre>
+ *
+ * @example Lists and arrays will be copied:
+ * <pre>
+ * var l2 = $([elementA, elementB, elementC]);
+ * </pre>
+ *
+ * @example Lists will be automatically flattened and nulls removed. So this list <var>l3</var> has the same content as <var>l2</var>:
+ * <pre>
+ * var l3 = $([elementA, [elementB, null, elementC], null]);
+ * </pre>
+ *
+ * @example This is a simple selector to find all elements with the given class.
+ * <pre>
+ * var l4 = $('.myClass');
+ * </pre>
+ *
+ * @example A selector to find all elements of the given type.
+ * <pre>
+ * var l5 = $('input'); // finds all input elements
+ * </pre>
+ *
+ * @example A selector to find all elements with the given type and class.
+ * <pre>
+ * var l6 = $('input.myRadio'); // finds all input elements with class 'myRadio'
+ * </pre>
+ *
+ * @example A selector to find all elements that are descendants of the given element.
+ * <pre>
+ * var l7 = $('#myForm input'); // finds all input elements contained in the element myForm
+ * </pre>
+ *
+ * @example A selector to find all elements that have either a CSS class 'a' or class 'b':
+ * <pre>
+ * var l8 = $('.a, .b'); // finds all elements that have class a or class b
+ * </pre>
+ *
+ * @example A selector that finds all elements that are descendants of the element myDivision, are inside an element with the
+ * class .myForm and are input elements:
+ * <pre>
+ * var l9 = $('#myDivision .myForm input');
+ * </pre>
+ *
+ * @example Contexts can make it easier to specify ancestors:
+ * <pre>
+ * var l10 = $('.myRadio', '#formA, #formB, #formC');
+ * </pre>
+ * The result is identical to:
+ * <pre>
+ * var l10 = $('#formA .myRadio, #formB .myRadio, #formC .myRadio');
+ * </pre>
+ *
+ * @example Using one of the list functions, ##set(), on the list, and setting the element's text color. '$' at the beginning of the property name sets a CSS value.
+ * <pre>
+ * $('#myElementId').set('$color', 'red');
+ * </pre>
+ *
+ * @example Most list methods return the list you invoked them on, allowing you to chain them:
+ * <pre>
+ * $('#myForm .myRadio').addClass('uncheckedRadio')
+ * .set('checked', true)
+ * .on('click', function() {
+ * $(this).set({@: 'uncheckedRadio');
+ * });
+ * </pre>
+ *
+ * @example Using $() as a #ready#$.ready() shortcut:
+ * <pre>
+ * $(function() {
+ * // in here you can safely work with the HTML document
+ * });
+ * </pre>
+ *
+ * @param selector a simple, CSS-like selector for HTML elements. It supports '#id' (lookup by id), '.class' (lookup by class),
+ * 'element' (lookup by elements) and 'element.class' (combined class and element). Use commas to combine several selectors.
+ * You can also join two or more selectors by space to find elements which are descendants of the previous selectors.
+ * For example, use 'div' to find all div elements, '.header' to find all elements containing a class name called 'header', and
+ * 'a.popup' for all a elements with the class 'popup'. To find all elements with 'header' or 'footer' class names,
+ * write '.header, .footer'. To find all divs elements below the element with the id 'main', use '#main div'.
+ * The selector "*" will return all elements.
+ * @param list a list to copy. It can be an array, another Minified list, a DOM nodelist or anything else that has a <var>length</var> property and
+ * allows read access by index. A shallow copy of the list will be returned. Nulls will be automatically removed from the copy. Nested lists
+ * will be flattened, so the result only contains nodes.
+ * @param object an object to create a single-element list containing only the object. If the argument is null, an empty list will be returned.
+ * @param domreadyFunction a function to be registered using #ready#$.ready().
+ * @param context optional an optional selector, node or list of nodes which specifies one or more common ancestor nodes for the selection. The context can be specified as
+ * a selector, a list or using a single object, just like the first argument.
+ * The returned list will contain only descendants of the context nodes. All others will be filtered out.
+ * @param childOnly optional if set, only direct children of the context nodes are included in the list. Children of children will be filtered out. If omitted or not
+ * true, all descendants of the context will be included.
+ * @return the array-like ##list#Minified list## object containing the content specified by the selector.
+ * Please note that if the first argument was a list, the existing order will be kept. If the first argument was a simple selector, the nodes are in document order.
+ * If you combined several selectors using commas, only the individual results of the selectors will keep the document order,
+ * but will then be joined to form a single list. This list will
+ * not be in document order anymore, unless you use a build without legacy IE support.
+ * Duplicate nodes will be removed from selectors, but not from lists.
+ *
+ * @see #underscore#_() is Util's alternative constructor for ##list#Minified lists##
+ * @see ##dollardollar#$$()## works like <var>$()</var>, but returns the resulting list's first element.
+ */
+ '$': $,
+
+ /*$
+ * @id dollardollar
+ * @group SELECTORS
+ * @requires
+ * @configurable default
+ * @name $$()
+ * @syntax $(selector)
+ * @syntax $(selector, context)
+ * @syntax $(selector, context, childOnly)
+ * @shortcut $$() - It is recommended that you assign MINI.$$ to a variable $$.
+ * @module WEB
+ * Returns a DOM object containing the first match of the given selector, or <var>undefined</var> if no match was found.
+ * <var>$$</var> allows you to easily access an element directly. It is the equivalent to writing <code>$(selector)[0]</code>.
+ *
+ * Please note that the function <var>$$</var> will not be automatically exported by Minified. You should always import it
+ * using the recommended import statement:
+ * <pre>
+ * var MINI = require('minified'), $ = MINI.$, $$ = MINI.$$, EE = MINI.EE;
+ * </pre>
+ *
+ * @example Select the checkbox 'myCheckbox':
+ * <pre>
+ * $$('#myCheckbox').checked = true;
+ * </pre>
+ *
+ * @param selector a simple, CSS-like selector for the element. Uses the same syntax as #dollar#$(). The most common
+ * parameter for this function is the id selector with the syntax "#id".
+ * @param context optional an optional selector, node or list of nodes which specifies one or more common ancestor nodes for the selection. The context can be specified as
+ * a selector, a list or using a single object, just like the first argument.
+ * The returned list will contain only descendants of the context nodes. All others will be filtered out.
+ * @param childOnly optional if set, only direct children of the context nodes are included in the list. Children of children will be filtered out. If omitted or not
+ * true, all descendants of the context will be included.
+ * @return a DOM object of the first match, or <var>undefined</var> if the selector did not return at least one match
+ *
+ * @see ##dollar#$()## creates a list using the selector, instead of returning only the first result.
+ */
+ '$$': $$,
+
+ /*$
+ * @id M
+ * @name M
+ * @syntax MINI.M
+ * @module WEB, UTIL
+ *
+ * Exposes the internal class used by all ##list#Minified lists##. This is mainly intended to allow you adding your
+ * own functions.
+ *
+ * @example Adding a function printLength() to <var>M</var>:
+ * <pre>
+ * MINI.M.prototype.printLength = function() { console.log(this.length); };
+ * </pre>
+ */
+ 'M': M,
+
+ /*$
+ * @id getter
+ * @requires get
+ * @name MINI.getter
+ * @syntax MINI.getter
+ * @module WEB
+ *
+ * Exposes a map of prefix handlers used by ##get(). You can add support for a new prefix in <var>get()</var>
+ * by adding a function to this map. The prefix can be any string consisting solely of non-alphanumeric characters
+ * that's not already used by Minified.
+ *
+ * You must not replace <var>getters</var> by a new map, but must always modify the existing map.
+ *
+ * The function's signature is <code>function(list, name)</code> where
+ * <dl><dt>list</dt><dd>Is the Minified list to get the value from. By convention you should always use only the first element. The list is
+ * non-empty and the first elememt can't be null or undefined (get() automatically returns <var>undefined</var> in
+ * all other case).</dd>
+ * <dt>name</dt><dd>The name of the property. That's the part AFTER the prefix.</dd>
+ * <dt class="returnValue">(callback return value)</dt><dd>The value to return to the user.</dd></dl>
+ *
+ * @example Adding a shortcut '||' for accessing border style properties:
+ * <pre>
+ * MINI.getter['||'] = function(list, name) {
+ * return list.get('$border' + name.replace(/^[a-z]/, function(a) { return a.toUpperCase()});
+ * };
+ *
+ * var borderColor = $('#box').get('||color'); // same as '$borderColor'
+ * var borderLeftRadius = $('#box').get('||leftRadius'); // same as '$borderLeftRadius'
+ * </pre>
+ *
+ * @example Adding XLink attribute support to get(). This is useful if you work with SVG. The prefix is '>'.
+ * <pre>
+ * MINI.getter['>'] = function(list, name) {
+ * return list[0].getAttributeNS('http://www.w3.org/1999/xlink', name);
+ * };
+ *
+ * var xlinkHref = $('#svgLink').get('>href');
+ * </pre>
+ */
+ 'getter': getter,
+
+ /*$
+ * @id setter
+ * @requires set
+ * @name MINI.setter
+ * @syntax MINI.setter
+ * @module WEB
+ *
+ * Exposes a map of prefix handlers used by ##set(). You can add support for a new prefix in <var>set()</var>
+ * by adding a function to this map. The prefix can be any string consisting solely of non-alphanumeric characters
+ * that's not already used by Minified.
+ *
+ * You must not replace <var>setters</var> by a new map, but must always modify the existing map.
+ *
+ * The function's signature is <code>function(list, name, value)</code> where
+ * <dl><dt>list</dt><dd>Is the Minified list to use.</dd>
+ * <dt>name</dt><dd>The name of the property. That's the part AFTER the prefix.</dd>
+ * <dt>value</dt><dd>Either the value to set, or a callback function to create the value that you must call for each
+ * value (see ##set() ).</dd>
+ * </dl>
+ *
+ * If you provide complete ##get() and ##set() support for a prefix, you are also able to use it in other Minified
+ * function such as ##animate() and ##toggle().
+ *
+ * @example Adding a shortcut '||' for accessing border style properties. As it's just calling ##set() for an existing
+ * property, it is not required to extra code for the callback.
+ * <pre>
+ * MINI.setter['||'] = function(list, name, value) {
+ * list.set('$border' + name.replace(/^[a-z]/, function(a) { return a.toUpperCase()}, value);
+ * };
+ *
+ * $('#box').set('||color', 'red'); // same as set('$borderColor', 'red')
+ * $('#box').set('||leftRadius', 4); // same as set('$borderLeftRadius', 4)
+ * </pre>
+ *
+ * @example Adding XLink attribute support to set(). This is useful if you work with SVG. The prefix is '>'.
+ * <pre>
+ * MINI.setter['>'] = function(list, name, value) {
+ * list.each(function(obj, index) {
+ * var v;
+ * if (_.isFunction(value))
+ * v = value(obj.getAttributeNS('http://www.w3.org/1999/xlink', name), index, obj);
+ * else
+ * v = value;
+ *
+ * if (v == null)
+ * obj.removeAttributeNS('http://www.w3.org/1999/xlink', name);
+ * else
+ * obj.setAttributeNS('http://www.w3.org/1999/xlink', name, v);
+ * });
+ * };
+ *
+ * $('#svgLink').set('>href', 'http://minifiedjs.com/');
+ * </pre>
+ */
+ 'setter': setter
+ /*$
+ * @stop
+ */
+ ///#/snippet webExports
+ };
+
+ ///#snippet commonAmdEnd
+});
+///#/snippet commonAmdEnd
+///#snippet webDocs
+
+/*$
+ * @id list
+ * @name Minified Lists
+ * @module WEB, UTIL
+ *
+ * <i>Minified lists</i> are Array-like objects provided by Minified. Like a regular JavaScript array,
+ * they provide a <var>length</var> property and you can access their content using the index operator (<code>a[5]</code>).
+ * However, they do not provide the same methods as JavaScript's native array and are designed to be immutable, so
+ * there is no direct way to add something to a Minified list. Instead Minified provides a number of functions and methods
+ * that take a list and create a modified copy which, for example, may contain additional elements.
+ *
+ * Minified lists are typically created either using the Web module's #dollar#$()</a></code> function or with the Util module's
+ * #underscore#_()</a></code> function, but many functions in the Util module also return a Minified list.
+ *
+ * The Util module provides a function ##_.array() that converts a Minified list to a regular JavaScript array.
+ */
+
+/*$
+ * @id promiseClass
+ * @name Promise
+ * @module WEB, UTIL
+ *
+ * <i>Promises</i> are objects that represent the future result of an asynchronous operation. When you start such an operation, using #request#$.request(),
+ * ##animate(), or ##wait(), you will get a Promise object that allows you to get the result as soon as the operation is finished.
+ *
+ * Minified's full distribution ships with a <a href="http://promises-aplus.github.io/promises-spec/">Promises/A+</a>-compliant implementation of Promises that should
+ * be able to interoperate with most other Promises implementations. Minified's Web module in stand-alone distribution comes with a limited implementation.
+ * See below for details.
+ *
+ * What may be somewhat surprising about this Promises specification is that the only standard-compliant way to access the result is to
+ * register callbacks. They will be invoked as soon as the operation is finished.
+ * If the operation already ended when you register the callbacks, the callback will then just be called from the event loop as soon
+ * as possible (but never while the ##then() you register them with is still running).<br/>
+ * This design forces you to handle the operation result asynchronously and disencourages 'bad' techniques such as polling.
+ *
+ * The central method of a Promise, and indeed the only required function in Promises/A+, is ##then(). It allows you to register
+ * two callback methods, one for success (called 'fulfillment' in Promises/A+ terminology) and one for failures (called 'rejection' in Promises/A+).
+ *
+ * This example shows you how to use <var>then()</var>:
+ * <pre>
+ * $.request('get', 'http://example.com/weather?zip=90210')
+ * .then(function success(result) {
+ * alert('The weather is ' + result);
+ * }, function error(exception) {
+ * alert('Something went wrong');
+ * });
+ * </pre>
+ *
+ * What makes Promises so special is that ##then() itself returns a new Promise, which is based on the Promise <var>then()</var> was called on, but can be
+ * modified by the outcome of callbacks. Both arguments to <var>then()</var> are optional, and you can also write the code like this:
+ * <pre>
+ * $.request('get', 'http://example.com/weather?zip=90210')
+ * .then(function success(result) {
+ * alert('The weather is ' + result);
+ * })
+ * .then(null, function error(exception) {
+ * alert('Something went wrong');
+ * });
+ * </pre>
+ *
+ * Because the first ##then() returns a new Promise based on the original Promise, the second <var>then()</var> will handle errors of the request just like
+ * the first one did. There is only one subtle difference in the second example: the error handler will not only be called if the request failed,
+ * but also when the request succeded but the success handler threw an exception. That's one of the two differences between the original Promise and
+ * the Promise returned by <var>then()</var>. Any exception thrown in a callback causes the new Promise to be in error state.
+ *
+ * Before I show you the second difference between the original Promise and the new Promise, let me make the example a bit more readable
+ * by using ##error(), which is not part of Promises/A+, but a simple extension by Minified. It just registers the failure callback without
+ * forcing you to specify <var>null</var> as first argument:
+ * <pre>
+ * $.request('get', 'http://example.com/weather?zip=90210')
+ * .then(function success(result) {
+ * alert('The weather is ' + result);
+ * })
+ * .error(function error(exception) { // error(callback) is equivalent to then(null, callback)
+ * alert('Something went wrong');
+ * });
+ * </pre>
+ *
+ * A very powerful capability of Promises is that you can easily chain them. If a ##then() callback returns a value, the new Promise returned
+ * by <var>then()</var> will be marked as success (fulfilled) and this value is the result of the operation. If a callback returns a Promise,
+ * the new Promise will assume the state of the returned Promise. You can use the latter to create chains of asynchronous operations,
+ * but you still need only a single error handler for all of them and you do not need to nest functions to achieve this:
+ * <pre>
+ * $.request('get', 'http://example.com/zipcode?location=Beverly+Hills,+CA')
+ * .then(function(resultZip) {
+ * return $.request('get', 'http://example.com/weather', {zip: resultZip});
+ * })
+ * .then(function(resultWeather) {
+ * alert('The weather in Beverly Hills is ' + resultWeather);
+ * })
+ * .error(function(exception) {
+ * alert('Something went wrong');
+ * });
+ * </pre>
+ *
+ * Only the full Minified distribution allows you to create promises yourself, using the ##promise() function. The Promises/A+
+ * specification does not specify how to fulfill a promise, but in Minified's implementation every Promise object has a function <code>fire()</code>
+ * that needs to be called when the promise result is ready. It requires two arguments.
+ * The first is a boolean, <var>true</var> for a successful operation and <var>false</var> for a failure. The second is an array or list containing the
+ * arguments to call the corresponding ##then() handler with.
+ *
+ * The following example is a function, similar to ##wait(), that returns a Promise which succeeds after the given amount
+ * of milliseconds has passed.
+ * It then fulfills the promise with the number of milliseconds as argument.
+ *
+ * <pre>
+ * function timeout(durationMs) {
+ * var p = _.promise();
+ * setTimeout(function() { p.fire(true, [durationMs]); }, durationMs);
+ * return p;
+ * }
+ * </pre>
+ * Call it like this:
+ * <pre>
+ * timeout(1000).then(function(ms) { window.alert(ms+ ' milliseconds have passed.'); });
+ * </pre>
+ *
+ * <h3>Limited Promises Implementation in Web module</h3>
+ * If you use only the Web module, instead of the full implementation, the promises implementation is not fully Promises/A+ compliant.
+ * One major difference is that it does not allow you create promises yourself. The only way to get a promise in the Web module
+ * is from functions like ##animate() and ##request(). The other difference is that the interoperability with other promises frameworks
+ * is limited, even though it should be good enough most of the time.
+ *
+ * There are two things you may run into when you use Web's simplified implementation with a complete implementation:
+ * <ol><li>The simplified implementation does not support recursive thenables. So when you register callbacks with ##then(),
+ * you can return a promise or a thenable, but only if that promise is not also returning a promise.</li>
+ * <li>Many corner cases required by the Promises/A+ specification are not handled. When interoperating using
+ * reasonable implementations, you may never run into this, but Promises/A+ has detailed rules for things like ##then()
+ * methods implemented as dynamic getter and returning a new value on each invocation or throwing exceptions. If you need
+ * a water-proof implementation, you need to use the complete implementation in Minified's full package.</li></ol>
+ */
+/*$
+ * @stop
+ */
+
+///#/snippet webDocs
+
--- /dev/null
+@import "clay/vars";
+@import "clay/mixins";
--- /dev/null
+@import "bourbon";
+@import "clay";
+
+html, body {
+ @include font-pfdin(regular);
+ -webkit-font-smoothing: antialiased;
+ font-size: $em-base;
+ line-height: $base-line-height;
+ height:100%;
+ color: $color-white;
+
+ &.platform-ios {
+ font-size: 16px;
+ }
+
+}
+
+body {
+ background-color: $color-gray-2;
+ padding: 0 $item-spacing-h $item-spacing-v;
+}
+
+em {
+ font-style: italic;
+}
+
+strong {
+ @include font-pfdin(medium);
+ color: $color-orange;
+}
+
+a {
+ color: $color-gray-8;
+
+ &:hover {
+ color: inherit;
+ }
+}
+
+h1, h2, h3, h4 {
+ text-transform: uppercase;
+ @include font-pfdin(medium);
+ @include pfdin-uppercase();
+}
+
+h1 {
+ @include font-size(2);
+}
+
+h2 {
+ @include font-size(1.8);
+}
+
+h3 {
+ @include font-size(1.5);
+}
+
+h4 {
+ @include font-size(1.2);
+}
+
+h5 {
+ @include font-size(1);
+}
+
+h6 {
+ @include font-size(0.8);
+}
+
+input {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+label {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: $item-spacing-v $item-spacing-h;
+
+ .input {
+ white-space: nowrap;
+ display: flex;
+ max-width: 50%;
+ margin-left: $item-spacing-h;
+ }
+
+ &.invalid .input:after {
+ $size: 1.1rem;
+
+ content: "!";
+ display: inline-block;
+ color: $color-white;
+ background: $color-orange;
+ border-radius: $size / 2;
+ width: $size;
+ text-align: center;
+ height: $size;
+ font-size: $size * 0.75;
+ vertical-align: middle;
+ line-height: $size;
+ box-shadow: $box-shadow-small-components;
+ @include font-pfdin(medium);
+ flex: 0 0 $size;
+ margin-left: 0.3rem;
+ }
+}
+
+.hide {
+ display: none !important;
+}
+
+.tap-highlight {
+ @include tap-highlight();
+ border-radius: $border-radius;
+}
+
+.component {
+ padding-top: $item-spacing-v;
+
+ &.disabled {
+ pointer-events: none;
+ > * {
+ opacity: 0.25;
+ }
+ }
+}
+
+.section {
+ background: $color-gray-4;
+ border-radius: 0.25rem;
+ box-shadow: $color-gray-1 0 0.15rem 0.25rem;
+
+ > .component {
+ padding-bottom: $item-spacing-v;
+ padding-right: $item-spacing-h;
+ padding-left: $item-spacing-h;
+ position: relative;
+ margin-top: 1rem;
+
+ &:not(.hide) ~ .component {
+ margin-top: 0;
+ }
+
+ &:first-child:after {
+ display: none;
+ }
+
+ &:after {
+ content: "";
+ background: $color-gray-6;
+ display: block;
+ position: absolute;
+ top: 0;
+ left: $item-spacing-h / 2;
+ right: $item-spacing-h / 2;
+ height: 1px;
+ pointer-events: none;
+ }
+ }
+
+ // don't show the separator for the first non-hidden item
+ > .component:not(.hide):after {
+ display: none;
+ }
+
+ > .component:not(.hide) ~ .component:not(.hide):after {
+ display: block;
+ }
+
+ > .component-heading:first-child {
+ background: $color-gray-3;
+ border-radius: $border-radius $border-radius 0 0;
+
+ // don't show the separator for the first non-hidden item after the heading
+ &:after,
+ ~ .component:not(.hide):after {
+ display: none;
+ }
+
+ ~ .component:not(.hide) ~ .component:not(.hide):after {
+ display: block;
+ }
+ }
+
+}
+
+.description {
+ padding: 0 $item-spacing-h $item-spacing-v ;
+ @include font-size(0.9);
+ color: $color-gray-9;
+ text-align: left;
+}
+
+.inputs {
+ display: block;
+ width:100%;
+ border-collapse: collapse;
+}
+
--- /dev/null
+@font-face {
+ font-family: PFDinDisplayProRegularWebfont;
+ src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
--- /dev/null
+@import "vars";
+
+@mixin font-pfdin($weight: normal) {
+
+ font-weight: normal;
+
+ @if $weight == normal or $weight == regular {
+ font-family: 'PFDinDisplayPro-Regular', PFDinDisplayProRegularWebfont, sans-serif;
+ }
+
+ @if $weight == medium {
+ // iOS includes the PFDinDisplayPro-Medium in the webview but Android does not,
+ // so we apply a faux bold on the regular weight.
+ font-family: 'PFDinDisplayPro-Medium', PFDinDisplayProRegularWebfont, sans-serif;
+
+ .platform-android & {
+ font-family: PFDinDisplayProRegularWebfont, sans-serif;
+ font-weight: bold;
+ letter-spacing: 0.025em;
+ }
+ }
+}
+
+@mixin pfdin-uppercase {
+ text-transform: uppercase;
+ position: relative;
+ top: 0.05rem;
+ line-height: 0.9;
+}
+
+@mixin font-size($size: 1) {
+ $font-size: $size * 1rem;
+ font-size:$font-size;
+ line-height: $base-line-height * ceil($font-size / $base-line-height);
+}
+
+@mixin tap-highlight($color: rgba(255, 255, 255, 0.1)) {
+ -webkit-tap-highlight-color: $color;
+
+ &:active {
+ background-color: $color;
+ }
+}
--- /dev/null
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0b1 | 201101
+ NOTE: WORK IN PROGRESS
+ USE WITH CAUTION AND TEST WITH ABANDON */
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+
+input, textarea, button {
+ outline: none;
+}
+
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+
+body {
+ line-height: 1;
+}
+
+ol, ul {
+ list-style: none;
+}
+
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+
+/* apply a natural box layout model to all elements, but allowing components to change */
+html {
+ box-sizing: border-box;
+}
+
+*, *:before, *:after {
+ box-sizing: inherit;
+}
--- /dev/null
+@import "bourbon";
+
+// Bourbon settings
+$em-base: 17px;
+
+// custom vars
+$base-line-height: 1.4;
+$base-height: rem($base-line-height * $em-base);
+$border-radius: 0.25rem;
+$item-spacing-v: $base-height / 2;
+$item-spacing-h: 0.75rem;
+$small-component-width: $base-height * $golden;
+
+// ---- Colors ------
+$color-orange: #ff4700;
+$color-orange-dark: #993d19;
+$color-red: #ff0000;
+$color-white: #ffffff;
+$color-black: #000000;
+
+// background color
+$color-gray-0: #111111;
+$color-gray-1: #2f2f2f;
+$color-gray-2: #333333;
+$color-gray-3: #414141;
+$color-gray-4: #484848; // divider
+$color-gray-5: #5b5b5b;
+$color-gray-6: #666666;
+$color-gray-7: #767676;
+$color-gray-8: #858585;
+$color-gray-9: #a4a4a4 ;
+$color-gray-10: #ececec;
+$color-gray-11: #f2f2f2;
+
+$button-padding: 0.6rem;
+$button-padding-ios: 0.5rem;
+
+$box-shadow-small-components: 0 0.1rem 0.1rem $color-gray-1;
+$box-shadow-large-components: 0 rem(3px) rem(15px) rgba(0,0,0,0.4);
--- /dev/null
+.component-button {
+ text-align: center;
+
+ .section & {
+ padding-bottom: 0;
+ }
+
+ .description {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
--- /dev/null
+@import "bourbon";
+@import "clay";
+
+.component-checkbox {
+
+ display: block;
+
+ .section & {
+ padding-right: $item-spacing-h / 2;
+ }
+
+ > .label {
+ display: block;
+ padding-bottom: $item-spacing-v / 2;
+ }
+
+ .checkbox-group {
+
+ padding-bottom: $item-spacing-v / 2;
+
+ label {
+ padding: $item-spacing-v / 2 $item-spacing-h / 2;
+ }
+
+ .label {
+ font-size: 0.9em;
+ }
+
+ input {
+ opacity: 0;
+ position: absolute;
+ }
+
+ i {
+ display: block;
+ position: relative;
+ border-radius: $border-radius;
+ width: $base-height;
+ height: $base-height;
+ border: rem(2px) solid $color-gray-7;
+ flex-shrink: 0;
+ }
+
+ input:checked + i {
+ border-color: $color-orange;
+ background: $color-orange;
+
+ &:after {
+ content: '';
+ box-sizing: border-box;
+ transform: rotate(45deg);
+ position: absolute;
+ left: 0.35rem;
+ top: -0.05rem;
+ display: block;
+ width: 0.5rem;
+ height: 1rem;
+ border: 0 solid $color-white;
+ border-right-width: rem(2px);
+ border-bottom-width: rem(2px);
+
+ }
+ }
+ }
+
+ .description {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
--- /dev/null
+@import "clay";
+
+.component-color {
+
+ .section & {
+ padding: 0;
+ }
+
+ .value {
+ width: $small-component-width;
+ height: $base-height;
+ border-radius: $base-height / 2;
+ box-shadow: $box-shadow-small-components;
+ display: block;
+ background: #000;
+ }
+
+ .picker-wrap {
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ position: fixed;
+ padding: $item-spacing-v $item-spacing-h /2;
+ background: rgba(0, 0, 0, 0.65);
+ opacity: 0;
+ transition: opacity 100ms ease-in 175ms;
+ pointer-events: none;
+ z-index: 100;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .picker {
+ padding: $item-spacing-v $item-spacing-h;
+ background: $color-gray-4;
+ box-shadow: $box-shadow-large-components;
+ border-radius: $border-radius;
+ width: 100%;
+ max-width: 26rem;
+ overflow: auto;
+ }
+
+ &.show {
+ transition-delay: 0ms;
+ pointer-events: auto;
+ opacity: 1;
+ }
+ }
+
+ .color-box-wrap {
+ box-sizing: border-box;
+ position: relative;
+ height: 0;
+ width: 100%;
+ padding: 0 0 100% 0; // overridden with inline style
+
+ .color-box-container {
+ position: absolute;
+ height: 99.97%;
+ width: 100%;
+ left: 0;
+ top: 0;
+
+ .color-box {
+ float:left;
+ cursor: pointer;
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+
+ &.rounded-tl {
+ border-top-left-radius: $border-radius;
+ }
+
+ &.rounded-tr {
+ border-top-right-radius: $border-radius;
+ }
+
+ &.rounded-bl {
+ border-bottom-left-radius: $border-radius;
+ }
+
+ &.rounded-br {
+ border-bottom-right-radius: $border-radius;
+ }
+
+ &.selected {
+ transform: scale(1.1);
+ border-radius: $border-radius;
+ box-shadow: #111 0 0 0.24rem;
+ position: relative;
+ z-index: 100;
+ }
+ }
+
+ }
+ }
+}
--- /dev/null
+@import "clay";
+
+.component-input {
+
+ .section & {
+ padding: 0;
+ }
+
+ label {
+ display: block;
+ }
+
+ .label {
+ padding-bottom: $item-spacing-v;
+ }
+
+ .input {
+ position: relative;
+ min-width: 100%;
+ margin-top: $item-spacing-v;
+ margin-left: 0;
+ }
+
+ input {
+ display:block;
+ width: 100%;
+ background: $color-gray-2;
+ border-radius: $border-radius;
+ padding: $item-spacing-v / 2 $item-spacing-h / 2;
+ border: none;
+ vertical-align: baseline;
+ color: $color-white;
+ font-size: inherit;
+ appearance: none;
+ min-height: $item-spacing-v + ($base-height + 0rem) ;
+
+ @include placeholder {
+ color: $color-gray-8;
+ }
+
+ &:focus {
+ @include placeholder {
+ color: $color-gray-6;
+ }
+ border: none;
+ box-shadow: none ;
+ }
+ }
+}
--- /dev/null
+@import "bourbon";
+@import "clay";
+
+.component-radio {
+
+ display: block;
+
+ .section & {
+ padding-right: $item-spacing-h / 2;
+ }
+
+ > .label {
+ display: block;
+ padding-bottom: $item-spacing-v / 2;
+ }
+
+ .radio-group {
+
+ padding-bottom: $item-spacing-v / 2;
+
+ label {
+ padding: $item-spacing-v / 2 $item-spacing-h / 2;
+ }
+
+ .label {
+ font-size: 0.9em;
+ }
+
+ input {
+ opacity: 0;
+ position: absolute;
+ }
+
+ i {
+ display: block;
+ position: relative;
+ border-radius: $base-height;
+ width: $base-height;
+ height: $base-height;
+ border: 2px solid $color-gray-7;
+ flex-shrink: 0;
+ }
+
+ input:checked + i {
+ border-color: $color-orange;
+
+ &:after {
+ $padding: 15%;
+ content: '';
+ display: block;
+ position: absolute;
+ left: $padding;
+ right: $padding;
+ top: $padding;
+ bottom: $padding;
+ border-radius: $base-height;
+ background: $color-orange;
+
+ }
+ }
+
+ }
+
+ .description {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
--- /dev/null
+@import "bourbon";
+@import "clay";
+
+.component-select {
+
+ .section & {
+ padding: 0;
+ }
+
+ label {
+ position: relative;
+ }
+
+ .value {
+ $triangle-size: 0.85rem;
+ position: relative;
+ padding-right: $triangle-size + 0.25rem;
+ display: block;
+
+ &:after {
+ content: "";
+ position: absolute;
+ right: 0;
+ top: 50%;
+ margin-top: -0.1rem;
+ @include triangle($triangle-size, $color-orange, down);
+ }
+ }
+
+ select {
+ opacity: 0;
+ position: absolute;
+ display: block;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ width: 100%;
+ border: none;
+ margin:0;
+ padding:0;
+ }
+}
--- /dev/null
+@import "clay";
+
+.component-slider {
+
+ .section & {
+ padding: 0;
+ }
+
+ label {
+ display: block;
+ }
+
+ .label-container {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding-bottom: $item-spacing-v;
+ }
+
+ .label {
+ flex: 1;
+ min-width: 1rem;
+ display: block;
+ padding-right: $item-spacing-h;
+ }
+
+ .value-wrap {
+ display: block;
+ position: relative;
+ }
+
+ .value,
+ .value-pad {
+ display: block;
+ background: $color-gray-2;
+ border-radius: $border-radius;
+ padding: $item-spacing-v / 2 $item-spacing-h / 2;
+ border: none;
+ vertical-align: baseline;
+ color: $color-white;
+ text-align: right;
+ margin: 0;
+ min-width: 1rem;
+ }
+
+ .value-pad {
+ visibility: hidden;
+
+ &:before {
+ content: ' ';
+ display: inline-block;
+ }
+ }
+
+ .value {
+ max-width: 100%;
+ position: absolute;
+ left:0;
+ top:0
+ }
+
+ .input-wrap {
+ padding: 0 $item-spacing-h $item-spacing-v;
+ }
+
+ .input {
+ $track-height: rem(3px);
+
+ display: block;
+ position: relative;
+ min-width: 100%;
+ height: $base-height;
+ overflow: hidden;
+ margin-left: 0;
+
+ &:before {
+ content: '';
+ display: block;
+ position: absolute;
+ height: $track-height;
+ background: $color-gray-6;
+ width: 100%;
+ top: $base-height / 2 - $track-height / 2;
+ }
+
+ .slider {
+ display: block;
+ width: 100%;
+ appearance: none;
+ position: relative;
+ height: $base-height;
+ margin: 0;
+ background-color: transparent;
+
+ &:focus {
+ outline: none;
+ }
+
+ &::-webkit-slider-runnable-track {
+ border: none;
+ height: $base-height;
+ width: 100%;
+ background-color: transparent;
+ }
+
+ &::-webkit-slider-thumb {
+ appearance: none;
+ position: relative;
+ height: $base-height;
+ width: $base-height;
+ background-color: $color-orange;
+ border-radius: 50%;
+
+ &:before {
+ content: "";
+ position: absolute;
+ left: -1000px;
+ top: $base-height / 2 - $track-height / 2;
+ height: $track-height;
+ width: 1001px;
+ background: $color-orange;
+ }
+ }
+ }
+ }
+
+}
--- /dev/null
+.component-submit {
+ text-align: center;
+}
--- /dev/null
+@import "clay";
+
+.component-toggle {
+
+ $slide-height: $base-height * 0.75;
+ $slide-width: $small-component-width;
+ $marker-diameter: $base-height;
+
+ .section & {
+ padding: 0;
+ }
+
+ input {
+ display: none; // @todo make sure this doesn't mess up interactivity on iOS
+ }
+
+ .graphic {
+ display: inline-block;
+ position: relative;
+
+ .slide {
+ display:block;
+ border-radius: $slide-height;
+ height: $slide-height;
+ width: $slide-width;
+ background: $color-gray-1;
+ transition: background-color 150ms linear;
+ }
+
+ .marker {
+ background: $color-gray-10;
+ width: $marker-diameter;
+ height: $marker-diameter;
+ border-radius: $marker-diameter;
+ position: absolute;
+ left: 0;
+ display: block;
+ top: ($marker-diameter - $slide-height) / 2 * -1;
+ transition: transform 150ms linear;
+ box-shadow: $box-shadow-small-components;
+ }
+ }
+
+ input:checked + .graphic {
+ .slide {
+ background: $color-orange-dark;
+ }
+
+ .marker {
+ background: $color-orange;
+ transform: translateX($slide-width - $marker-diameter);
+ }
+ }
+
+}
--- /dev/null
+@import "clay";
+
+button,
+.button {
+ @include font-pfdin(medium);
+ @include font-size(1);
+ text-transform: uppercase;
+ background-color: $color-gray-7;
+ border-radius: $border-radius;
+ border: none;
+ display: inline-block;
+
+ color: $color-white;
+ min-width: 12rem;
+ text-align: center;
+ margin: 0 auto $item-spacing-v;
+ padding: $button-padding;
+
+ @include tap-highlight($color-gray-8);
+
+ .platform-ios & {
+ padding: $button-padding-ios;
+ }
+
+ &.primary, &[type="submit"] {
+ background-color: $color-orange;
+
+ @include tap-highlight($color-red);
+ }
+}
+
+a.button {
+ text-decoration: none;
+ color: $color-white;
+}
--- /dev/null
+@import "clay/fonts";
+@import "clay/reset";
+@import "clay/base";
+@import "clay/elements/button";
--- /dev/null
+<div class="component component-button">
+ <button
+ type="button"
+ data-manipulator-target
+ class="{{primary ? 'primary' : ''}}"
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ ></button>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-checkbox">
+ <span class="label">{{{label}}}</span>
+ <div class="checkbox-group">
+ {{each options}}
+ <label class="tap-highlight">
+ <span class="label">{{{this}}}</span>
+ <input type="checkbox" value="1" name="clay-{{clayId}}" />
+ <i></i>
+ </label>
+ {{/each}}
+ </div>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-color">
+ <label class="tap-highlight">
+ <input
+ data-manipulator-target
+ type="hidden"
+ />
+ <span class="label">{{{label}}}</span>
+ <span class="value"></span>
+ </label>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+ <div class="picker-wrap">
+ <div class="picker">
+ <div class="color-box-wrap">
+ <div class="color-box-container"></div>
+ </div>
+ </div>
+ </div>
+</div>
--- /dev/null
+<footer data-manipulator-target class="component component-footer"></footer>
--- /dev/null
+<div class="component component-heading">
+ <h{{size}} data-manipulator-target></h{{size}}>
+</div>
--- /dev/null
+<div class="component component-input">
+ <label class="tap-highlight">
+ <span class="label">{{{label}}}</span>
+ <span class="input">
+ <input
+ data-manipulator-target
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ />
+ </span>
+ </label>
+
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-radio">
+ <span class="label">{{{label}}}</span>
+ <div class="radio-group">
+ {{each options}}
+ <label class="tap-highlight">
+ <span class="label">{{{this.label}}}</span>
+ <input
+ type="radio"
+ value="{{this.value}}"
+ name="clay-{{clayId}}"
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ />
+ <i></i>
+ </label>
+ {{/each}}
+ </div>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-select">
+ <label class="tap-highlight">
+ <span class="label">{{{label}}}</span>
+ <span class="value"></span>
+ <select data-manipulator-target {{each key: attributes}}{{key}}="{{this}}"{{/each}}>
+ {{each options}}
+ {{if Array.isArray(this.value)}}
+ <optgroup label="{{this.label}}">
+ {{each this.value}}
+ <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>
+ {{/each}}
+ </optgroup>
+ {{else}}
+ <option value="{{this.value}}" class="item-select-option">{{this.label}}</option>
+ {{/if}}
+ {{/each}}
+ </select>
+ </label>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-slider">
+ <label class="tap-highlight">
+ <span class="label-container">
+ <span class="label">{{{label}}}</span>
+ <span class="value-wrap">
+ <span class="value-pad"></span>
+ <input type="text" class="value" />
+ </span>
+ </span>
+ <span class="input">
+ <input
+ data-manipulator-target
+ class="slider"
+ type="range"
+ min="{{min}}"
+ max="{{max}}"
+ step="{{step}}"
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ />
+ </span>
+</label>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>
--- /dev/null
+<div class="component component-submit">
+ <button
+ data-manipulator-target
+ type="submit"
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ ></button>
+</div>
--- /dev/null
+<div class="component component-text">
+ <p data-manipulator-target></p>
+</div>
--- /dev/null
+<div class="component component-toggle">
+ <label class="tap-highlight">
+ <span class="label">{{{label}}}</span>
+ <span class="input">
+ <input
+ data-manipulator-target
+ type="checkbox"
+ {{each key: attributes}}{{key}}="{{this}}"{{/each}}
+ />
+ <span class="graphic">
+ <span class="slide"></span>
+ <span class="marker"></span>
+ </span>
+ </span>
+ </label>
+ {{if description}}
+ <div class="description">{{{description}}}</div>
+ {{/if}}
+</div>