mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-06-03 19:38:30 +02:00
Revert "Merge remote-tracking branch 'origin/master' into dev"
This reverts commit52750d933b, reversing changes made to7e7a85abfd.
This commit is contained in:
@@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/with-contenv bash
|
|
||||||
# ==============================================================================
|
|
||||||
# Community Hass.io Add-ons: esphomeyaml
|
|
||||||
# This files installs the user esphomeyaml version if specified
|
|
||||||
# ==============================================================================
|
|
||||||
# shellcheck disable=SC1091
|
|
||||||
source /usr/lib/hassio-addons/base.sh
|
|
||||||
|
|
||||||
declare esphomeyaml_version
|
|
||||||
|
|
||||||
if hass.config.has_value 'esphomeyaml_version'; then
|
|
||||||
esphomeyaml_version=$(hass.config.get 'esphomeyaml_version')
|
|
||||||
pip2 install --no-cache-dir --no-binary :all: "https://github.com/OttoWinter/esphomeyaml/archive/${esphomeyaml_version}.zip"
|
|
||||||
fi
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/usr/bin/execlineb -S0
|
|
||||||
# ==============================================================================
|
|
||||||
# Community Hass.io Add-ons: esphomeyaml
|
|
||||||
# Take down the S6 supervision tree when esphomeyaml fails
|
|
||||||
# ==============================================================================
|
|
||||||
if -n { s6-test $# -ne 0 }
|
|
||||||
if -n { s6-test ${1} -eq 256 }
|
|
||||||
|
|
||||||
s6-svscanctl -t /var/run/s6/services
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/with-contenv bash
|
|
||||||
# ==============================================================================
|
|
||||||
# Community Hass.io Add-ons: esphomeyaml
|
|
||||||
# Runs the esphomeyaml dashboard
|
|
||||||
# ==============================================================================
|
|
||||||
# shellcheck disable=SC1091
|
|
||||||
source /usr/lib/hassio-addons/base.sh
|
|
||||||
|
|
||||||
if hass.config.true 'leave_front_door_open'; then
|
|
||||||
export DISABLE_HA_AUTHENTICATION=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
hass.log.info "Starting esphomeyaml dashboard..."
|
|
||||||
exec esphomeyaml /config/esphomeyaml dashboard --socket /var/run/esphomeyaml.sock --hassio
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
; This file allows the docker build file to install the required platformio
|
||||||
|
; platforms
|
||||||
|
|
||||||
|
[env:espressif8266]
|
||||||
|
platform = espressif8266@1.8.0
|
||||||
|
board = nodemcuv2
|
||||||
|
framework = arduino
|
||||||
|
|
||||||
|
[env:espressif32]
|
||||||
|
platform = espressif32@1.5.0
|
||||||
|
board = nodemcu-32s
|
||||||
|
framework = arduino
|
||||||
@@ -1,330 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
// The Home Assistant protocol is structured as a simple
|
|
||||||
// TCP socket with short binary messages encoded in the protocol buffers format
|
|
||||||
// First, a message in this protocol has a specific format:
|
|
||||||
// * VarInt denoting the size of the message object. (type is not part of this)
|
|
||||||
// * VarInt denoting the type of message.
|
|
||||||
// * The message object encoded as a ProtoBuf message
|
|
||||||
|
|
||||||
// The connection is established in 4 steps:
|
|
||||||
// * First, the client connects to the server and sends a "Hello Request" identifying itself
|
|
||||||
// * The server responds with a "Hello Response" and selects the protocol version
|
|
||||||
// * After receiving this message, the client attempts to authenticate itself using
|
|
||||||
// the password and a "Connect Request"
|
|
||||||
// * The server responds with a "Connect Response" and notifies of invalid password.
|
|
||||||
// If anything in this initial process fails, the connection must immediately closed
|
|
||||||
// by both sides and _no_ disconnection message is to be sent.
|
|
||||||
|
|
||||||
// Message sent at the beginning of each connection
|
|
||||||
// Can only be sent by the client and only at the beginning of the connection
|
|
||||||
message HelloRequest {
|
|
||||||
// Description of client (like User Agent)
|
|
||||||
// For example "Home Assistant"
|
|
||||||
// Not strictly necessary to send but nice for debugging
|
|
||||||
// purposes.
|
|
||||||
string client_info = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Confirmation of successful connection request.
|
|
||||||
// Can only be sent by the server and only at the beginning of the connection
|
|
||||||
message HelloResponse {
|
|
||||||
// The version of the API to use. The _client_ (for example Home Assistant) needs to check
|
|
||||||
// for compatibility and if necessary adopt to an older API.
|
|
||||||
// Major is for breaking changes in the base protocol - a mismatch will lead to immediate disconnect_client_
|
|
||||||
// Minor is for breaking changes in individual messages - a mismatch will lead to a warning message
|
|
||||||
uint32 api_version_major = 1;
|
|
||||||
uint32 api_version_minor = 2;
|
|
||||||
|
|
||||||
// A string identifying the server (ESP); like client info this may be empty
|
|
||||||
// and only exists for debugging/logging purposes.
|
|
||||||
// For example "ESPHome v1.10.0 on ESP8266"
|
|
||||||
string server_info = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Message sent at the beginning of each connection to authenticate the client
|
|
||||||
// Can only be sent by the client and only at the beginning of the connection
|
|
||||||
message ConnectRequest {
|
|
||||||
// The password to log in with
|
|
||||||
string password = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Confirmation of successful connection. After this the connection is available for all traffic.
|
|
||||||
// Can only be sent by the server and only at the beginning of the connection
|
|
||||||
message ConnectResponse {
|
|
||||||
bool invalid_password = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request to close the connection.
|
|
||||||
// Can be sent by both the client and server
|
|
||||||
message DisconnectRequest {
|
|
||||||
// Do not close the connection before the acknowledgement arrives
|
|
||||||
}
|
|
||||||
|
|
||||||
message DisconnectResponse {
|
|
||||||
// Empty - Both parties are required to close the connection after this
|
|
||||||
// message has been received.
|
|
||||||
}
|
|
||||||
|
|
||||||
message PingRequest {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message PingResponse {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message DeviceInfoRequest {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message DeviceInfoResponse {
|
|
||||||
bool uses_password = 1;
|
|
||||||
|
|
||||||
// The name of the node, given by "App.set_name()"
|
|
||||||
string name = 2;
|
|
||||||
|
|
||||||
// The mac address of the device. For example "AC:BC:32:89:0E:A9"
|
|
||||||
string mac_address = 3;
|
|
||||||
|
|
||||||
// A string describing the ESPHome version. For example "1.10.0"
|
|
||||||
string esphome_core_version = 4;
|
|
||||||
|
|
||||||
// A string describing the date of compilation, this is generated by the compiler
|
|
||||||
// and therefore may not be in the same format all the time.
|
|
||||||
// If the user isn't using esphomeyaml, this will also not be set.
|
|
||||||
string compilation_time = 5;
|
|
||||||
|
|
||||||
// The model of the board. For example NodeMCU
|
|
||||||
string model = 6;
|
|
||||||
|
|
||||||
bool has_deep_sleep = 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
message ListEntitiesRequest {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message ListEntitiesBinarySensorResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
string device_class = 5;
|
|
||||||
bool is_status_binary_sensor = 6;
|
|
||||||
}
|
|
||||||
message ListEntitiesCoverResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
bool is_optimistic = 5;
|
|
||||||
}
|
|
||||||
message ListEntitiesFanResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
bool supports_oscillation = 5;
|
|
||||||
bool supports_speed = 6;
|
|
||||||
}
|
|
||||||
message ListEntitiesLightResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
bool supports_brightness = 5;
|
|
||||||
bool supports_rgb = 6;
|
|
||||||
bool supports_white_value = 7;
|
|
||||||
bool supports_color_temperature = 8;
|
|
||||||
float min_mireds = 9;
|
|
||||||
float max_mireds = 10;
|
|
||||||
repeated string effects = 11;
|
|
||||||
}
|
|
||||||
message ListEntitiesSensorResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
string icon = 5;
|
|
||||||
string unit_of_measurement = 6;
|
|
||||||
int32 accuracy_decimals = 7;
|
|
||||||
}
|
|
||||||
message ListEntitiesSwitchResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
string icon = 5;
|
|
||||||
bool optimistic = 6;
|
|
||||||
}
|
|
||||||
message ListEntitiesTextSensorResponse {
|
|
||||||
string object_id = 1;
|
|
||||||
fixed32 key = 2;
|
|
||||||
string name = 3;
|
|
||||||
string unique_id = 4;
|
|
||||||
|
|
||||||
string icon = 5;
|
|
||||||
}
|
|
||||||
message ListEntitiesDoneResponse {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubscribeStatesRequest {
|
|
||||||
// Empty
|
|
||||||
}
|
|
||||||
message BinarySensorStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool state = 2;
|
|
||||||
}
|
|
||||||
message CoverStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
enum CoverState {
|
|
||||||
OPEN = 0;
|
|
||||||
CLOSED = 1;
|
|
||||||
}
|
|
||||||
CoverState state = 2;
|
|
||||||
}
|
|
||||||
enum FanSpeed {
|
|
||||||
LOW = 0;
|
|
||||||
MEDIUM = 1;
|
|
||||||
HIGH = 2;
|
|
||||||
}
|
|
||||||
message FanStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool state = 2;
|
|
||||||
bool oscillating = 3;
|
|
||||||
FanSpeed speed = 4;
|
|
||||||
}
|
|
||||||
message LightStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool state = 2;
|
|
||||||
float brightness = 3;
|
|
||||||
float red = 4;
|
|
||||||
float green = 5;
|
|
||||||
float blue = 6;
|
|
||||||
float white = 7;
|
|
||||||
float color_temperature = 8;
|
|
||||||
string effect = 9;
|
|
||||||
}
|
|
||||||
message SensorStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
float state = 2;
|
|
||||||
}
|
|
||||||
message SwitchStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool state = 2;
|
|
||||||
}
|
|
||||||
message TextSensorStateResponse {
|
|
||||||
fixed32 key = 1;
|
|
||||||
string state = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message CoverCommandRequest {
|
|
||||||
fixed32 key = 1;
|
|
||||||
enum CoverCommand {
|
|
||||||
OPEN = 0;
|
|
||||||
CLOSE = 1;
|
|
||||||
STOP = 2;
|
|
||||||
}
|
|
||||||
bool has_state = 2;
|
|
||||||
CoverCommand command = 3;
|
|
||||||
}
|
|
||||||
message FanCommandRequest {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool has_state = 2;
|
|
||||||
bool state = 3;
|
|
||||||
bool has_speed = 4;
|
|
||||||
FanSpeed speed = 5;
|
|
||||||
bool has_oscillating = 6;
|
|
||||||
bool oscillating = 7;
|
|
||||||
}
|
|
||||||
message LightCommandRequest {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool has_state = 2;
|
|
||||||
bool state = 3;
|
|
||||||
bool has_brightness = 4;
|
|
||||||
float brightness = 5;
|
|
||||||
bool has_rgb = 6;
|
|
||||||
float red = 7;
|
|
||||||
float green = 8;
|
|
||||||
float blue = 9;
|
|
||||||
bool has_white = 10;
|
|
||||||
float white = 11;
|
|
||||||
bool has_color_temperature = 12;
|
|
||||||
float color_temperature = 13;
|
|
||||||
bool has_transition_length = 14;
|
|
||||||
uint32 transition_length = 15;
|
|
||||||
bool has_flash_length = 16;
|
|
||||||
uint32 flash_length = 17;
|
|
||||||
bool has_effect = 18;
|
|
||||||
string effect = 19;
|
|
||||||
}
|
|
||||||
message SwitchCommandRequest {
|
|
||||||
fixed32 key = 1;
|
|
||||||
bool state = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum LogLevel {
|
|
||||||
NONE = 0;
|
|
||||||
ERROR = 1;
|
|
||||||
WARN = 2;
|
|
||||||
INFO = 3;
|
|
||||||
DEBUG = 4;
|
|
||||||
VERBOSE = 5;
|
|
||||||
VERY_VERBOSE = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubscribeLogsRequest {
|
|
||||||
LogLevel level = 1;
|
|
||||||
bool dump_config = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubscribeLogsResponse {
|
|
||||||
LogLevel level = 1;
|
|
||||||
string tag = 2;
|
|
||||||
string message = 3;
|
|
||||||
bool send_failed = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubscribeServiceCallsRequest {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
message ServiceCallResponse {
|
|
||||||
string service = 1;
|
|
||||||
map<string, string> data = 2;
|
|
||||||
map<string, string> data_template = 3;
|
|
||||||
map<string, string> variables = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. Client sends SubscribeHomeAssistantStatesRequest
|
|
||||||
// 2. Server responds with zero or more SubscribeHomeAssistantStateResponse (async)
|
|
||||||
// 3. Client sends HomeAssistantStateResponse for state changes.
|
|
||||||
message SubscribeHomeAssistantStatesRequest {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
message SubscribeHomeAssistantStateResponse {
|
|
||||||
string entity_id = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message HomeAssistantStateResponse {
|
|
||||||
string entity_id = 1;
|
|
||||||
string state = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetTimeRequest {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
message GetTimeResponse {
|
|
||||||
fixed32 epoch_seconds = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,490 +0,0 @@
|
|||||||
from datetime import datetime
|
|
||||||
import functools
|
|
||||||
import logging
|
|
||||||
import socket
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
|
|
||||||
# pylint: disable=unused-import
|
|
||||||
from typing import Optional # noqa
|
|
||||||
from google.protobuf import message # noqa
|
|
||||||
|
|
||||||
from esphomeyaml import const
|
|
||||||
import esphomeyaml.api.api_pb2 as pb
|
|
||||||
from esphomeyaml.const import CONF_PASSWORD, CONF_PORT
|
|
||||||
from esphomeyaml.core import EsphomeyamlError
|
|
||||||
from esphomeyaml.helpers import resolve_ip_address, indent, color
|
|
||||||
from esphomeyaml.py_compat import text_type, IS_PY2, byte_to_bytes, char_to_byte, format_bytes
|
|
||||||
from esphomeyaml.util import safe_print
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class APIConnectionError(EsphomeyamlError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
MESSAGE_TYPE_TO_PROTO = {
|
|
||||||
1: pb.HelloRequest,
|
|
||||||
2: pb.HelloResponse,
|
|
||||||
3: pb.ConnectRequest,
|
|
||||||
4: pb.ConnectResponse,
|
|
||||||
5: pb.DisconnectRequest,
|
|
||||||
6: pb.DisconnectResponse,
|
|
||||||
7: pb.PingRequest,
|
|
||||||
8: pb.PingResponse,
|
|
||||||
9: pb.DeviceInfoRequest,
|
|
||||||
10: pb.DeviceInfoResponse,
|
|
||||||
11: pb.ListEntitiesRequest,
|
|
||||||
12: pb.ListEntitiesBinarySensorResponse,
|
|
||||||
13: pb.ListEntitiesCoverResponse,
|
|
||||||
14: pb.ListEntitiesFanResponse,
|
|
||||||
15: pb.ListEntitiesLightResponse,
|
|
||||||
16: pb.ListEntitiesSensorResponse,
|
|
||||||
17: pb.ListEntitiesSwitchResponse,
|
|
||||||
18: pb.ListEntitiesTextSensorResponse,
|
|
||||||
19: pb.ListEntitiesDoneResponse,
|
|
||||||
20: pb.SubscribeStatesRequest,
|
|
||||||
21: pb.BinarySensorStateResponse,
|
|
||||||
22: pb.CoverStateResponse,
|
|
||||||
23: pb.FanStateResponse,
|
|
||||||
24: pb.LightStateResponse,
|
|
||||||
25: pb.SensorStateResponse,
|
|
||||||
26: pb.SwitchStateResponse,
|
|
||||||
27: pb.TextSensorStateResponse,
|
|
||||||
28: pb.SubscribeLogsRequest,
|
|
||||||
29: pb.SubscribeLogsResponse,
|
|
||||||
30: pb.CoverCommandRequest,
|
|
||||||
31: pb.FanCommandRequest,
|
|
||||||
32: pb.LightCommandRequest,
|
|
||||||
33: pb.SwitchCommandRequest,
|
|
||||||
34: pb.SubscribeServiceCallsRequest,
|
|
||||||
35: pb.ServiceCallResponse,
|
|
||||||
36: pb.GetTimeRequest,
|
|
||||||
37: pb.GetTimeResponse,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _varuint_to_bytes(value):
|
|
||||||
if value <= 0x7F:
|
|
||||||
return byte_to_bytes(value)
|
|
||||||
|
|
||||||
ret = bytes()
|
|
||||||
while value:
|
|
||||||
temp = value & 0x7F
|
|
||||||
value >>= 7
|
|
||||||
if value:
|
|
||||||
ret += byte_to_bytes(temp | 0x80)
|
|
||||||
else:
|
|
||||||
ret += byte_to_bytes(temp)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def _bytes_to_varuint(value):
|
|
||||||
result = 0
|
|
||||||
bitpos = 0
|
|
||||||
for c in value:
|
|
||||||
val = char_to_byte(c)
|
|
||||||
result |= (val & 0x7F) << bitpos
|
|
||||||
bitpos += 7
|
|
||||||
if (val & 0x80) == 0:
|
|
||||||
return result
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes,not-callable
|
|
||||||
class APIClient(threading.Thread):
|
|
||||||
def __init__(self, address, port, password):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self._address = address # type: str
|
|
||||||
self._port = port # type: int
|
|
||||||
self._password = password # type: Optional[str]
|
|
||||||
self._socket = None # type: Optional[socket.socket]
|
|
||||||
self._socket_open_event = threading.Event()
|
|
||||||
self._socket_write_lock = threading.Lock()
|
|
||||||
self._connected = False
|
|
||||||
self._authenticated = False
|
|
||||||
self._message_handlers = []
|
|
||||||
self._keepalive = 5
|
|
||||||
self._ping_timer = None
|
|
||||||
self._refresh_ping()
|
|
||||||
|
|
||||||
self.on_disconnect = None
|
|
||||||
self.on_connect = None
|
|
||||||
self.on_login = None
|
|
||||||
self.auto_reconnect = False
|
|
||||||
self._running_event = threading.Event()
|
|
||||||
self._stop_event = threading.Event()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def stopped(self):
|
|
||||||
return self._stop_event.is_set()
|
|
||||||
|
|
||||||
def _refresh_ping(self):
|
|
||||||
if self._ping_timer is not None:
|
|
||||||
self._ping_timer.cancel()
|
|
||||||
self._ping_timer = None
|
|
||||||
|
|
||||||
def func():
|
|
||||||
self._ping_timer = None
|
|
||||||
|
|
||||||
if self._connected:
|
|
||||||
try:
|
|
||||||
self.ping()
|
|
||||||
except APIConnectionError:
|
|
||||||
self._fatal_error()
|
|
||||||
else:
|
|
||||||
self._refresh_ping()
|
|
||||||
|
|
||||||
self._ping_timer = threading.Timer(self._keepalive, func)
|
|
||||||
self._ping_timer.start()
|
|
||||||
|
|
||||||
def _cancel_ping(self):
|
|
||||||
if self._ping_timer is not None:
|
|
||||||
self._ping_timer.cancel()
|
|
||||||
self._ping_timer = None
|
|
||||||
|
|
||||||
def _close_socket(self):
|
|
||||||
self._cancel_ping()
|
|
||||||
if self._socket is not None:
|
|
||||||
self._socket.close()
|
|
||||||
self._socket = None
|
|
||||||
self._socket_open_event.clear()
|
|
||||||
self._connected = False
|
|
||||||
self._authenticated = False
|
|
||||||
self._message_handlers = []
|
|
||||||
|
|
||||||
def stop(self, force=False):
|
|
||||||
if self.stopped:
|
|
||||||
raise ValueError
|
|
||||||
|
|
||||||
if self._connected and not force:
|
|
||||||
try:
|
|
||||||
self.disconnect()
|
|
||||||
except APIConnectionError:
|
|
||||||
pass
|
|
||||||
self._close_socket()
|
|
||||||
|
|
||||||
self._stop_event.set()
|
|
||||||
if not force:
|
|
||||||
self.join()
|
|
||||||
|
|
||||||
def connect(self):
|
|
||||||
if not self._running_event.wait(0.1):
|
|
||||||
raise APIConnectionError("You need to call start() first!")
|
|
||||||
|
|
||||||
if self._connected:
|
|
||||||
raise APIConnectionError("Already connected!")
|
|
||||||
|
|
||||||
try:
|
|
||||||
ip = resolve_ip_address(self._address)
|
|
||||||
except EsphomeyamlError as err:
|
|
||||||
_LOGGER.warning("Error resolving IP address of %s. Is it connected to WiFi?",
|
|
||||||
self._address)
|
|
||||||
_LOGGER.warning("(If this error persists, please set a static IP address: "
|
|
||||||
"https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips)")
|
|
||||||
raise APIConnectionError(err)
|
|
||||||
|
|
||||||
_LOGGER.info("Connecting to %s:%s (%s)", self._address, self._port, ip)
|
|
||||||
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
self._socket.settimeout(10.0)
|
|
||||||
self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
||||||
try:
|
|
||||||
self._socket.connect((ip, self._port))
|
|
||||||
except socket.error as err:
|
|
||||||
self._fatal_error()
|
|
||||||
raise APIConnectionError("Error connecting to {}: {}".format(ip, err))
|
|
||||||
self._socket.settimeout(0.1)
|
|
||||||
|
|
||||||
self._socket_open_event.set()
|
|
||||||
|
|
||||||
hello = pb.HelloRequest()
|
|
||||||
hello.client_info = 'esphomeyaml v{}'.format(const.__version__)
|
|
||||||
try:
|
|
||||||
resp = self._send_message_await_response(hello, pb.HelloResponse)
|
|
||||||
except APIConnectionError as err:
|
|
||||||
self._fatal_error()
|
|
||||||
raise err
|
|
||||||
_LOGGER.debug("Successfully connected to %s ('%s' API=%s.%s)", self._address,
|
|
||||||
resp.server_info, resp.api_version_major, resp.api_version_minor)
|
|
||||||
self._connected = True
|
|
||||||
if self.on_connect is not None:
|
|
||||||
self.on_connect()
|
|
||||||
|
|
||||||
def _check_connected(self):
|
|
||||||
if not self._connected:
|
|
||||||
self._fatal_error()
|
|
||||||
raise APIConnectionError("Must be connected!")
|
|
||||||
|
|
||||||
def login(self):
|
|
||||||
self._check_connected()
|
|
||||||
if self._authenticated:
|
|
||||||
raise APIConnectionError("Already logged in!")
|
|
||||||
|
|
||||||
connect = pb.ConnectRequest()
|
|
||||||
if self._password is not None:
|
|
||||||
connect.password = self._password
|
|
||||||
resp = self._send_message_await_response(connect, pb.ConnectResponse)
|
|
||||||
if resp.invalid_password:
|
|
||||||
raise APIConnectionError("Invalid password!")
|
|
||||||
|
|
||||||
self._authenticated = True
|
|
||||||
if self.on_login is not None:
|
|
||||||
self.on_login()
|
|
||||||
|
|
||||||
def _fatal_error(self):
|
|
||||||
was_connected = self._connected
|
|
||||||
|
|
||||||
self._close_socket()
|
|
||||||
|
|
||||||
if was_connected and self.on_disconnect is not None:
|
|
||||||
self.on_disconnect()
|
|
||||||
|
|
||||||
def _write(self, data): # type: (bytes) -> None
|
|
||||||
if self._socket is None:
|
|
||||||
raise APIConnectionError("Socket closed")
|
|
||||||
|
|
||||||
_LOGGER.debug("Write: %s", format_bytes(data))
|
|
||||||
with self._socket_write_lock:
|
|
||||||
try:
|
|
||||||
self._socket.sendall(data)
|
|
||||||
except socket.error as err:
|
|
||||||
self._fatal_error()
|
|
||||||
raise APIConnectionError("Error while writing data: {}".format(err))
|
|
||||||
|
|
||||||
def _send_message(self, msg):
|
|
||||||
# type: (message.Message) -> None
|
|
||||||
for message_type, klass in MESSAGE_TYPE_TO_PROTO.items():
|
|
||||||
if isinstance(msg, klass):
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
raise ValueError
|
|
||||||
|
|
||||||
encoded = msg.SerializeToString()
|
|
||||||
_LOGGER.debug("Sending %s:\n%s", type(msg), indent(text_type(msg)))
|
|
||||||
if IS_PY2:
|
|
||||||
req = chr(0x00)
|
|
||||||
else:
|
|
||||||
req = bytes([0])
|
|
||||||
req += _varuint_to_bytes(len(encoded))
|
|
||||||
req += _varuint_to_bytes(message_type)
|
|
||||||
req += encoded
|
|
||||||
self._write(req)
|
|
||||||
self._refresh_ping()
|
|
||||||
|
|
||||||
def _send_message_await_response_complex(self, send_msg, do_append, do_stop, timeout=1):
|
|
||||||
event = threading.Event()
|
|
||||||
responses = []
|
|
||||||
|
|
||||||
def on_message(resp):
|
|
||||||
if do_append(resp):
|
|
||||||
responses.append(resp)
|
|
||||||
if do_stop(resp):
|
|
||||||
event.set()
|
|
||||||
|
|
||||||
self._message_handlers.append(on_message)
|
|
||||||
self._send_message(send_msg)
|
|
||||||
ret = event.wait(timeout)
|
|
||||||
try:
|
|
||||||
self._message_handlers.remove(on_message)
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
if not ret:
|
|
||||||
raise APIConnectionError("Timeout while waiting for message response!")
|
|
||||||
return responses
|
|
||||||
|
|
||||||
def _send_message_await_response(self, send_msg, response_type, timeout=1):
|
|
||||||
def is_response(msg):
|
|
||||||
return isinstance(msg, response_type)
|
|
||||||
|
|
||||||
return self._send_message_await_response_complex(send_msg, is_response, is_response,
|
|
||||||
timeout)[0]
|
|
||||||
|
|
||||||
def device_info(self):
|
|
||||||
self._check_connected()
|
|
||||||
return self._send_message_await_response(pb.DeviceInfoRequest(), pb.DeviceInfoResponse)
|
|
||||||
|
|
||||||
def ping(self):
|
|
||||||
self._check_connected()
|
|
||||||
return self._send_message_await_response(pb.PingRequest(), pb.PingResponse)
|
|
||||||
|
|
||||||
def disconnect(self):
|
|
||||||
self._check_connected()
|
|
||||||
|
|
||||||
try:
|
|
||||||
self._send_message_await_response(pb.DisconnectRequest(), pb.DisconnectResponse)
|
|
||||||
except APIConnectionError:
|
|
||||||
pass
|
|
||||||
self._close_socket()
|
|
||||||
|
|
||||||
if self.on_disconnect is not None:
|
|
||||||
self.on_disconnect()
|
|
||||||
|
|
||||||
def _check_authenticated(self):
|
|
||||||
if not self._authenticated:
|
|
||||||
raise APIConnectionError("Must login first!")
|
|
||||||
|
|
||||||
def subscribe_logs(self, on_log, log_level=None, dump_config=False):
|
|
||||||
self._check_authenticated()
|
|
||||||
|
|
||||||
def on_msg(msg):
|
|
||||||
if isinstance(msg, pb.SubscribeLogsResponse):
|
|
||||||
on_log(msg)
|
|
||||||
|
|
||||||
self._message_handlers.append(on_msg)
|
|
||||||
req = pb.SubscribeLogsRequest(dump_config=dump_config)
|
|
||||||
if log_level is not None:
|
|
||||||
req.level = log_level
|
|
||||||
self._send_message(req)
|
|
||||||
|
|
||||||
def _recv(self, amount):
|
|
||||||
ret = bytes()
|
|
||||||
if amount == 0:
|
|
||||||
return ret
|
|
||||||
|
|
||||||
while len(ret) < amount:
|
|
||||||
if self.stopped:
|
|
||||||
raise APIConnectionError("Stopped!")
|
|
||||||
if not self._socket_open_event.is_set():
|
|
||||||
raise APIConnectionError("No socket!")
|
|
||||||
try:
|
|
||||||
val = self._socket.recv(amount - len(ret))
|
|
||||||
except AttributeError:
|
|
||||||
raise APIConnectionError("Socket was closed")
|
|
||||||
except socket.timeout:
|
|
||||||
continue
|
|
||||||
except socket.error as err:
|
|
||||||
raise APIConnectionError("Error while receiving data: {}".format(err))
|
|
||||||
ret += val
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _recv_varint(self):
|
|
||||||
raw = bytes()
|
|
||||||
while not raw or char_to_byte(raw[-1]) & 0x80:
|
|
||||||
raw += self._recv(1)
|
|
||||||
return _bytes_to_varuint(raw)
|
|
||||||
|
|
||||||
def _run_once(self):
|
|
||||||
if not self._socket_open_event.wait(0.1):
|
|
||||||
return
|
|
||||||
|
|
||||||
# Preamble
|
|
||||||
if char_to_byte(self._recv(1)[0]) != 0x00:
|
|
||||||
raise APIConnectionError("Invalid preamble")
|
|
||||||
|
|
||||||
length = self._recv_varint()
|
|
||||||
msg_type = self._recv_varint()
|
|
||||||
|
|
||||||
raw_msg = self._recv(length)
|
|
||||||
if msg_type not in MESSAGE_TYPE_TO_PROTO:
|
|
||||||
_LOGGER.debug("Skipping message type %s", msg_type)
|
|
||||||
return
|
|
||||||
|
|
||||||
msg = MESSAGE_TYPE_TO_PROTO[msg_type]()
|
|
||||||
msg.ParseFromString(raw_msg)
|
|
||||||
_LOGGER.debug("Got message: %s:\n%s", type(msg), indent(str(msg)))
|
|
||||||
for msg_handler in self._message_handlers[:]:
|
|
||||||
msg_handler(msg)
|
|
||||||
self._handle_internal_messages(msg)
|
|
||||||
self._refresh_ping()
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self._running_event.set()
|
|
||||||
while not self.stopped:
|
|
||||||
try:
|
|
||||||
self._run_once()
|
|
||||||
except APIConnectionError as err:
|
|
||||||
if self.stopped:
|
|
||||||
break
|
|
||||||
if self._connected:
|
|
||||||
_LOGGER.error("Error while reading incoming messages: %s", err)
|
|
||||||
self._fatal_error()
|
|
||||||
self._running_event.clear()
|
|
||||||
|
|
||||||
def _handle_internal_messages(self, msg):
|
|
||||||
if isinstance(msg, pb.DisconnectRequest):
|
|
||||||
self._send_message(pb.DisconnectResponse())
|
|
||||||
if self._socket is not None:
|
|
||||||
self._socket.close()
|
|
||||||
self._socket = None
|
|
||||||
self._connected = False
|
|
||||||
if self.on_disconnect is not None:
|
|
||||||
self.on_disconnect()
|
|
||||||
elif isinstance(msg, pb.PingRequest):
|
|
||||||
self._send_message(pb.PingResponse())
|
|
||||||
elif isinstance(msg, pb.GetTimeRequest):
|
|
||||||
resp = pb.GetTimeResponse()
|
|
||||||
resp.epoch_seconds = int(time.time())
|
|
||||||
self._send_message(resp)
|
|
||||||
|
|
||||||
|
|
||||||
def run_logs(config, address):
|
|
||||||
conf = config['api']
|
|
||||||
port = conf[CONF_PORT]
|
|
||||||
password = conf[CONF_PASSWORD]
|
|
||||||
_LOGGER.info("Starting log output from %s using esphomelib API", address)
|
|
||||||
|
|
||||||
cli = APIClient(address, port, password)
|
|
||||||
stopping = False
|
|
||||||
retry_timer = []
|
|
||||||
|
|
||||||
def try_connect(tries=0, is_disconnect=True):
|
|
||||||
if stopping:
|
|
||||||
return
|
|
||||||
|
|
||||||
if is_disconnect:
|
|
||||||
_LOGGER.warning(u"Disconnected from API.")
|
|
||||||
|
|
||||||
while retry_timer:
|
|
||||||
retry_timer.pop(0).cancel()
|
|
||||||
|
|
||||||
error = None
|
|
||||||
try:
|
|
||||||
cli.connect()
|
|
||||||
cli.login()
|
|
||||||
except APIConnectionError as err: # noqa
|
|
||||||
error = err
|
|
||||||
|
|
||||||
if error is None:
|
|
||||||
_LOGGER.info("Successfully connected to %s", address)
|
|
||||||
return
|
|
||||||
|
|
||||||
wait_time = min(2**tries, 300)
|
|
||||||
_LOGGER.warning(u"Couldn't connect to API (%s). Trying to reconnect in %s seconds",
|
|
||||||
error, wait_time)
|
|
||||||
timer = threading.Timer(wait_time, functools.partial(try_connect, tries + 1, is_disconnect))
|
|
||||||
timer.start()
|
|
||||||
retry_timer.append(timer)
|
|
||||||
|
|
||||||
def on_log(msg):
|
|
||||||
time_ = datetime.now().time().strftime(u'[%H:%M:%S]')
|
|
||||||
text = msg.message
|
|
||||||
if msg.send_failed:
|
|
||||||
text = color('white', '(Message skipped because it was too big to fit in '
|
|
||||||
'TCP buffer - This is only cosmetic)')
|
|
||||||
safe_print(time_ + text)
|
|
||||||
|
|
||||||
has_connects = []
|
|
||||||
|
|
||||||
def on_login():
|
|
||||||
try:
|
|
||||||
cli.subscribe_logs(on_log, dump_config=not has_connects)
|
|
||||||
has_connects.append(True)
|
|
||||||
except APIConnectionError:
|
|
||||||
cli.disconnect()
|
|
||||||
|
|
||||||
cli.on_disconnect = try_connect
|
|
||||||
cli.on_login = on_login
|
|
||||||
cli.start()
|
|
||||||
|
|
||||||
try:
|
|
||||||
try_connect(is_disconnect=False)
|
|
||||||
while True:
|
|
||||||
time.sleep(1)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
stopping = True
|
|
||||||
cli.stop(True)
|
|
||||||
while retry_timer:
|
|
||||||
retry_timer.pop(0).cancel()
|
|
||||||
return 0
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import i2c, sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_UPDATE_INTERVAL
|
|
||||||
from esphomeyaml.cpp_generator import Pvariable, add
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import App, PollingComponent
|
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
|
||||||
MULTI_CONF = True
|
|
||||||
|
|
||||||
CONF_APDS9960_ID = 'apds9960_id'
|
|
||||||
APDS9960 = sensor.sensor_ns.class_('APDS9960', PollingComponent, i2c.I2CDevice)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(APDS9960),
|
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.make_apds9960(config.get(CONF_UPDATE_INTERVAL))
|
|
||||||
var = Pvariable(config[CONF_ID], rhs)
|
|
||||||
|
|
||||||
if CONF_ADDRESS in config:
|
|
||||||
add(var.set_address(config[CONF_ADDRESS]))
|
|
||||||
|
|
||||||
setup_component(var, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_APDS9960'
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.automation import ACTION_REGISTRY
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \
|
|
||||||
CONF_SERVICE, CONF_VARIABLES, CONF_REBOOT_TIMEOUT
|
|
||||||
from esphomeyaml.core import CORE
|
|
||||||
from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, add, get_variable, process_lambda
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import Action, App, Component, StoringController, esphomelib_ns
|
|
||||||
|
|
||||||
api_ns = esphomelib_ns.namespace('api')
|
|
||||||
APIServer = api_ns.class_('APIServer', Component, StoringController)
|
|
||||||
HomeAssistantServiceCallAction = api_ns.class_('HomeAssistantServiceCallAction', Action)
|
|
||||||
KeyValuePair = api_ns.class_('KeyValuePair')
|
|
||||||
TemplatableKeyValuePair = api_ns.class_('TemplatableKeyValuePair')
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(APIServer),
|
|
||||||
vol.Optional(CONF_PORT, default=6053): cv.port,
|
|
||||||
vol.Optional(CONF_PASSWORD, default=''): cv.string_strict,
|
|
||||||
vol.Optional(CONF_REBOOT_TIMEOUT): cv.positive_time_period_milliseconds,
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.init_api_server()
|
|
||||||
api = Pvariable(config[CONF_ID], rhs)
|
|
||||||
|
|
||||||
if config[CONF_PORT] != 6053:
|
|
||||||
add(api.set_port(config[CONF_PORT]))
|
|
||||||
if config.get(CONF_PASSWORD):
|
|
||||||
add(api.set_password(config[CONF_PASSWORD]))
|
|
||||||
if CONF_REBOOT_TIMEOUT in config:
|
|
||||||
add(api.set_reboot_timeout(config[CONF_REBOOT_TIMEOUT]))
|
|
||||||
|
|
||||||
setup_component(api, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_API'
|
|
||||||
|
|
||||||
|
|
||||||
def lib_deps(config):
|
|
||||||
if CORE.is_esp32:
|
|
||||||
return 'AsyncTCP@1.0.1'
|
|
||||||
if CORE.is_esp8266:
|
|
||||||
return 'ESPAsyncTCP@1.1.3'
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
CONF_HOMEASSISTANT_SERVICE = 'homeassistant.service'
|
|
||||||
HOMEASSISTANT_SERVIC_ACTION_SCHEMA = vol.Schema({
|
|
||||||
cv.GenerateID(): cv.use_variable_id(APIServer),
|
|
||||||
vol.Required(CONF_SERVICE): cv.string,
|
|
||||||
vol.Optional(CONF_DATA): vol.Schema({
|
|
||||||
cv.string: cv.string,
|
|
||||||
}),
|
|
||||||
vol.Optional(CONF_DATA_TEMPLATE): vol.Schema({
|
|
||||||
cv.string: cv.string,
|
|
||||||
}),
|
|
||||||
vol.Optional(CONF_VARIABLES): vol.Schema({
|
|
||||||
cv.string: cv.lambda_,
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@ACTION_REGISTRY.register(CONF_HOMEASSISTANT_SERVICE, HOMEASSISTANT_SERVIC_ACTION_SCHEMA)
|
|
||||||
def homeassistant_service_to_code(config, action_id, arg_type, template_arg):
|
|
||||||
for var in get_variable(config[CONF_ID]):
|
|
||||||
yield None
|
|
||||||
rhs = var.make_home_assistant_service_call_action(template_arg)
|
|
||||||
type = HomeAssistantServiceCallAction.template(arg_type)
|
|
||||||
act = Pvariable(action_id, rhs, type=type)
|
|
||||||
add(act.set_service(config[CONF_SERVICE]))
|
|
||||||
if CONF_DATA in config:
|
|
||||||
datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA].items()]
|
|
||||||
add(act.set_data(ArrayInitializer(*datas)))
|
|
||||||
if CONF_DATA_TEMPLATE in config:
|
|
||||||
datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA_TEMPLATE].items()]
|
|
||||||
add(act.set_data_template(ArrayInitializer(*datas)))
|
|
||||||
if CONF_VARIABLES in config:
|
|
||||||
datas = []
|
|
||||||
for key, value in config[CONF_VARIABLES].items():
|
|
||||||
for value_ in process_lambda(value, []):
|
|
||||||
yield None
|
|
||||||
datas.append(TemplatableKeyValuePair(key, value_))
|
|
||||||
add(act.set_variables(ArrayInitializer(*datas)))
|
|
||||||
yield act
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import binary_sensor, sensor
|
|
||||||
from esphomeyaml.components.apds9960 import APDS9960, CONF_APDS9960_ID
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_DIRECTION, CONF_NAME
|
|
||||||
from esphomeyaml.cpp_generator import get_variable
|
|
||||||
|
|
||||||
DEPENDENCIES = ['apds9960']
|
|
||||||
APDS9960GestureDirectionBinarySensor = sensor.sensor_ns.class_(
|
|
||||||
'APDS9960GestureDirectionBinarySensor', binary_sensor.BinarySensor)
|
|
||||||
|
|
||||||
DIRECTIONS = {
|
|
||||||
'UP': 'make_up_direction',
|
|
||||||
'DOWN': 'make_down_direction',
|
|
||||||
'LEFT': 'make_left_direction',
|
|
||||||
'RIGHT': 'make_right_direction',
|
|
||||||
}
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(APDS9960GestureDirectionBinarySensor),
|
|
||||||
vol.Required(CONF_DIRECTION): cv.one_of(*DIRECTIONS, upper=True),
|
|
||||||
cv.GenerateID(CONF_APDS9960_ID): cv.use_variable_id(APDS9960)
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for hub in get_variable(config[CONF_APDS9960_ID]):
|
|
||||||
yield
|
|
||||||
func = getattr(hub, DIRECTIONS[config[CONF_DIRECTION]])
|
|
||||||
rhs = func(config[CONF_NAME])
|
|
||||||
binary_sensor.register_binary_sensor(rhs, config)
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return binary_sensor.core_to_hass_config(data, config)
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import binary_sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_types import std_vector
|
|
||||||
|
|
||||||
CustomBinarySensorConstructor = binary_sensor.binary_sensor_ns.class_(
|
|
||||||
'CustomBinarySensorConstructor')
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomBinarySensorConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_BINARY_SENSORS):
|
|
||||||
cv.ensure_list(binary_sensor.BINARY_SENSOR_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(binary_sensor.BinarySensor),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(binary_sensor.BinarySensorPtr)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = CustomBinarySensorConstructor(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, sens in enumerate(config[CONF_BINARY_SENSORS]):
|
|
||||||
binary_sensor.register_binary_sensor(custom.get_binary_sensor(i), sens)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return [binary_sensor.core_to_hass_config(data, sens) for sens in config[CONF_BINARY_SENSORS]]
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_COMPONENTS
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import Component, ComponentPtr, esphomelib_ns, std_vector
|
|
||||||
|
|
||||||
CustomComponentConstructor = esphomelib_ns.class_('CustomComponentConstructor')
|
|
||||||
MULTI_CONF = True
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomComponentConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Optional(CONF_COMPONENTS): cv.ensure_list(vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(Component)
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(ComponentPtr)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = CustomComponentConstructor(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, comp in enumerate(config.get(CONF_COMPONENTS, [])):
|
|
||||||
setup_component(custom.get_component(i), comp)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_COMPONENT'
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml import pins
|
|
||||||
from esphomeyaml.components import wifi
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_DOMAIN, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, \
|
|
||||||
ESP_PLATFORM_ESP32
|
|
||||||
from esphomeyaml.cpp_generator import Pvariable, add
|
|
||||||
from esphomeyaml.cpp_helpers import gpio_output_pin_expression
|
|
||||||
from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns
|
|
||||||
|
|
||||||
CONFLICTS_WITH = ['wifi']
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
|
||||||
|
|
||||||
CONF_PHY_ADDR = 'phy_addr'
|
|
||||||
CONF_MDC_PIN = 'mdc_pin'
|
|
||||||
CONF_MDIO_PIN = 'mdio_pin'
|
|
||||||
CONF_CLK_MODE = 'clk_mode'
|
|
||||||
CONF_POWER_PIN = 'power_pin'
|
|
||||||
|
|
||||||
EthernetType = esphomelib_ns.enum('EthernetType')
|
|
||||||
ETHERNET_TYPES = {
|
|
||||||
'LAN8720': EthernetType.ETHERNET_TYPE_LAN8720,
|
|
||||||
'TLK110': EthernetType.ETHERNET_TYPE_TLK110,
|
|
||||||
}
|
|
||||||
|
|
||||||
eth_clock_mode_t = global_ns.enum('eth_clock_mode_t')
|
|
||||||
CLK_MODES = {
|
|
||||||
'GPIO0_IN': eth_clock_mode_t.ETH_CLOCK_GPIO0_IN,
|
|
||||||
'GPIO0_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO0_OUT,
|
|
||||||
'GPIO16_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO16_OUT,
|
|
||||||
'GPIO17_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO17_OUT,
|
|
||||||
}
|
|
||||||
|
|
||||||
EthernetComponent = esphomelib_ns.class_('EthernetComponent', Component)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(EthernetComponent),
|
|
||||||
vol.Required(CONF_TYPE): cv.one_of(*ETHERNET_TYPES, upper=True),
|
|
||||||
vol.Required(CONF_MDC_PIN): pins.output_pin,
|
|
||||||
vol.Required(CONF_MDIO_PIN): pins.input_output_pin,
|
|
||||||
vol.Optional(CONF_CLK_MODE, default='GPIO0_IN'): cv.one_of(*CLK_MODES, upper=True, space='_'),
|
|
||||||
vol.Optional(CONF_PHY_ADDR, default=0): vol.All(cv.int_, vol.Range(min=0, max=31)),
|
|
||||||
vol.Optional(CONF_POWER_PIN): pins.gpio_output_pin_schema,
|
|
||||||
vol.Optional(CONF_MANUAL_IP): wifi.STA_MANUAL_IP_SCHEMA,
|
|
||||||
vol.Optional(CONF_HOSTNAME): cv.hostname,
|
|
||||||
vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.init_ethernet()
|
|
||||||
eth = Pvariable(config[CONF_ID], rhs)
|
|
||||||
|
|
||||||
add(eth.set_phy_addr(config[CONF_PHY_ADDR]))
|
|
||||||
add(eth.set_mdc_pin(config[CONF_MDC_PIN]))
|
|
||||||
add(eth.set_mdio_pin(config[CONF_MDIO_PIN]))
|
|
||||||
add(eth.set_type(ETHERNET_TYPES[config[CONF_TYPE]]))
|
|
||||||
add(eth.set_clk_mode(CLK_MODES[config[CONF_CLK_MODE]]))
|
|
||||||
|
|
||||||
if CONF_POWER_PIN in config:
|
|
||||||
for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]):
|
|
||||||
yield
|
|
||||||
add(eth.set_power_pin(pin))
|
|
||||||
|
|
||||||
if CONF_HOSTNAME in config:
|
|
||||||
add(eth.set_hostname(config[CONF_HOSTNAME]))
|
|
||||||
|
|
||||||
if CONF_MANUAL_IP in config:
|
|
||||||
add(eth.set_manual_ip(wifi.manual_ip(config[CONF_MANUAL_IP])))
|
|
||||||
|
|
||||||
|
|
||||||
REQUIRED_BUILD_FLAGS = '-DUSE_ETHERNET'
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml import automation
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_INTERVAL
|
|
||||||
from esphomeyaml.cpp_generator import Pvariable
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import App, NoArg, PollingComponent, Trigger, esphomelib_ns
|
|
||||||
|
|
||||||
IntervalTrigger = esphomelib_ns.class_('IntervalTrigger', Trigger.template(NoArg), PollingComponent)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = automation.validate_automation(vol.Schema({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(IntervalTrigger),
|
|
||||||
vol.Required(CONF_INTERVAL): cv.positive_time_period_milliseconds,
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for conf in config:
|
|
||||||
rhs = App.register_component(IntervalTrigger.new(conf[CONF_INTERVAL]))
|
|
||||||
trigger = Pvariable(conf[CONF_ID], rhs)
|
|
||||||
setup_component(trigger, conf)
|
|
||||||
|
|
||||||
automation.build_automation(trigger, NoArg, conf)
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml import pins
|
|
||||||
from esphomeyaml.components import light
|
|
||||||
from esphomeyaml.components.light import AddressableLight
|
|
||||||
from esphomeyaml.components.power_supply import PowerSupplyComponent
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \
|
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_METHOD, \
|
|
||||||
CONF_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_TYPE, CONF_VARIANT
|
|
||||||
from esphomeyaml.core import CORE
|
|
||||||
from esphomeyaml.cpp_generator import TemplateArguments, add, get_variable, variable
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import App, Application, Component, global_ns
|
|
||||||
|
|
||||||
NeoPixelBusLightOutputBase = light.light_ns.class_('NeoPixelBusLightOutputBase', Component,
|
|
||||||
AddressableLight)
|
|
||||||
ESPNeoPixelOrder = light.light_ns.namespace('ESPNeoPixelOrder')
|
|
||||||
|
|
||||||
|
|
||||||
def validate_type(value):
|
|
||||||
value = cv.string(value).upper()
|
|
||||||
if 'R' not in value:
|
|
||||||
raise vol.Invalid("Must have R in type")
|
|
||||||
if 'G' not in value:
|
|
||||||
raise vol.Invalid("Must have G in type")
|
|
||||||
if 'B' not in value:
|
|
||||||
raise vol.Invalid("Must have B in type")
|
|
||||||
rest = set(value) - set('RGBW')
|
|
||||||
if rest:
|
|
||||||
raise vol.Invalid("Type has invalid color: {}".format(', '.join(rest)))
|
|
||||||
if len(set(value)) != len(value):
|
|
||||||
raise vol.Invalid("Type has duplicate color!")
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
def validate_variant(value):
|
|
||||||
value = cv.string(value).upper()
|
|
||||||
if value == 'WS2813':
|
|
||||||
value = 'WS2812X'
|
|
||||||
if value == 'WS2812':
|
|
||||||
value = '800KBPS'
|
|
||||||
if value == 'LC8812':
|
|
||||||
value = 'SK6812'
|
|
||||||
return cv.one_of(*VARIANTS)(value)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_method(value):
|
|
||||||
if value is None:
|
|
||||||
if CORE.is_esp32:
|
|
||||||
return 'ESP32_I2S_1'
|
|
||||||
if CORE.is_esp8266:
|
|
||||||
return 'ESP8266_DMA'
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
if CORE.is_esp32:
|
|
||||||
return cv.one_of(*ESP32_METHODS, upper=True, space='_')(value)
|
|
||||||
if CORE.is_esp8266:
|
|
||||||
return cv.one_of(*ESP8266_METHODS, upper=True, space='_')(value)
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
VARIANTS = {
|
|
||||||
'WS2812X': 'Ws2812x',
|
|
||||||
'SK6812': 'Sk6812',
|
|
||||||
'800KBPS': '800Kbps',
|
|
||||||
'400KBPS': '400Kbps',
|
|
||||||
}
|
|
||||||
|
|
||||||
ESP8266_METHODS = {
|
|
||||||
'ESP8266_DMA': 'NeoEsp8266Dma{}Method',
|
|
||||||
'ESP8266_UART0': 'NeoEsp8266Uart0{}Method',
|
|
||||||
'ESP8266_UART1': 'NeoEsp8266Uart1{}Method',
|
|
||||||
'ESP8266_ASYNC_UART0': 'NeoEsp8266AsyncUart0{}Method',
|
|
||||||
'ESP8266_ASYNC_UART1': 'NeoEsp8266AsyncUart1{}Method',
|
|
||||||
'BIT_BANG': 'NeoEsp8266BitBang{}Method',
|
|
||||||
}
|
|
||||||
ESP32_METHODS = {
|
|
||||||
'ESP32_I2S_0': 'NeoEsp32I2s0{}Method',
|
|
||||||
'ESP32_I2S_1': 'NeoEsp32I2s1{}Method',
|
|
||||||
'BIT_BANG': 'NeoEsp32BitBang{}Method',
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def format_method(config):
|
|
||||||
variant = VARIANTS[config[CONF_VARIANT]]
|
|
||||||
method = config[CONF_METHOD]
|
|
||||||
if CORE.is_esp8266:
|
|
||||||
return ESP8266_METHODS[method].format(variant)
|
|
||||||
if CORE.is_esp32:
|
|
||||||
return ESP32_METHODS[method].format(variant)
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
def validate(config):
|
|
||||||
if CONF_PIN in config:
|
|
||||||
if CONF_CLOCK_PIN in config or CONF_DATA_PIN in config:
|
|
||||||
raise vol.Invalid("Cannot specify both 'pin' and 'clock_pin'+'data_pin'")
|
|
||||||
return config
|
|
||||||
if CONF_CLOCK_PIN in config:
|
|
||||||
if CONF_DATA_PIN not in config:
|
|
||||||
raise vol.Invalid("If you give clock_pin, you must also specify data_pin")
|
|
||||||
return config
|
|
||||||
raise vol.Invalid("Must specify at least one of 'pin' or 'clock_pin'+'data_pin'")
|
|
||||||
|
|
||||||
|
|
||||||
MakeNeoPixelBusLight = Application.struct('MakeNeoPixelBusLight')
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeNeoPixelBusLight),
|
|
||||||
|
|
||||||
vol.Optional(CONF_TYPE, default='GRB'): validate_type,
|
|
||||||
vol.Optional(CONF_VARIANT, default='800KBPS'): validate_variant,
|
|
||||||
vol.Optional(CONF_METHOD, default=None): validate_method,
|
|
||||||
vol.Optional(CONF_PIN): pins.output_pin,
|
|
||||||
vol.Optional(CONF_CLOCK_PIN): pins.output_pin,
|
|
||||||
vol.Optional(CONF_DATA_PIN): pins.output_pin,
|
|
||||||
|
|
||||||
vol.Required(CONF_NUM_LEDS): cv.positive_not_null_int,
|
|
||||||
|
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
|
||||||
vol.Optional(CONF_COLOR_CORRECT): vol.All([cv.percentage], vol.Length(min=3, max=4)),
|
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
|
||||||
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
|
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.ADDRESSABLE_EFFECTS),
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema), validate)
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
type_ = config[CONF_TYPE]
|
|
||||||
has_white = 'W' in type_
|
|
||||||
if has_white:
|
|
||||||
func = App.make_neo_pixel_bus_rgbw_light
|
|
||||||
color_feat = global_ns.NeoRgbwFeature
|
|
||||||
else:
|
|
||||||
func = App.make_neo_pixel_bus_rgb_light
|
|
||||||
color_feat = global_ns.NeoRgbFeature
|
|
||||||
|
|
||||||
template = TemplateArguments(getattr(global_ns, format_method(config)), color_feat)
|
|
||||||
rhs = func(template, config[CONF_NAME])
|
|
||||||
make = variable(config[CONF_MAKE_ID], rhs, type=MakeNeoPixelBusLight.template(template))
|
|
||||||
output = make.Poutput
|
|
||||||
|
|
||||||
if CONF_PIN in config:
|
|
||||||
add(output.add_leds(config[CONF_NUM_LEDS], config[CONF_PIN]))
|
|
||||||
else:
|
|
||||||
add(output.add_leds(config[CONF_NUM_LEDS], config[CONF_CLOCK_PIN], config[CONF_DATA_PIN]))
|
|
||||||
|
|
||||||
add(output.set_pixel_order(getattr(ESPNeoPixelOrder, type_)))
|
|
||||||
|
|
||||||
if CONF_POWER_SUPPLY in config:
|
|
||||||
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
|
||||||
yield
|
|
||||||
add(output.set_power_supply(power_supply))
|
|
||||||
|
|
||||||
if CONF_COLOR_CORRECT in config:
|
|
||||||
add(output.set_correction(*config[CONF_COLOR_CORRECT]))
|
|
||||||
|
|
||||||
light.setup_light(make.Pstate, make.Pmqtt, config)
|
|
||||||
setup_component(output, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT'
|
|
||||||
|
|
||||||
LIB_DEPS = 'NeoPixelBus@2.4.1'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
|
|
||||||
white_value='W' in config[CONF_TYPE])
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import output
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_OUTPUTS, CONF_TYPE
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_types import std_vector
|
|
||||||
|
|
||||||
CustomBinaryOutputConstructor = output.output_ns.class_('CustomBinaryOutputConstructor')
|
|
||||||
CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstructor')
|
|
||||||
|
|
||||||
BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomBinaryOutputConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_OUTPUTS):
|
|
||||||
cv.ensure_list(output.BINARY_OUTPUT_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(output.BinaryOutput),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomFloatOutputConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_OUTPUTS):
|
|
||||||
cv.ensure_list(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(output.FloatOutput),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def validate_custom_output(value):
|
|
||||||
if not isinstance(value, dict):
|
|
||||||
raise vol.Invalid("Value must be dict")
|
|
||||||
if CONF_TYPE not in value:
|
|
||||||
raise vol.Invalid("type not specified!")
|
|
||||||
type = cv.string_strict(value[CONF_TYPE]).lower()
|
|
||||||
value[CONF_TYPE] = type
|
|
||||||
if type == 'binary':
|
|
||||||
return BINARY_SCHEMA(value)
|
|
||||||
if type == 'float':
|
|
||||||
return FLOAT_SCHEMA(value)
|
|
||||||
raise vol.Invalid("type must either be binary or float, not {}!".format(type))
|
|
||||||
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = validate_custom_output
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
type = config[CONF_TYPE]
|
|
||||||
if type == 'binary':
|
|
||||||
ret_type = output.BinaryOutputPtr
|
|
||||||
klass = CustomBinaryOutputConstructor
|
|
||||||
else:
|
|
||||||
ret_type = output.FloatOutputPtr
|
|
||||||
klass = CustomFloatOutputConstructor
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(ret_type)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = klass(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, sens in enumerate(config[CONF_OUTPUTS]):
|
|
||||||
output.register_output(custom.get_output(i), sens)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_OUTPUT'
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import sensor
|
|
||||||
from esphomeyaml.components.apds9960 import APDS9960, CONF_APDS9960_ID
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_NAME, CONF_TYPE
|
|
||||||
from esphomeyaml.cpp_generator import get_variable
|
|
||||||
|
|
||||||
DEPENDENCIES = ['apds9960']
|
|
||||||
|
|
||||||
TYPES = {
|
|
||||||
'CLEAR': 'make_clear_channel',
|
|
||||||
'RED': 'make_red_channel',
|
|
||||||
'GREEN': 'make_green_channel',
|
|
||||||
'BLUE': 'make_blue_channel',
|
|
||||||
'PROXIMITY': 'make_proximity',
|
|
||||||
}
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(sensor.Sensor),
|
|
||||||
vol.Required(CONF_TYPE): cv.one_of(*TYPES, upper=True),
|
|
||||||
cv.GenerateID(CONF_APDS9960_ID): cv.use_variable_id(APDS9960)
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for hub in get_variable(config[CONF_APDS9960_ID]):
|
|
||||||
yield
|
|
||||||
func = getattr(hub, TYPES[config[CONF_TYPE]])
|
|
||||||
rhs = func(config[CONF_NAME])
|
|
||||||
sensor.register_sensor(rhs, config)
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return sensor.core_to_hass_config(data, config)
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SENSORS
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_types import std_vector
|
|
||||||
|
|
||||||
CustomSensorConstructor = sensor.sensor_ns.class_('CustomSensorConstructor')
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomSensorConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_SENSORS): cv.ensure_list(sensor.SENSOR_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(sensor.Sensor),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(sensor.SensorPtr)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = CustomSensorConstructor(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, sens in enumerate(config[CONF_SENSORS]):
|
|
||||||
sensor.register_sensor(custom.get_sensor(i), sens)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return [sensor.core_to_hass_config(data, sens) for sens in config[CONF_SENSORS]]
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ENTITY_ID, CONF_MAKE_ID, CONF_NAME
|
|
||||||
from esphomeyaml.cpp_generator import variable
|
|
||||||
from esphomeyaml.cpp_types import App, Application
|
|
||||||
|
|
||||||
DEPENDENCIES = ['api']
|
|
||||||
|
|
||||||
MakeHomeassistantSensor = Application.struct('MakeHomeassistantSensor')
|
|
||||||
HomeassistantSensor = sensor.sensor_ns.class_('HomeassistantSensor', sensor.Sensor)
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(HomeassistantSensor),
|
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHomeassistantSensor),
|
|
||||||
vol.Required(CONF_ENTITY_ID): cv.entity_id,
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.make_homeassistant_sensor(config[CONF_NAME], config[CONF_ENTITY_ID])
|
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
|
||||||
subs = make.Psensor
|
|
||||||
sensor.setup_sensor(subs, make.Pmqtt, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return sensor.core_to_hass_config(data, config)
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml import pins
|
|
||||||
from esphomeyaml.components import sensor, spi
|
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
|
||||||
from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \
|
|
||||||
CONF_UPDATE_INTERVAL
|
|
||||||
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component
|
|
||||||
from esphomeyaml.cpp_generator import get_variable, variable
|
|
||||||
from esphomeyaml.cpp_types import Application, App
|
|
||||||
|
|
||||||
MakeMAX31855Sensor = Application.struct('MakeMAX31855Sensor')
|
|
||||||
MAX31855Sensor = sensor.sensor_ns.class_('MAX31855Sensor', sensor.PollingSensorComponent,
|
|
||||||
spi.SPIDevice)
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(MAX31855Sensor),
|
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX31855Sensor),
|
|
||||||
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
|
||||||
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for spi_ in get_variable(config[CONF_SPI_ID]):
|
|
||||||
yield
|
|
||||||
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
|
||||||
yield
|
|
||||||
rhs = App.make_max31855_sensor(config[CONF_NAME], spi_, cs,
|
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
|
||||||
max31855 = make.Pmax31855
|
|
||||||
sensor.setup_sensor(max31855, make.Pmqtt, config)
|
|
||||||
setup_component(max31855, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_MAX31855_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return sensor.core_to_hass_config(data, config)
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml import pins
|
|
||||||
from esphomeyaml.components import stepper
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_PIN_A, CONF_PIN_B, CONF_PIN_C, CONF_PIN_D, \
|
|
||||||
CONF_SLEEP_WHEN_DONE, CONF_STEP_MODE
|
|
||||||
from esphomeyaml.cpp_generator import Pvariable, add
|
|
||||||
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component
|
|
||||||
from esphomeyaml.cpp_types import App, Component
|
|
||||||
|
|
||||||
ULN2003StepMode = stepper.stepper_ns.enum('ULN2003StepMode')
|
|
||||||
|
|
||||||
STEP_MODES = {
|
|
||||||
'FULL_STEP': ULN2003StepMode.ULN2003_STEP_MODE_FULL_STEP,
|
|
||||||
'HALF_STEP': ULN2003StepMode.ULN2003_STEP_MODE_HALF_STEP,
|
|
||||||
'WAVE_DRIVE': ULN2003StepMode.ULN2003_STEP_MODE_WAVE_DRIVE,
|
|
||||||
}
|
|
||||||
|
|
||||||
ULN2003 = stepper.stepper_ns.class_('ULN2003', stepper.Stepper, Component)
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = stepper.STEPPER_PLATFORM_SCHEMA.extend({
|
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(ULN2003),
|
|
||||||
vol.Required(CONF_PIN_A): pins.gpio_output_pin_schema,
|
|
||||||
vol.Required(CONF_PIN_B): pins.gpio_output_pin_schema,
|
|
||||||
vol.Required(CONF_PIN_C): pins.gpio_output_pin_schema,
|
|
||||||
vol.Required(CONF_PIN_D): pins.gpio_output_pin_schema,
|
|
||||||
vol.Optional(CONF_SLEEP_WHEN_DONE): cv.boolean,
|
|
||||||
vol.Optional(CONF_STEP_MODE): cv.one_of(*STEP_MODES, upper=True, space='_')
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for pin_a in gpio_output_pin_expression(config[CONF_PIN_A]):
|
|
||||||
yield
|
|
||||||
for pin_b in gpio_output_pin_expression(config[CONF_PIN_B]):
|
|
||||||
yield
|
|
||||||
for pin_c in gpio_output_pin_expression(config[CONF_PIN_C]):
|
|
||||||
yield
|
|
||||||
for pin_d in gpio_output_pin_expression(config[CONF_PIN_D]):
|
|
||||||
yield
|
|
||||||
rhs = App.make_uln2003(pin_a, pin_b, pin_c, pin_d)
|
|
||||||
uln = Pvariable(config[CONF_ID], rhs)
|
|
||||||
|
|
||||||
if CONF_SLEEP_WHEN_DONE in config:
|
|
||||||
add(uln.set_sleep_when_done(config[CONF_SLEEP_WHEN_DONE]))
|
|
||||||
|
|
||||||
if CONF_STEP_MODE in config:
|
|
||||||
add(uln.set_step_mode(STEP_MODES[config[CONF_STEP_MODE]]))
|
|
||||||
|
|
||||||
stepper.setup_stepper(uln, config)
|
|
||||||
setup_component(uln, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ULN2003'
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
import logging
|
|
||||||
import re
|
|
||||||
|
|
||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml import core
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.core import EsphomeyamlError
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
CONF_SUBSTITUTIONS = 'substitutions'
|
|
||||||
|
|
||||||
VALID_SUBSTITUTIONS_CHARACTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' \
|
|
||||||
'0123456789_'
|
|
||||||
|
|
||||||
|
|
||||||
def validate_substitution_key(value):
|
|
||||||
value = cv.string(value)
|
|
||||||
if not value:
|
|
||||||
raise vol.Invalid("Substitution key must not be empty")
|
|
||||||
if value[0] == '$':
|
|
||||||
value = value[1:]
|
|
||||||
if value[0].isdigit():
|
|
||||||
raise vol.Invalid("First character in substitutions cannot be a digit.")
|
|
||||||
for char in value:
|
|
||||||
if char not in VALID_SUBSTITUTIONS_CHARACTERS:
|
|
||||||
raise vol.Invalid(
|
|
||||||
u"Substitution must only consist of upper/lowercase characters, the underscore "
|
|
||||||
u"and numbers. The character '{}' cannot be used".format(char))
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
|
||||||
validate_substitution_key: cv.string_strict,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
VARIABLE_PROG = re.compile('\\$([{0}]+|\\{{[{0}]*\\}})'.format(VALID_SUBSTITUTIONS_CHARACTERS))
|
|
||||||
|
|
||||||
|
|
||||||
def _expand_substitutions(substitutions, value, path):
|
|
||||||
if u'$' not in value:
|
|
||||||
return value
|
|
||||||
|
|
||||||
orig_value = value
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
while True:
|
|
||||||
m = VARIABLE_PROG.search(value, i)
|
|
||||||
if not m:
|
|
||||||
# Nothing more to match. Done
|
|
||||||
break
|
|
||||||
|
|
||||||
i, j = m.span(0)
|
|
||||||
name = m.group(1)
|
|
||||||
if name.startswith(u'{') and name.endswith(u'}'):
|
|
||||||
name = name[1:-1]
|
|
||||||
if name not in substitutions:
|
|
||||||
_LOGGER.warning(u"Found '%s' (see %s) which looks like a substitution, but '%s' was "
|
|
||||||
u"not declared", orig_value, u'->'.join(str(x) for x in path), name)
|
|
||||||
i = j
|
|
||||||
continue
|
|
||||||
|
|
||||||
sub = substitutions[name]
|
|
||||||
tail = value[j:]
|
|
||||||
value = value[:i] + sub
|
|
||||||
i = len(value)
|
|
||||||
value += tail
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
def _substitute_item(substitutions, item, path):
|
|
||||||
if isinstance(item, list):
|
|
||||||
for i, it in enumerate(item):
|
|
||||||
sub = _substitute_item(substitutions, it, path + [i])
|
|
||||||
if sub is not None:
|
|
||||||
item[i] = sub
|
|
||||||
elif isinstance(item, dict):
|
|
||||||
replace_keys = []
|
|
||||||
for k, v in item.items():
|
|
||||||
if path or k != CONF_SUBSTITUTIONS:
|
|
||||||
sub = _substitute_item(substitutions, k, path + [k])
|
|
||||||
if sub is not None:
|
|
||||||
replace_keys.append((k, sub))
|
|
||||||
sub = _substitute_item(substitutions, v, path + [k])
|
|
||||||
if sub is not None:
|
|
||||||
item[k] = sub
|
|
||||||
for old, new in replace_keys:
|
|
||||||
item[new] = item[old]
|
|
||||||
del item[old]
|
|
||||||
elif isinstance(item, str):
|
|
||||||
sub = _expand_substitutions(substitutions, item, path)
|
|
||||||
if sub != item:
|
|
||||||
return sub
|
|
||||||
elif isinstance(item, core.Lambda):
|
|
||||||
sub = _expand_substitutions(substitutions, item.value, path)
|
|
||||||
if sub != item:
|
|
||||||
item.value = sub
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def do_substitution_pass(config):
|
|
||||||
if CONF_SUBSTITUTIONS not in config:
|
|
||||||
return config
|
|
||||||
|
|
||||||
substitutions = config[CONF_SUBSTITUTIONS]
|
|
||||||
if not isinstance(substitutions, dict):
|
|
||||||
raise EsphomeyamlError(u"Substitutions must be a key to value mapping, got {}"
|
|
||||||
u"".format(type(substitutions)))
|
|
||||||
|
|
||||||
key = ''
|
|
||||||
try:
|
|
||||||
replace_keys = []
|
|
||||||
for key, value in substitutions.items():
|
|
||||||
sub = validate_substitution_key(key)
|
|
||||||
if sub != key:
|
|
||||||
replace_keys.append((key, sub))
|
|
||||||
substitutions[key] = cv.string_strict(value)
|
|
||||||
for old, new in replace_keys:
|
|
||||||
substitutions[new] = substitutions[old]
|
|
||||||
del substitutions[old]
|
|
||||||
except vol.Invalid as err:
|
|
||||||
err.path.append(key)
|
|
||||||
|
|
||||||
raise EsphomeyamlError(u"Error while parsing substitutions: {}".format(err))
|
|
||||||
|
|
||||||
config[CONF_SUBSTITUTIONS] = substitutions
|
|
||||||
_substitute_item(substitutions, config, [])
|
|
||||||
|
|
||||||
return config
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import switch
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SWITCHES
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_types import std_vector
|
|
||||||
|
|
||||||
CustomSwitchConstructor = switch.switch_ns.class_('CustomSwitchConstructor')
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomSwitchConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_SWITCHES):
|
|
||||||
cv.ensure_list(switch.SWITCH_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(switch.Switch),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(switch.SwitchPtr)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = CustomSwitchConstructor(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, sens in enumerate(config[CONF_SWITCHES]):
|
|
||||||
switch.register_switch(custom.get_switch(i), sens)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_SWITCH'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return [switch.core_to_hass_config(data, swi) for swi in config[CONF_SWITCHES]]
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import text_sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_TEXT_SENSORS
|
|
||||||
from esphomeyaml.cpp_generator import process_lambda, variable
|
|
||||||
from esphomeyaml.cpp_types import std_vector
|
|
||||||
|
|
||||||
CustomTextSensorConstructor = text_sensor.text_sensor_ns.class_('CustomTextSensorConstructor')
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = text_sensor.PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(CustomTextSensorConstructor),
|
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
|
||||||
vol.Required(CONF_TEXT_SENSORS):
|
|
||||||
cv.ensure_list(text_sensor.TEXT_SENSOR_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(text_sensor.TextSensor),
|
|
||||||
})),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
|
||||||
return_type=std_vector.template(text_sensor.TextSensorPtr)):
|
|
||||||
yield
|
|
||||||
|
|
||||||
rhs = CustomTextSensorConstructor(template_)
|
|
||||||
custom = variable(config[CONF_ID], rhs)
|
|
||||||
for i, sens in enumerate(config[CONF_TEXT_SENSORS]):
|
|
||||||
text_sensor.register_text_sensor(custom.get_text_sensor(i), sens)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CUSTOM_TEXT_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return [text_sensor.core_to_hass_config(data, sens) for sens in config[CONF_TEXT_SENSORS]]
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from esphomeyaml.components import text_sensor
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ENTITY_ID, CONF_MAKE_ID, CONF_NAME
|
|
||||||
from esphomeyaml.cpp_generator import variable
|
|
||||||
from esphomeyaml.cpp_types import App, Application, Component
|
|
||||||
|
|
||||||
DEPENDENCIES = ['api']
|
|
||||||
|
|
||||||
MakeHomeassistantTextSensor = Application.struct('MakeHomeassistantTextSensor')
|
|
||||||
HomeassistantTextSensor = text_sensor.text_sensor_ns.class_('HomeassistantTextSensor',
|
|
||||||
text_sensor.TextSensor, Component)
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(HomeassistantTextSensor),
|
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHomeassistantTextSensor),
|
|
||||||
vol.Required(CONF_ENTITY_ID): cv.entity_id,
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.make_homeassistant_text_sensor(config[CONF_NAME], config[CONF_ENTITY_ID])
|
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
|
||||||
sensor_ = make.Psensor
|
|
||||||
text_sensor.setup_text_sensor(sensor_, make.Pmqtt, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_TEXT_SENSOR'
|
|
||||||
|
|
||||||
|
|
||||||
def to_hass_config(data, config):
|
|
||||||
return text_sensor.core_to_hass_config(data, config)
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
from esphomeyaml.components import time as time_
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.const import CONF_ID
|
|
||||||
from esphomeyaml.cpp_generator import Pvariable
|
|
||||||
from esphomeyaml.cpp_helpers import setup_component
|
|
||||||
from esphomeyaml.cpp_types import App
|
|
||||||
|
|
||||||
|
|
||||||
DEPENDENCIES = ['api']
|
|
||||||
|
|
||||||
HomeAssistantTime = time_.time_ns.class_('HomeAssistantTime', time_.RealTimeClockComponent)
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = time_.TIME_PLATFORM_SCHEMA.extend({
|
|
||||||
cv.GenerateID(): cv.declare_variable_id(HomeAssistantTime),
|
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
|
||||||
rhs = App.make_homeassistant_time_component()
|
|
||||||
ha_time = Pvariable(config[CONF_ID], rhs)
|
|
||||||
time_.setup_time(ha_time, config)
|
|
||||||
setup_component(ha_time, config)
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_TIME'
|
|
||||||
@@ -1,540 +0,0 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from esphomeyaml.core import CORE, HexInt, Lambda, TimePeriod, TimePeriodMicroseconds, \
|
|
||||||
TimePeriodMilliseconds, TimePeriodSeconds
|
|
||||||
from esphomeyaml.helpers import cpp_string_escape, indent_all_but_first_and_last
|
|
||||||
|
|
||||||
# pylint: disable=unused-import, wrong-import-order
|
|
||||||
from typing import Any, Generator, List, Optional, Tuple, Union # noqa
|
|
||||||
from esphomeyaml.core import ID # noqa
|
|
||||||
from esphomeyaml.py_compat import text_type, string_types, integer_types
|
|
||||||
|
|
||||||
|
|
||||||
class Expression(object):
|
|
||||||
def __init__(self):
|
|
||||||
self.requires = []
|
|
||||||
self.required = False
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def require(self):
|
|
||||||
self.required = True
|
|
||||||
for require in self.requires:
|
|
||||||
if require.required:
|
|
||||||
continue
|
|
||||||
require.require()
|
|
||||||
|
|
||||||
def has_side_effects(self):
|
|
||||||
return self.required
|
|
||||||
|
|
||||||
|
|
||||||
SafeExpType = Union[Expression, bool, str, text_type, int, float, TimePeriod]
|
|
||||||
|
|
||||||
|
|
||||||
class RawExpression(Expression):
|
|
||||||
def __init__(self, text): # type: (Union[str, unicode]) -> None
|
|
||||||
super(RawExpression, self).__init__()
|
|
||||||
self.text = text
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return str(self.text)
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=redefined-builtin
|
|
||||||
class AssignmentExpression(Expression):
|
|
||||||
def __init__(self, type, modifier, name, rhs, obj):
|
|
||||||
super(AssignmentExpression, self).__init__()
|
|
||||||
self.type = type
|
|
||||||
self.modifier = modifier
|
|
||||||
self.name = name
|
|
||||||
self.rhs = safe_exp(rhs)
|
|
||||||
self.requires.append(self.rhs)
|
|
||||||
self.obj = obj
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
type_ = self.type
|
|
||||||
return u"{} {}{} = {}".format(type_, self.modifier, self.name, self.rhs)
|
|
||||||
|
|
||||||
def has_side_effects(self):
|
|
||||||
return self.rhs.has_side_effects()
|
|
||||||
|
|
||||||
|
|
||||||
class ExpressionList(Expression):
|
|
||||||
def __init__(self, *args):
|
|
||||||
super(ExpressionList, self).__init__()
|
|
||||||
# Remove every None on end
|
|
||||||
args = list(args)
|
|
||||||
while args and args[-1] is None:
|
|
||||||
args.pop()
|
|
||||||
self.args = []
|
|
||||||
for arg in args:
|
|
||||||
exp = safe_exp(arg)
|
|
||||||
self.requires.append(exp)
|
|
||||||
self.args.append(exp)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
text = u", ".join(text_type(x) for x in self.args)
|
|
||||||
return indent_all_but_first_and_last(text)
|
|
||||||
|
|
||||||
|
|
||||||
class TemplateArguments(Expression):
|
|
||||||
def __init__(self, *args): # type: (*SafeExpType) -> None
|
|
||||||
super(TemplateArguments, self).__init__()
|
|
||||||
self.args = ExpressionList(*args)
|
|
||||||
self.requires.append(self.args)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u'<{}>'.format(self.args)
|
|
||||||
|
|
||||||
|
|
||||||
class CallExpression(Expression):
|
|
||||||
def __init__(self, base, *args): # type: (Expression, *SafeExpType) -> None
|
|
||||||
super(CallExpression, self).__init__()
|
|
||||||
self.base = base
|
|
||||||
if args and isinstance(args[0], TemplateArguments):
|
|
||||||
self.template_args = args[0]
|
|
||||||
self.requires.append(self.template_args)
|
|
||||||
args = args[1:]
|
|
||||||
else:
|
|
||||||
self.template_args = None
|
|
||||||
self.args = ExpressionList(*args)
|
|
||||||
self.requires.append(self.args)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.template_args is not None:
|
|
||||||
return u'{}{}({})'.format(self.base, self.template_args, self.args)
|
|
||||||
return u'{}({})'.format(self.base, self.args)
|
|
||||||
|
|
||||||
|
|
||||||
class StructInitializer(Expression):
|
|
||||||
def __init__(self, base, *args): # type: (Expression, *Tuple[str, SafeExpType]) -> None
|
|
||||||
super(StructInitializer, self).__init__()
|
|
||||||
self.base = base
|
|
||||||
if isinstance(base, Expression):
|
|
||||||
self.requires.append(base)
|
|
||||||
if not isinstance(args, OrderedDict):
|
|
||||||
args = OrderedDict(args)
|
|
||||||
self.args = OrderedDict()
|
|
||||||
for key, value in args.items():
|
|
||||||
if value is None:
|
|
||||||
continue
|
|
||||||
exp = safe_exp(value)
|
|
||||||
self.args[key] = exp
|
|
||||||
self.requires.append(exp)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
cpp = u'{}{{\n'.format(self.base)
|
|
||||||
for key, value in self.args.items():
|
|
||||||
cpp += u' .{} = {},\n'.format(key, value)
|
|
||||||
cpp += u'}'
|
|
||||||
return cpp
|
|
||||||
|
|
||||||
|
|
||||||
class ArrayInitializer(Expression):
|
|
||||||
def __init__(self, *args, **kwargs): # type: (*Any, **Any) -> None
|
|
||||||
super(ArrayInitializer, self).__init__()
|
|
||||||
self.multiline = kwargs.get('multiline', True)
|
|
||||||
self.args = []
|
|
||||||
for arg in args:
|
|
||||||
if arg is None:
|
|
||||||
continue
|
|
||||||
exp = safe_exp(arg)
|
|
||||||
self.args.append(exp)
|
|
||||||
self.requires.append(exp)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if not self.args:
|
|
||||||
return u'{}'
|
|
||||||
if self.multiline:
|
|
||||||
cpp = u'{\n'
|
|
||||||
for arg in self.args:
|
|
||||||
cpp += u' {},\n'.format(arg)
|
|
||||||
cpp += u'}'
|
|
||||||
else:
|
|
||||||
cpp = u'{' + u', '.join(str(arg) for arg in self.args) + u'}'
|
|
||||||
return cpp
|
|
||||||
|
|
||||||
|
|
||||||
class ParameterExpression(Expression):
|
|
||||||
def __init__(self, type, id):
|
|
||||||
super(ParameterExpression, self).__init__()
|
|
||||||
self.type = type
|
|
||||||
self.id = id
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"{} {}".format(self.type, self.id)
|
|
||||||
|
|
||||||
|
|
||||||
class ParameterListExpression(Expression):
|
|
||||||
def __init__(self, *parameters):
|
|
||||||
super(ParameterListExpression, self).__init__()
|
|
||||||
self.parameters = []
|
|
||||||
for parameter in parameters:
|
|
||||||
if not isinstance(parameter, ParameterExpression):
|
|
||||||
parameter = ParameterExpression(*parameter)
|
|
||||||
self.parameters.append(parameter)
|
|
||||||
self.requires.append(parameter)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u", ".join(text_type(x) for x in self.parameters)
|
|
||||||
|
|
||||||
|
|
||||||
class LambdaExpression(Expression):
|
|
||||||
def __init__(self, parts, parameters, capture='=', return_type=None):
|
|
||||||
super(LambdaExpression, self).__init__()
|
|
||||||
self.parts = parts
|
|
||||||
if not isinstance(parameters, ParameterListExpression):
|
|
||||||
parameters = ParameterListExpression(*parameters)
|
|
||||||
self.parameters = parameters
|
|
||||||
self.requires.append(self.parameters)
|
|
||||||
self.capture = capture
|
|
||||||
self.return_type = return_type
|
|
||||||
if return_type is not None:
|
|
||||||
self.requires.append(return_type)
|
|
||||||
for i in range(1, len(parts), 3):
|
|
||||||
self.requires.append(parts[i])
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
cpp = u'[{}]({})'.format(self.capture, self.parameters)
|
|
||||||
if self.return_type is not None:
|
|
||||||
cpp += u' -> {}'.format(self.return_type)
|
|
||||||
cpp += u' {{\n{}\n}}'.format(self.content)
|
|
||||||
return indent_all_but_first_and_last(cpp)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def content(self):
|
|
||||||
return u''.join(text_type(part) for part in self.parts)
|
|
||||||
|
|
||||||
|
|
||||||
class Literal(Expression):
|
|
||||||
def __str__(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
class StringLiteral(Literal):
|
|
||||||
def __init__(self, string): # type: (Union[str, unicode]) -> None
|
|
||||||
super(StringLiteral, self).__init__()
|
|
||||||
self.string = string
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u'{}'.format(cpp_string_escape(self.string))
|
|
||||||
|
|
||||||
|
|
||||||
class IntLiteral(Literal):
|
|
||||||
def __init__(self, i): # type: (Union[int, long]) -> None
|
|
||||||
super(IntLiteral, self).__init__()
|
|
||||||
self.i = i
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.i > 4294967295:
|
|
||||||
return u'{}ULL'.format(self.i)
|
|
||||||
if self.i > 2147483647:
|
|
||||||
return u'{}UL'.format(self.i)
|
|
||||||
if self.i < -2147483648:
|
|
||||||
return u'{}LL'.format(self.i)
|
|
||||||
return text_type(self.i)
|
|
||||||
|
|
||||||
|
|
||||||
class BoolLiteral(Literal):
|
|
||||||
def __init__(self, binary): # type: (bool) -> None
|
|
||||||
super(BoolLiteral, self).__init__()
|
|
||||||
self.binary = binary
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"true" if self.binary else u"false"
|
|
||||||
|
|
||||||
|
|
||||||
class HexIntLiteral(Literal):
|
|
||||||
def __init__(self, i): # type: (int) -> None
|
|
||||||
super(HexIntLiteral, self).__init__()
|
|
||||||
self.i = HexInt(i)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return str(self.i)
|
|
||||||
|
|
||||||
|
|
||||||
class FloatLiteral(Literal):
|
|
||||||
def __init__(self, value): # type: (float) -> None
|
|
||||||
super(FloatLiteral, self).__init__()
|
|
||||||
self.float_ = value
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"{:f}f".format(self.float_)
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=bad-continuation
|
|
||||||
def safe_exp(obj # type: Union[Expression, bool, str, unicode, int, long, float, TimePeriod]
|
|
||||||
):
|
|
||||||
# type: (...) -> Expression
|
|
||||||
if isinstance(obj, Expression):
|
|
||||||
return obj
|
|
||||||
if isinstance(obj, bool):
|
|
||||||
return BoolLiteral(obj)
|
|
||||||
if isinstance(obj, string_types):
|
|
||||||
return StringLiteral(obj)
|
|
||||||
if isinstance(obj, HexInt):
|
|
||||||
return HexIntLiteral(obj)
|
|
||||||
if isinstance(obj, integer_types):
|
|
||||||
return IntLiteral(obj)
|
|
||||||
if isinstance(obj, float):
|
|
||||||
return FloatLiteral(obj)
|
|
||||||
if isinstance(obj, TimePeriodMicroseconds):
|
|
||||||
return IntLiteral(int(obj.total_microseconds))
|
|
||||||
if isinstance(obj, TimePeriodMilliseconds):
|
|
||||||
return IntLiteral(int(obj.total_milliseconds))
|
|
||||||
if isinstance(obj, TimePeriodSeconds):
|
|
||||||
return IntLiteral(int(obj.total_seconds))
|
|
||||||
raise ValueError(u"Object is not an expression", obj)
|
|
||||||
|
|
||||||
|
|
||||||
class Statement(object):
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
class RawStatement(Statement):
|
|
||||||
def __init__(self, text):
|
|
||||||
super(RawStatement, self).__init__()
|
|
||||||
self.text = text
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.text
|
|
||||||
|
|
||||||
|
|
||||||
class ExpressionStatement(Statement):
|
|
||||||
def __init__(self, expression):
|
|
||||||
super(ExpressionStatement, self).__init__()
|
|
||||||
self.expression = safe_exp(expression)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"{};".format(self.expression)
|
|
||||||
|
|
||||||
|
|
||||||
def statement(expression): # type: (Union[Expression, Statement]) -> Statement
|
|
||||||
if isinstance(expression, Statement):
|
|
||||||
return expression
|
|
||||||
return ExpressionStatement(expression)
|
|
||||||
|
|
||||||
|
|
||||||
def variable(id, # type: ID
|
|
||||||
rhs, # type: Expression
|
|
||||||
type=None # type: MockObj
|
|
||||||
):
|
|
||||||
# type: (...) -> MockObj
|
|
||||||
rhs = safe_exp(rhs)
|
|
||||||
obj = MockObj(id, u'.')
|
|
||||||
id.type = type or id.type
|
|
||||||
assignment = AssignmentExpression(id.type, '', id, rhs, obj)
|
|
||||||
CORE.add(assignment)
|
|
||||||
CORE.register_variable(id, obj)
|
|
||||||
obj.requires.append(assignment)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
def Pvariable(id, # type: ID
|
|
||||||
rhs, # type: Expression
|
|
||||||
has_side_effects=True, # type: bool
|
|
||||||
type=None # type: MockObj
|
|
||||||
):
|
|
||||||
# type: (...) -> MockObj
|
|
||||||
rhs = safe_exp(rhs)
|
|
||||||
if not has_side_effects and hasattr(rhs, '_has_side_effects'):
|
|
||||||
# pylint: disable=attribute-defined-outside-init, protected-access
|
|
||||||
rhs._has_side_effects = False
|
|
||||||
obj = MockObj(id, u'->', has_side_effects=has_side_effects)
|
|
||||||
id.type = type or id.type
|
|
||||||
assignment = AssignmentExpression(id.type, '*', id, rhs, obj)
|
|
||||||
CORE.add(assignment)
|
|
||||||
CORE.register_variable(id, obj)
|
|
||||||
obj.requires.append(assignment)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
def add(expression, # type: Union[Expression, Statement]
|
|
||||||
require=True # type: bool
|
|
||||||
):
|
|
||||||
# type: (...) -> None
|
|
||||||
CORE.add(expression, require=require)
|
|
||||||
|
|
||||||
|
|
||||||
def get_variable(id): # type: (ID) -> Generator[MockObj]
|
|
||||||
for var in CORE.get_variable(id):
|
|
||||||
yield None
|
|
||||||
yield var
|
|
||||||
|
|
||||||
|
|
||||||
def process_lambda(value, # type: Lambda
|
|
||||||
parameters, # type: List[Tuple[Expression, str]]
|
|
||||||
capture='=', # type: str
|
|
||||||
return_type=None # type: Optional[Expression]
|
|
||||||
):
|
|
||||||
# type: (...) -> Generator[LambdaExpression]
|
|
||||||
from esphomeyaml.components.globals import GlobalVariableComponent
|
|
||||||
|
|
||||||
if value is None:
|
|
||||||
yield
|
|
||||||
return
|
|
||||||
parts = value.parts[:]
|
|
||||||
for i, id in enumerate(value.requires_ids):
|
|
||||||
for full_id, var in CORE.get_variable_with_full_id(id):
|
|
||||||
yield
|
|
||||||
if full_id is not None and isinstance(full_id.type, MockObjClass) and \
|
|
||||||
full_id.type.inherits_from(GlobalVariableComponent):
|
|
||||||
parts[i * 3 + 1] = var.value()
|
|
||||||
continue
|
|
||||||
|
|
||||||
if parts[i * 3 + 2] == '.':
|
|
||||||
parts[i * 3 + 1] = var._
|
|
||||||
else:
|
|
||||||
parts[i * 3 + 1] = var
|
|
||||||
parts[i * 3 + 2] = ''
|
|
||||||
yield LambdaExpression(parts, parameters, capture, return_type)
|
|
||||||
|
|
||||||
|
|
||||||
def templatable(value, # type: Any
|
|
||||||
input_type, # type: Expression
|
|
||||||
output_type # type: Optional[Expression]
|
|
||||||
):
|
|
||||||
if isinstance(value, Lambda):
|
|
||||||
lambda_ = None
|
|
||||||
for lambda_ in process_lambda(value, [(input_type, 'x')], return_type=output_type):
|
|
||||||
yield None
|
|
||||||
yield lambda_
|
|
||||||
else:
|
|
||||||
yield value
|
|
||||||
|
|
||||||
|
|
||||||
class MockObj(Expression):
|
|
||||||
def __init__(self, base, op=u'.', has_side_effects=True):
|
|
||||||
self.base = base
|
|
||||||
self.op = op
|
|
||||||
self._has_side_effects = has_side_effects
|
|
||||||
super(MockObj, self).__init__()
|
|
||||||
|
|
||||||
def __getattr__(self, attr): # type: (str) -> MockObj
|
|
||||||
if attr == u'_':
|
|
||||||
obj = MockObj(u'{}{}'.format(self.base, self.op))
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
if attr == u'new':
|
|
||||||
obj = MockObj(u'new {}'.format(self.base), u'->')
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
next_op = u'.'
|
|
||||||
if attr.startswith(u'P') and self.op not in ['::', '']:
|
|
||||||
attr = attr[1:]
|
|
||||||
next_op = u'->'
|
|
||||||
if attr.startswith(u'_'):
|
|
||||||
attr = attr[1:]
|
|
||||||
obj = MockObj(u'{}{}{}'.format(self.base, self.op, attr), next_op)
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs): # type: (*Any, **Any) -> MockObj
|
|
||||||
call = CallExpression(self.base, *args)
|
|
||||||
obj = MockObj(call, self.op)
|
|
||||||
obj.requires.append(self)
|
|
||||||
obj.requires.append(call)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def __str__(self): # type: () -> unicode
|
|
||||||
return text_type(self.base)
|
|
||||||
|
|
||||||
def require(self): # type: () -> None
|
|
||||||
self.required = True
|
|
||||||
for require in self.requires:
|
|
||||||
if require.required:
|
|
||||||
continue
|
|
||||||
require.require()
|
|
||||||
|
|
||||||
def template(self, args): # type: (Union[TemplateArguments, Expression]) -> MockObj
|
|
||||||
if not isinstance(args, TemplateArguments):
|
|
||||||
args = TemplateArguments(args)
|
|
||||||
obj = MockObj(u'{}{}'.format(self.base, args))
|
|
||||||
obj.requires.append(self)
|
|
||||||
obj.requires.append(args)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def namespace(self, name): # type: (str) -> MockObj
|
|
||||||
obj = MockObj(u'{}{}{}'.format(self.base, self.op, name), u'::')
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def class_(self, name, *parents): # type: (str, *MockObjClass) -> MockObjClass
|
|
||||||
op = '' if self.op == '' else '::'
|
|
||||||
obj = MockObjClass(u'{}{}{}'.format(self.base, op, name), u'.', parents=parents)
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def struct(self, name): # type: (str) -> MockObjClass
|
|
||||||
return self.class_(name)
|
|
||||||
|
|
||||||
def enum(self, name, is_class=False): # type: (str, bool) -> MockObj
|
|
||||||
if is_class:
|
|
||||||
return self.namespace(name)
|
|
||||||
|
|
||||||
return self
|
|
||||||
|
|
||||||
def operator(self, name): # type: (str) -> MockObj
|
|
||||||
if name == 'ref':
|
|
||||||
obj = MockObj(u'{} &'.format(self.base), u'')
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
if name == 'ptr':
|
|
||||||
obj = MockObj(u'{} *'.format(self.base), u'')
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
if name == "const":
|
|
||||||
obj = MockObj(u'const {}'.format(self.base), u'')
|
|
||||||
obj.requires.append(self)
|
|
||||||
return obj
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def has_side_effects(self): # type: () -> bool
|
|
||||||
return self._has_side_effects
|
|
||||||
|
|
||||||
def __getitem__(self, item): # type: (Union[str, Expression]) -> MockObj
|
|
||||||
next_op = u'.'
|
|
||||||
if isinstance(item, str) and item.startswith(u'P'):
|
|
||||||
item = item[1:]
|
|
||||||
next_op = u'->'
|
|
||||||
obj = MockObj(u'{}[{}]'.format(self.base, item), next_op)
|
|
||||||
obj.requires.append(self)
|
|
||||||
if isinstance(item, Expression):
|
|
||||||
obj.requires.append(item)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
class MockObjClass(MockObj):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
parens = kwargs.pop('parents')
|
|
||||||
MockObj.__init__(self, *args, **kwargs)
|
|
||||||
self._parents = []
|
|
||||||
for paren in parens:
|
|
||||||
if not isinstance(paren, MockObjClass):
|
|
||||||
raise ValueError
|
|
||||||
self._parents.append(paren)
|
|
||||||
# pylint: disable=protected-access
|
|
||||||
self._parents += paren._parents
|
|
||||||
|
|
||||||
def inherits_from(self, other): # type: (MockObjClass) -> bool
|
|
||||||
if self == other:
|
|
||||||
return True
|
|
||||||
for parent in self._parents:
|
|
||||||
if parent == other:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def template(self, args): # type: (Union[TemplateArguments, Expression]) -> MockObjClass
|
|
||||||
if not isinstance(args, TemplateArguments):
|
|
||||||
args = TemplateArguments(args)
|
|
||||||
new_parents = self._parents[:]
|
|
||||||
new_parents.append(self)
|
|
||||||
obj = MockObjClass(u'{}{}'.format(self.base, args), parents=new_parents)
|
|
||||||
obj.requires.append(self)
|
|
||||||
obj.requires.append(args)
|
|
||||||
return obj
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
from esphomeyaml.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \
|
|
||||||
CONF_SETUP_PRIORITY
|
|
||||||
from esphomeyaml.core import CORE, EsphomeyamlError
|
|
||||||
from esphomeyaml.cpp_generator import IntLiteral, RawExpression
|
|
||||||
from esphomeyaml.cpp_types import GPIOInputPin, GPIOOutputPin
|
|
||||||
|
|
||||||
|
|
||||||
def generic_gpio_pin_expression_(conf, mock_obj, default_mode):
|
|
||||||
if conf is None:
|
|
||||||
return
|
|
||||||
number = conf[CONF_NUMBER]
|
|
||||||
inverted = conf.get(CONF_INVERTED)
|
|
||||||
if CONF_PCF8574 in conf:
|
|
||||||
from esphomeyaml.components import pcf8574
|
|
||||||
|
|
||||||
for hub in CORE.get_variable(conf[CONF_PCF8574]):
|
|
||||||
yield None
|
|
||||||
|
|
||||||
if default_mode == u'INPUT':
|
|
||||||
mode = pcf8574.PCF8675_GPIO_MODES[conf.get(CONF_MODE, u'INPUT')]
|
|
||||||
yield hub.make_input_pin(number, mode, inverted)
|
|
||||||
return
|
|
||||||
if default_mode == u'OUTPUT':
|
|
||||||
yield hub.make_output_pin(number, inverted)
|
|
||||||
return
|
|
||||||
|
|
||||||
raise EsphomeyamlError(u"Unknown default mode {}".format(default_mode))
|
|
||||||
if len(conf) == 1:
|
|
||||||
yield IntLiteral(number)
|
|
||||||
return
|
|
||||||
mode = RawExpression(conf.get(CONF_MODE, default_mode))
|
|
||||||
yield mock_obj(number, mode, inverted)
|
|
||||||
|
|
||||||
|
|
||||||
def gpio_output_pin_expression(conf):
|
|
||||||
for exp in generic_gpio_pin_expression_(conf, GPIOOutputPin, 'OUTPUT'):
|
|
||||||
yield None
|
|
||||||
yield exp
|
|
||||||
|
|
||||||
|
|
||||||
def gpio_input_pin_expression(conf):
|
|
||||||
for exp in generic_gpio_pin_expression_(conf, GPIOInputPin, 'INPUT'):
|
|
||||||
yield None
|
|
||||||
yield exp
|
|
||||||
|
|
||||||
|
|
||||||
def setup_component(obj, config):
|
|
||||||
if CONF_SETUP_PRIORITY in config:
|
|
||||||
CORE.add(obj.set_setup_priority(config[CONF_SETUP_PRIORITY]))
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
from esphomeyaml.cpp_generator import MockObj
|
|
||||||
|
|
||||||
global_ns = MockObj('', '')
|
|
||||||
void = global_ns.namespace('void')
|
|
||||||
float_ = global_ns.namespace('float')
|
|
||||||
bool_ = global_ns.namespace('bool')
|
|
||||||
std_ns = global_ns.namespace('std')
|
|
||||||
std_string = std_ns.class_('string')
|
|
||||||
std_vector = std_ns.class_('vector')
|
|
||||||
uint8 = global_ns.namespace('uint8_t')
|
|
||||||
uint16 = global_ns.namespace('uint16_t')
|
|
||||||
uint32 = global_ns.namespace('uint32_t')
|
|
||||||
int32 = global_ns.namespace('int32_t')
|
|
||||||
const_char_ptr = global_ns.namespace('const char *')
|
|
||||||
NAN = global_ns.namespace('NAN')
|
|
||||||
esphomelib_ns = global_ns # using namespace esphomelib;
|
|
||||||
NoArg = esphomelib_ns.class_('NoArg')
|
|
||||||
App = esphomelib_ns.App
|
|
||||||
io_ns = esphomelib_ns.namespace('io')
|
|
||||||
Nameable = esphomelib_ns.class_('Nameable')
|
|
||||||
Trigger = esphomelib_ns.class_('Trigger')
|
|
||||||
Action = esphomelib_ns.class_('Action')
|
|
||||||
Component = esphomelib_ns.class_('Component')
|
|
||||||
ComponentPtr = Component.operator('ptr')
|
|
||||||
PollingComponent = esphomelib_ns.class_('PollingComponent', Component)
|
|
||||||
Application = esphomelib_ns.class_('Application')
|
|
||||||
optional = esphomelib_ns.class_('optional')
|
|
||||||
arduino_json_ns = global_ns.namespace('ArduinoJson')
|
|
||||||
JsonObject = arduino_json_ns.class_('JsonObject')
|
|
||||||
JsonObjectRef = JsonObject.operator('ref')
|
|
||||||
JsonObjectConstRef = JsonObjectRef.operator('const')
|
|
||||||
Controller = esphomelib_ns.class_('Controller')
|
|
||||||
StoringController = esphomelib_ns.class_('StoringController', Controller)
|
|
||||||
|
|
||||||
GPIOPin = esphomelib_ns.class_('GPIOPin')
|
|
||||||
GPIOOutputPin = esphomelib_ns.class_('GPIOOutputPin', GPIOPin)
|
|
||||||
GPIOInputPin = esphomelib_ns.class_('GPIOInputPin', GPIOPin)
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,218 +0,0 @@
|
|||||||
nav .brand-logo {
|
|
||||||
margin-left: 48px;
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
main .container {
|
|
||||||
margin-top: -12vh;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ribbon {
|
|
||||||
width: 100%;
|
|
||||||
height: 17vh;
|
|
||||||
background-color: #3F51B5;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ribbon-fab:not(.tap-target-origin) {
|
|
||||||
position: absolute;
|
|
||||||
right: 24px;
|
|
||||||
top: calc(17vh + 34px);
|
|
||||||
}
|
|
||||||
|
|
||||||
i.very-large {
|
|
||||||
font-size: 8rem;
|
|
||||||
padding-top: 2px;
|
|
||||||
color: #424242;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card .card-content {
|
|
||||||
padding-left: 18px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-action a, .card-dropdown-action a {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inlinecode {
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 0.2em 0.4em;
|
|
||||||
margin: 0;
|
|
||||||
font-size: 85%;
|
|
||||||
background-color: rgba(27,31,35,0.05);
|
|
||||||
border-radius: 3px;
|
|
||||||
font-family: "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
.autoscroll {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
flex-basis: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.autoscroll div {
|
|
||||||
flex-basis: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log {
|
|
||||||
background-color: #1c1c1c;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 16px;
|
|
||||||
overflow: auto;
|
|
||||||
line-height: 1.45;
|
|
||||||
border-radius: 3px;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
color: #DDD;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-bold { font-weight: bold; }
|
|
||||||
.log-italic { font-style: italic; }
|
|
||||||
.log-underline { text-decoration: underline; }
|
|
||||||
.log-strikethrough { text-decoration: line-through; }
|
|
||||||
.log-underline.log-strikethrough { text-decoration: underline line-through; }
|
|
||||||
.log-fg-black { color: rgb(128,128,128); }
|
|
||||||
.log-fg-red { color: rgb(255,0,0); }
|
|
||||||
.log-fg-green { color: rgb(0,255,0); }
|
|
||||||
.log-fg-yellow { color: rgb(255,255,0); }
|
|
||||||
.log-fg-blue { color: rgb(0,0,255); }
|
|
||||||
.log-fg-magenta { color: rgb(255,0,255); }
|
|
||||||
.log-fg-cyan { color: rgb(0,255,255); }
|
|
||||||
.log-fg-white { color: rgb(187,187,187); }
|
|
||||||
.log-bg-black { background-color: rgb(0,0,0); }
|
|
||||||
.log-bg-red { background-color: rgb(255,0,0); }
|
|
||||||
.log-bg-green { background-color: rgb(0,255,0); }
|
|
||||||
.log-bg-yellow { background-color: rgb(255,255,0); }
|
|
||||||
.log-bg-blue { background-color: rgb(0,0,255); }
|
|
||||||
.log-bg-magenta { background-color: rgb(255,0,255); }
|
|
||||||
.log-bg-cyan { background-color: rgb(0,255,255); }
|
|
||||||
.log-bg-white { background-color: rgb(255,255,255); }
|
|
||||||
|
|
||||||
.modal {
|
|
||||||
width: 95%;
|
|
||||||
max-height: 90%;
|
|
||||||
height: 85% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-footer {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
min-height: 100vh;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
flex: 1 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.browser-default {
|
|
||||||
padding-left: 30px;
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.browser-default li {
|
|
||||||
list-style-type: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.stepper:not(.horizontal) .step.active::before, ul.stepper:not(.horizontal) .step.done::before, ul.stepper.horizontal .step.active .step-title::before, ul.stepper.horizontal .step.done .step-title::before {
|
|
||||||
background-color: #3f51b5 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-port-container {
|
|
||||||
margin-top: 8px;
|
|
||||||
margin-right: 24px;
|
|
||||||
width: 350px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-trigger {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* https://github.com/tnhu/status-indicator/blob/master/styles.css */
|
|
||||||
.status-indicator .status-indicator-icon {
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.unknown .status-indicator-icon {
|
|
||||||
background-color: rgb(216, 226, 233);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.unknown .status-indicator-text::after {
|
|
||||||
content: "Unknown status";
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.offline .status-indicator-icon {
|
|
||||||
background-color: rgb(255, 77, 77);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.offline .status-indicator-text::after {
|
|
||||||
content: "Offline";
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.not-responding .status-indicator-icon {
|
|
||||||
background-color: rgb(255, 170, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.not-responding .status-indicator-text::after {
|
|
||||||
content: "Not Responding";
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes status-indicator-pulse-online {
|
|
||||||
0% {
|
|
||||||
box-shadow: 0 0 0 0 rgba(75, 210, 143, .5);
|
|
||||||
}
|
|
||||||
25% {
|
|
||||||
box-shadow: 0 0 0 10px rgba(75, 210, 143, 0);
|
|
||||||
}
|
|
||||||
30% {
|
|
||||||
box-shadow: 0 0 0 0 rgba(75, 210, 143, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.online .status-indicator-icon {
|
|
||||||
background-color: rgb(75, 210, 143);
|
|
||||||
animation-duration: 5s;
|
|
||||||
animation-timing-function: ease-in-out;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-direction: normal;
|
|
||||||
animation-delay: 0s;
|
|
||||||
animation-fill-mode: none;
|
|
||||||
animation-name: status-indicator-pulse-online;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-indicator.online .status-indicator-text::after {
|
|
||||||
content: "Online";
|
|
||||||
}
|
|
||||||
|
|
||||||
#editor {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.update-available i {
|
|
||||||
vertical-align: bottom;
|
|
||||||
font-size: 20px !important;
|
|
||||||
color: #3F51B5 !important;
|
|
||||||
margin-right: -4.5px;
|
|
||||||
margin-left: -5.5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flash-using-esphomeflasher {
|
|
||||||
vertical-align: middle;
|
|
||||||
color: #666 !important;
|
|
||||||
}
|
|
||||||
@@ -1,685 +0,0 @@
|
|||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
M.AutoInit(document.body);
|
|
||||||
});
|
|
||||||
|
|
||||||
const initializeColorState = () => {
|
|
||||||
return {
|
|
||||||
bold: false,
|
|
||||||
italic: false,
|
|
||||||
underline: false,
|
|
||||||
strikethrough: false,
|
|
||||||
foregroundColor: false,
|
|
||||||
backgroundColor: false,
|
|
||||||
carriageReturn: false,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const colorReplace = (pre, state, text) => {
|
|
||||||
const re = /(?:\033|\\033)(?:\[(.*?)[@-~]|\].*?(?:\007|\033\\))/g;
|
|
||||||
let i = 0;
|
|
||||||
|
|
||||||
if (state.carriageReturn) {
|
|
||||||
if (text !== "\n") {
|
|
||||||
// don't remove if \r\n
|
|
||||||
pre.removeChild(pre.lastChild);
|
|
||||||
}
|
|
||||||
state.carriageReturn = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text.includes("\r")) {
|
|
||||||
state.carriageReturn = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const lineSpan = document.createElement("span");
|
|
||||||
lineSpan.classList.add("line");
|
|
||||||
pre.appendChild(lineSpan);
|
|
||||||
|
|
||||||
const addSpan = (content) => {
|
|
||||||
if (content === "")
|
|
||||||
return;
|
|
||||||
|
|
||||||
const span = document.createElement("span");
|
|
||||||
if (state.bold) span.classList.add("log-bold");
|
|
||||||
if (state.italic) span.classList.add("log-italic");
|
|
||||||
if (state.underline) span.classList.add("log-underline");
|
|
||||||
if (state.strikethrough) span.classList.add("log-strikethrough");
|
|
||||||
if (state.foregroundColor !== null) span.classList.add(`log-fg-${state.foregroundColor}`);
|
|
||||||
if (state.backgroundColor !== null) span.classList.add(`log-bg-${state.backgroundColor}`);
|
|
||||||
span.appendChild(document.createTextNode(content));
|
|
||||||
lineSpan.appendChild(span);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
const match = re.exec(text);
|
|
||||||
if (match === null)
|
|
||||||
break;
|
|
||||||
|
|
||||||
const j = match.index;
|
|
||||||
addSpan(text.substring(i, j));
|
|
||||||
i = j + match[0].length;
|
|
||||||
|
|
||||||
if (match[1] === undefined) continue;
|
|
||||||
|
|
||||||
for (const colorCode of match[1].split(";")) {
|
|
||||||
switch (parseInt(colorCode)) {
|
|
||||||
case 0:
|
|
||||||
// reset
|
|
||||||
state.bold = false;
|
|
||||||
state.italic = false;
|
|
||||||
state.underline = false;
|
|
||||||
state.strikethrough = false;
|
|
||||||
state.foregroundColor = null;
|
|
||||||
state.backgroundColor = null;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
state.bold = true;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
state.italic = true;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
state.underline = true;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
state.strikethrough = true;
|
|
||||||
break;
|
|
||||||
case 22:
|
|
||||||
state.bold = false;
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
state.italic = false;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
state.underline = false;
|
|
||||||
break;
|
|
||||||
case 29:
|
|
||||||
state.strikethrough = false;
|
|
||||||
break;
|
|
||||||
case 30:
|
|
||||||
state.foregroundColor = "black";
|
|
||||||
break;
|
|
||||||
case 31:
|
|
||||||
state.foregroundColor = "red";
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
state.foregroundColor = "green";
|
|
||||||
break;
|
|
||||||
case 33:
|
|
||||||
state.foregroundColor = "yellow";
|
|
||||||
break;
|
|
||||||
case 34:
|
|
||||||
state.foregroundColor = "blue";
|
|
||||||
break;
|
|
||||||
case 35:
|
|
||||||
state.foregroundColor = "magenta";
|
|
||||||
break;
|
|
||||||
case 36:
|
|
||||||
state.foregroundColor = "cyan";
|
|
||||||
break;
|
|
||||||
case 37:
|
|
||||||
state.foregroundColor = "white";
|
|
||||||
break;
|
|
||||||
case 39:
|
|
||||||
state.foregroundColor = null;
|
|
||||||
break;
|
|
||||||
case 41:
|
|
||||||
state.backgroundColor = "red";
|
|
||||||
break;
|
|
||||||
case 42:
|
|
||||||
state.backgroundColor = "green";
|
|
||||||
break;
|
|
||||||
case 43:
|
|
||||||
state.backgroundColor = "yellow";
|
|
||||||
break;
|
|
||||||
case 44:
|
|
||||||
state.backgroundColor = "blue";
|
|
||||||
break;
|
|
||||||
case 45:
|
|
||||||
state.backgroundColor = "magenta";
|
|
||||||
break;
|
|
||||||
case 46:
|
|
||||||
state.backgroundColor = "cyan";
|
|
||||||
break;
|
|
||||||
case 47:
|
|
||||||
state.backgroundColor = "white";
|
|
||||||
break;
|
|
||||||
case 40:
|
|
||||||
case 49:
|
|
||||||
state.backgroundColor = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addSpan(text.substring(i));
|
|
||||||
};
|
|
||||||
|
|
||||||
const removeUpdateAvailable = (filename) => {
|
|
||||||
const p = document.querySelector(`.update-available[data-node="${filename}"]`);
|
|
||||||
if (p === undefined)
|
|
||||||
return;
|
|
||||||
p.remove();
|
|
||||||
};
|
|
||||||
|
|
||||||
let configuration = "";
|
|
||||||
let wsProtocol = "ws:";
|
|
||||||
if (window.location.protocol === "https:") {
|
|
||||||
wsProtocol = 'wss:';
|
|
||||||
}
|
|
||||||
const wsUrl = wsProtocol + '//' + window.location.hostname + ':' + window.location.port;
|
|
||||||
|
|
||||||
let isFetchingPing = false;
|
|
||||||
const fetchPing = () => {
|
|
||||||
if (isFetchingPing)
|
|
||||||
return;
|
|
||||||
isFetchingPing = true;
|
|
||||||
|
|
||||||
fetch('/ping', {credentials: "same-origin"}).then(res => res.json())
|
|
||||||
.then(response => {
|
|
||||||
for (let filename in response) {
|
|
||||||
let node = document.querySelector(`.status-indicator[data-node="${filename}"]`);
|
|
||||||
if (node === null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let status = response[filename];
|
|
||||||
let klass;
|
|
||||||
if (status === null) {
|
|
||||||
klass = 'unknown';
|
|
||||||
} else if (status === true) {
|
|
||||||
klass = 'online';
|
|
||||||
node.setAttribute('data-last-connected', Date.now().toString());
|
|
||||||
} else if (node.hasAttribute('data-last-connected')) {
|
|
||||||
const attr = parseInt(node.getAttribute('data-last-connected'));
|
|
||||||
if (Date.now() - attr <= 5000) {
|
|
||||||
klass = 'not-responding';
|
|
||||||
} else {
|
|
||||||
klass = 'offline';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
klass = 'offline';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node.classList.contains(klass))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
node.classList.remove('unknown', 'online', 'offline', 'not-responding');
|
|
||||||
node.classList.add(klass);
|
|
||||||
}
|
|
||||||
|
|
||||||
isFetchingPing = false;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
setInterval(fetchPing, 2000);
|
|
||||||
fetchPing();
|
|
||||||
|
|
||||||
const portSelect = document.querySelector('.nav-wrapper select');
|
|
||||||
let ports = [];
|
|
||||||
|
|
||||||
const fetchSerialPorts = (begin=false) => {
|
|
||||||
fetch('/serial-ports', {credentials: "same-origin"}).then(res => res.json())
|
|
||||||
.then(response => {
|
|
||||||
if (ports.length === response.length) {
|
|
||||||
let allEqual = true;
|
|
||||||
for (let i = 0; i < response.length; i++) {
|
|
||||||
if (ports[i].port !== response[i].port) {
|
|
||||||
allEqual = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (allEqual)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const hasNewPort = response.length >= ports.length;
|
|
||||||
|
|
||||||
ports = response;
|
|
||||||
|
|
||||||
const inst = M.FormSelect.getInstance(portSelect);
|
|
||||||
if (inst !== undefined) {
|
|
||||||
inst.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
portSelect.innerHTML = "";
|
|
||||||
const prevSelected = getUploadPort();
|
|
||||||
for (let i = 0; i < response.length; i++) {
|
|
||||||
const val = response[i];
|
|
||||||
if (val.port === prevSelected) {
|
|
||||||
portSelect.innerHTML += `<option value="${val.port}" selected>${val.port} (${val.desc})</option>`;
|
|
||||||
} else {
|
|
||||||
portSelect.innerHTML += `<option value="${val.port}">${val.port} (${val.desc})</option>`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
M.FormSelect.init(portSelect, {});
|
|
||||||
if (!begin && hasNewPort)
|
|
||||||
M.toast({html: "Discovered new serial port."});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const getUploadPort = () => {
|
|
||||||
const inst = M.FormSelect.getInstance(portSelect);
|
|
||||||
if (inst === undefined) {
|
|
||||||
return "OTA";
|
|
||||||
}
|
|
||||||
|
|
||||||
inst._setSelectedStates();
|
|
||||||
return inst.getSelectedValues()[0];
|
|
||||||
};
|
|
||||||
setInterval(fetchSerialPorts, 5000);
|
|
||||||
fetchSerialPorts(true);
|
|
||||||
|
|
||||||
const logsModalElem = document.getElementById("modal-logs");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-show-logs").forEach((showLogs) => {
|
|
||||||
showLogs.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(logsModalElem);
|
|
||||||
const log = logsModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = logsModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = logsModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/logs");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({html: "Program exited successfully."});
|
|
||||||
} else {
|
|
||||||
M.toast({html: `Program failed with code ${data.code}`});
|
|
||||||
}
|
|
||||||
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration, port: getUploadPort()});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const uploadModalElem = document.getElementById("modal-upload");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-upload").forEach((upload) => {
|
|
||||||
upload.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(uploadModalElem);
|
|
||||||
const log = uploadModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = uploadModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = uploadModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/run");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({html: "Program exited successfully."});
|
|
||||||
removeUpdateAvailable(configuration);
|
|
||||||
} else {
|
|
||||||
M.toast({html: `Program failed with code ${data.code}`});
|
|
||||||
}
|
|
||||||
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration, port: getUploadPort()});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const validateModalElem = document.getElementById("modal-validate");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-validate").forEach((upload) => {
|
|
||||||
upload.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(validateModalElem);
|
|
||||||
const log = validateModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = validateModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = validateModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/validate");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({
|
|
||||||
html: `<code class="inlinecode">${configuration}</code> is valid 👍`,
|
|
||||||
displayLength: 5000,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
M.toast({
|
|
||||||
html: `<code class="inlinecode">${configuration}</code> is invalid 😕`,
|
|
||||||
displayLength: 5000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const compileModalElem = document.getElementById("modal-compile");
|
|
||||||
const downloadButton = compileModalElem.querySelector('.download-binary');
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-compile").forEach((upload) => {
|
|
||||||
upload.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(compileModalElem);
|
|
||||||
const log = compileModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = compileModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
downloadButton.classList.add('disabled');
|
|
||||||
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = compileModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/compile");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({html: "Program exited successfully."});
|
|
||||||
downloadButton.classList.remove('disabled');
|
|
||||||
} else {
|
|
||||||
M.toast({html: `Program failed with code ${data.code}`});
|
|
||||||
}
|
|
||||||
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
downloadButton.addEventListener('click', () => {
|
|
||||||
const link = document.createElement("a");
|
|
||||||
link.download = name;
|
|
||||||
link.href = '/download.bin?configuration=' + encodeURIComponent(configuration);
|
|
||||||
document.body.appendChild(link);
|
|
||||||
link.click();
|
|
||||||
link.remove();
|
|
||||||
});
|
|
||||||
|
|
||||||
const cleanMqttModalElem = document.getElementById("modal-clean-mqtt");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-clean-mqtt").forEach((btn) => {
|
|
||||||
btn.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(cleanMqttModalElem);
|
|
||||||
const log = cleanMqttModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = cleanMqttModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = cleanMqttModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/clean-mqtt");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const cleanModalElem = document.getElementById("modal-clean");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-clean").forEach((btn) => {
|
|
||||||
btn.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(cleanModalElem);
|
|
||||||
const log = cleanModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = cleanModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = cleanModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/clean");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({html: "Program exited successfully."});
|
|
||||||
downloadButton.classList.remove('disabled');
|
|
||||||
} else {
|
|
||||||
M.toast({html: `Program failed with code ${data.code}`});
|
|
||||||
}
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const hassConfigModalElem = document.getElementById("modal-hass-config");
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-hass-config").forEach((btn) => {
|
|
||||||
btn.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(hassConfigModalElem);
|
|
||||||
const log = hassConfigModalElem.querySelector(".log");
|
|
||||||
log.innerHTML = "";
|
|
||||||
const colorState = initializeColorState();
|
|
||||||
const stopLogsButton = hassConfigModalElem.querySelector(".stop-logs");
|
|
||||||
let stopped = false;
|
|
||||||
stopLogsButton.innerHTML = "Stop";
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
const filenameField = hassConfigModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
const logSocket = new WebSocket(wsUrl + "/hass-config");
|
|
||||||
logSocket.addEventListener('message', (event) => {
|
|
||||||
const data = JSON.parse(event.data);
|
|
||||||
if (data.event === "line") {
|
|
||||||
colorReplace(log, colorState, data.data);
|
|
||||||
} else if (data.event === "exit") {
|
|
||||||
if (data.code === 0) {
|
|
||||||
M.toast({html: "Program exited successfully."});
|
|
||||||
downloadButton.classList.remove('disabled');
|
|
||||||
} else {
|
|
||||||
M.toast({html: `Program failed with code ${data.code}`});
|
|
||||||
}
|
|
||||||
stopLogsButton.innerHTML = "Close";
|
|
||||||
stopped = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('open', () => {
|
|
||||||
const msg = JSON.stringify({configuration: configuration});
|
|
||||||
logSocket.send(msg);
|
|
||||||
});
|
|
||||||
logSocket.addEventListener('close', () => {
|
|
||||||
if (!stopped) {
|
|
||||||
M.toast({html: 'Terminated process.'});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
logSocket.close();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const editModalElem = document.getElementById("modal-editor");
|
|
||||||
const editorElem = editModalElem.querySelector("#editor");
|
|
||||||
const editor = ace.edit(editorElem);
|
|
||||||
editor.setTheme("ace/theme/dreamweaver");
|
|
||||||
editor.session.setMode("ace/mode/yaml");
|
|
||||||
editor.session.setOption('useSoftTabs', true);
|
|
||||||
editor.session.setOption('tabSize', 2);
|
|
||||||
|
|
||||||
const saveButton = editModalElem.querySelector(".save-button");
|
|
||||||
const saveEditor = () => {
|
|
||||||
fetch(`/edit?configuration=${configuration}`, {
|
|
||||||
credentials: "same-origin",
|
|
||||||
method: "POST",
|
|
||||||
body: editor.getValue()
|
|
||||||
}).then(res => res.text()).then(() => {
|
|
||||||
M.toast({
|
|
||||||
html: `Saved <code class="inlinecode">${configuration}</code>`
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
editor.commands.addCommand({
|
|
||||||
name: 'saveCommand',
|
|
||||||
bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
|
|
||||||
exec: saveEditor,
|
|
||||||
readOnly: false
|
|
||||||
});
|
|
||||||
|
|
||||||
saveButton.addEventListener('click', saveEditor);
|
|
||||||
|
|
||||||
document.querySelectorAll(".action-edit").forEach((btn) => {
|
|
||||||
btn.addEventListener('click', (e) => {
|
|
||||||
configuration = e.target.getAttribute('data-node');
|
|
||||||
const modalInstance = M.Modal.getInstance(editModalElem);
|
|
||||||
const filenameField = editModalElem.querySelector('.filename');
|
|
||||||
filenameField.innerHTML = configuration;
|
|
||||||
|
|
||||||
fetch(`/edit?configuration=${configuration}`, {credentials: "same-origin"})
|
|
||||||
.then(res => res.text()).then(response => {
|
|
||||||
editor.setValue(response, -1);
|
|
||||||
});
|
|
||||||
|
|
||||||
modalInstance.open();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const modalSetupElem = document.getElementById("modal-wizard");
|
|
||||||
const setupWizardStart = document.getElementById('setup-wizard-start');
|
|
||||||
const startWizard = () => {
|
|
||||||
const modalInstance = M.Modal.getInstance(modalSetupElem);
|
|
||||||
modalInstance.open();
|
|
||||||
|
|
||||||
modalInstance.options.onCloseStart = () => {
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
$('.stepper').activateStepper({
|
|
||||||
linearStepsNavigation: false,
|
|
||||||
autoFocusInput: true,
|
|
||||||
autoFormCreation: true,
|
|
||||||
showFeedbackLoader: true,
|
|
||||||
parallel: false
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
setupWizardStart.addEventListener('click', startWizard);
|
|
||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
-401
@@ -1,401 +0,0 @@
|
|||||||
/*!
|
|
||||||
* jQuery UI 1.8.5
|
|
||||||
*
|
|
||||||
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI
|
|
||||||
*/
|
|
||||||
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
|
|
||||||
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
|
|
||||||
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
|
|
||||||
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
|
|
||||||
"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this,
|
|
||||||
h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
|
|
||||||
c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,
|
|
||||||
d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
|
|
||||||
(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
|
|
||||||
a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)===
|
|
||||||
"_")return h;e?this.each(function(){var g=b.data(this,a);if(!g)throw"cannot call methods on "+a+" prior to initialization; attempted to call method '"+d+"'";if(!b.isFunction(g[d]))throw"no such method '"+d+"' for "+a+" widget instance";var i=g[d].apply(g,f);if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",
|
|
||||||
widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+
|
|
||||||
"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f,h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",
|
|
||||||
false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
|
|
||||||
(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
|
|
||||||
this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
|
|
||||||
return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
|
|
||||||
this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
|
|
||||||
a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
|
|
||||||
(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
|
|
||||||
"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
|
|
||||||
this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
|
|
||||||
this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
|
|
||||||
d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
|
|
||||||
this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,
|
|
||||||
b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
|
|
||||||
a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
|
|
||||||
0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
|
|
||||||
this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
|
|
||||||
(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
|
|
||||||
"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&
|
|
||||||
a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),
|
|
||||||
10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
|
|
||||||
this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
|
|
||||||
f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+
|
|
||||||
this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+
|
|
||||||
Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-
|
|
||||||
this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=
|
|
||||||
this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.5"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");
|
|
||||||
if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;
|
|
||||||
c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=
|
|
||||||
1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;
|
|
||||||
this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=
|
|
||||||
this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=
|
|
||||||
d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;
|
|
||||||
if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!=
|
|
||||||
"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-
|
|
||||||
b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
|
|
||||||
c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
|
|
||||||
width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&
|
|
||||||
o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=
|
|
||||||
p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&
|
|
||||||
(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
|
|
||||||
10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
|
|
||||||
(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
|
|
||||||
a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
|
|
||||||
this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
|
|
||||||
this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
|
|
||||||
d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
|
|
||||||
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.5"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
|
|
||||||
switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
|
|
||||||
i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
|
|
||||||
"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
|
|
||||||
a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
|
|
||||||
d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
|
|
||||||
(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
|
|
||||||
_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
|
|
||||||
top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
|
|
||||||
this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
|
|
||||||
nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
|
|
||||||
String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
|
|
||||||
this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
|
|
||||||
if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
|
|
||||||
d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
|
|
||||||
this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
|
|
||||||
this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
|
|
||||||
b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
|
|
||||||
f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
|
|
||||||
b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
|
|
||||||
a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
|
|
||||||
k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
|
|
||||||
c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
|
|
||||||
this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
|
|
||||||
a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
|
|
||||||
arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
|
|
||||||
{version:"1.8.5"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
|
|
||||||
function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
|
|
||||||
(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
|
|
||||||
false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
|
|
||||||
a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
|
|
||||||
b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
|
|
||||||
"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
|
|
||||||
f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
|
|
||||||
a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
|
|
||||||
a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
|
|
||||||
e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
|
|
||||||
height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
|
|
||||||
d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
|
|
||||||
(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
|
|
||||||
selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
|
|
||||||
c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
|
|
||||||
c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
|
|
||||||
this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
|
|
||||||
a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
|
|
||||||
!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
|
|
||||||
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.5"})})(jQuery);
|
|
||||||
(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
|
|
||||||
this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,
|
|
||||||
arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=
|
|
||||||
c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,
|
|
||||||
{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();
|
|
||||||
if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",
|
|
||||||
a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");
|
|
||||||
if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+
|
|
||||||
this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+
|
|
||||||
b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+
|
|
||||||
"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,
|
|
||||||
c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==
|
|
||||||
document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",
|
|
||||||
null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):
|
|
||||||
d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||
|
|
||||||
"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+
|
|
||||||
this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?
|
|
||||||
2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},
|
|
||||||
_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=
|
|
||||||
this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=
|
|
||||||
this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");
|
|
||||||
if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=
|
|
||||||
0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=
|
|
||||||
this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},
|
|
||||||
update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=
|
|
||||||
null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));
|
|
||||||
this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,
|
|
||||||
null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||
|
|
||||||
d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a==
|
|
||||||
"string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition==
|
|
||||||
"absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition==
|
|
||||||
"relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},
|
|
||||||
_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-
|
|
||||||
this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),
|
|
||||||
10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?
|
|
||||||
this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=
|
|
||||||
this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+
|
|
||||||
this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?
|
|
||||||
g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
|
|
||||||
e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==
|
|
||||||
f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",
|
|
||||||
f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",
|
|
||||||
g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=
|
|
||||||
0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
|
|
||||||
this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});
|
|
||||||
d.extend(d.ui.sortable,{version:"1.8.5"})})(jQuery);
|
|
||||||
jQuery.effects||function(f,j){function l(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
|
|
||||||
16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return m.transparent;return m[f.trim(c).toLowerCase()]}function r(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return l(b)}function n(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
|
|
||||||
a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function o(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in s||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function t(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
|
|
||||||
a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=r(b.elem,a);b.end=l(b.end);b.colorInit=
|
|
||||||
true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var m={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,
|
|
||||||
183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,
|
|
||||||
165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},p=["add","remove","toggle"],s={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=o(n.call(this)),q,u=e.attr("className");f.each(p,function(v,
|
|
||||||
i){c[i]&&e[i+"Class"](c[i])});q=o(n.call(this));e.attr("className",u);e.animate(t(h,q),a,b,function(){f.each(p,function(v,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?
|
|
||||||
f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.5",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==
|
|
||||||
null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();
|
|
||||||
var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});
|
|
||||||
c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c||
|
|
||||||
typeof c=="number"||f.fx.speeds[c]||!f.effects[c])return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||!f.effects[c])return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||!f.effects[c]||typeof c==
|
|
||||||
"boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,
|
|
||||||
a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=
|
|
||||||
e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+
|
|
||||||
b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/
|
|
||||||
2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*
|
|
||||||
a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;
|
|
||||||
return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,
|
|
||||||
a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
|
|
||||||
(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a);
|
|
||||||
c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
|
|
||||||
(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
|
|
||||||
3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
|
|
||||||
b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
|
|
||||||
(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]=
|
|
||||||
f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
|
|
||||||
(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1:
|
|
||||||
0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
|
||||||
(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
|
|
||||||
0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
|
|
||||||
e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
|
|
||||||
(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
|
|
||||||
(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100*
|
|
||||||
f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
|
|
||||||
(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
|
|
||||||
this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
|
||||||
(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
|
|
||||||
a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
|
|
||||||
(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
|
|
||||||
b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
|
|
||||||
1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a,
|
|
||||||
b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!=
|
|
||||||
d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from);
|
|
||||||
if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child,
|
|
||||||
f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&&
|
|
||||||
b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
|
||||||
(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+
|
|
||||||
e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
|
|
||||||
(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],e=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(e=="show")a.css(f,b=="pos"?-g:g);var i={};i[f]=(e=="show"?b=="pos"?
|
|
||||||
"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
|
|
||||||
(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
|
|
||||||
b.dequeue()})})}})(jQuery);
|
|
||||||
(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
|
|
||||||
a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
|
|
||||||
if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",function(g){return a._keydown(g)}).next().attr("role",
|
|
||||||
"tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);
|
|
||||||
this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
|
|
||||||
this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
|
|
||||||
b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
|
|
||||||
a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
|
|
||||||
c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
|
|
||||||
if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);
|
|
||||||
a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
|
|
||||||
this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j,
|
|
||||||
down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})});
|
|
||||||
f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.5",animations:{slide:function(a,
|
|
||||||
b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1],
|
|
||||||
unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
|
|
||||||
paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
|
|
||||||
(function(e){e.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!a.options.disabled){var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage",
|
|
||||||
c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault();break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:case d.NUMPAD_ENTER:a.menu.element.is(":visible")&&c.preventDefault();case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);
|
|
||||||
break}}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo(e(this.options.appendTo||"body",b)[0]).mousedown(function(c){var d=a.menu.element[0];
|
|
||||||
c.target===d&&setTimeout(function(){e(document).one("mousedown",function(f){f.target!==a.element[0]&&f.target!==d&&!e.ui.contains(d,f.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");var f=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();
|
|
||||||
a.previous=f}if(false!==a._trigger("select",c,{item:d})){a.term=d.value;a.element.val(d.value)}a.close(c);a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
|
|
||||||
this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a,b){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(e(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,c;if(e.isArray(this.options.source)){b=this.options.source;this.source=function(d,f){f(e.ui.autocomplete.filter(b,d.term))}}else if(typeof this.options.source==="string"){c=this.options.source;this.source=
|
|
||||||
function(d,f){a.xhr&&a.xhr.abort();a.xhr=e.getJSON(c,d,function(g,i,h){h===a.xhr&&f(g);a.xhr=null})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(a.length){a=
|
|
||||||
this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(b){if(typeof b===
|
|
||||||
"string")return{label:b,value:b};return e.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1),c;this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position(e.extend({of:this.element},this.options.position));a=b.width("").outerWidth();c=this.element.outerWidth();b.outerWidth(Math.max(a,c))},_renderMenu:function(a,b){var c=this;e.each(b,function(d,f){c._renderItem(a,f)})},
|
|
||||||
_renderItem:function(a,b){return e("<li></li>").data("item.autocomplete",b).append(e("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},
|
|
||||||
filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value||d)})}})})(jQuery);
|
|
||||||
(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
|
|
||||||
-1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>=f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
|
|
||||||
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
|
|
||||||
a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active||
|
|
||||||
this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last"));else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},
|
|
||||||
hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
|
|
||||||
(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
|
|
||||||
i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
|
|
||||||
function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
|
|
||||||
b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
|
|
||||||
g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
|
|
||||||
c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
|
|
||||||
this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
|
|
||||||
this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
|
|
||||||
true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
|
|
||||||
c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
|
|
||||||
this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":visible").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end().end()},
|
|
||||||
destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
|
|
||||||
(function(d,G){function L(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
|
|
||||||
"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
|
|
||||||
"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
|
|
||||||
minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a,
|
|
||||||
b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.5"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=
|
|
||||||
f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
|
|
||||||
_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
|
|
||||||
b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
|
|
||||||
""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
|
|
||||||
c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
|
|
||||||
true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==
|
|
||||||
Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);
|
|
||||||
d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},
|
|
||||||
_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=
|
|
||||||
d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;
|
|
||||||
for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&
|
|
||||||
this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&
|
|
||||||
!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();
|
|
||||||
return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||
|
|
||||||
a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,
|
|
||||||
a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));
|
|
||||||
var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||
|
|
||||||
a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);
|
|
||||||
d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&
|
|
||||||
d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,
|
|
||||||
h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");
|
|
||||||
this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");
|
|
||||||
this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");
|
|
||||||
a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),
|
|
||||||
k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];
|
|
||||||
a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():
|
|
||||||
"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&
|
|
||||||
!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;
|
|
||||||
b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=
|
|
||||||
this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=
|
|
||||||
d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,
|
|
||||||
"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b==
|
|
||||||
"object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?
|
|
||||||
3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,H){p=o(p)?H:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length).toLowerCase()==p[w].toLowerCase()){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");
|
|
||||||
break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>
|
|
||||||
-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*
|
|
||||||
60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)==
|
|
||||||
"'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+=
|
|
||||||
"'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},
|
|
||||||
_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,
|
|
||||||
this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=
|
|
||||||
parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1],10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},
|
|
||||||
_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?
|
|
||||||
"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=
|
|
||||||
this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,
|
|
||||||
"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+
|
|
||||||
n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
|
|
||||||
(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
|
|
||||||
y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var N=
|
|
||||||
"",D=0;D<i[1];D++){var J=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?
|
|
||||||
f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
|
|
||||||
A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&q<j||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==J.getTime()&&g==a.selectedMonth&&
|
|
||||||
a._keyEvent||M.getTime()==q.getTime()&&M.getTime()==J.getTime()?" "+this._dayOverClass:"")+(K?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(K?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?" ":K?'<span class="ui-state-default">'+q.getDate()+
|
|
||||||
"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==J.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
|
|
||||||
"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+
|
|
||||||
a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,
|
|
||||||
i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e=
|
|
||||||
a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
|
|
||||||
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
|
|
||||||
c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
|
|
||||||
"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
|
|
||||||
function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
|
|
||||||
return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery);
|
|
||||||
(function(c,j){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");
|
|
||||||
if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",f=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog",
|
|
||||||
"aria-labelledby":f}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var e=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);
|
|
||||||
return false}).appendTo(e);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",f).html(d).prependTo(e);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;e.find("*").add(e).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&
|
|
||||||
g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");
|
|
||||||
b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,f=d.options;if(f.modal&&!a||!f.stack&&!f.modal)return d._trigger("focus",b);if(f.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=
|
|
||||||
f.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);
|
|
||||||
a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(f){if(f.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),e=g.filter(":first");g=g.filter(":last");if(f.target===g[0]&&!f.shiftKey){e.focus(1);return false}else if(f.target===e[0]&&f.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,
|
|
||||||
f=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(f);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(e,h){h=c.isFunction(h)?{click:h,text:e}:h;e=c("<button></button>",h).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&e.button()});f.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(e){return{position:e.position,
|
|
||||||
offset:e.offset}}var b=this,d=b.options,f=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(e,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",e,a(h))},drag:function(e,h){b._trigger("drag",e,a(h))},stop:function(e,h){d.position=[h.position.left-f.scrollLeft(),h.position.top-f.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);
|
|
||||||
b._trigger("dragStop",e,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}a=a===j?this.options.resizable:a;var d=this,f=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:d._minHeight(),
|
|
||||||
handles:a,start:function(e,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",e,b(h))},resize:function(e,h){d._trigger("resize",e,b(h))},stop:function(e,h){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();d._trigger("resizeStop",e,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,
|
|
||||||
a.height)},_position:function(a){var b=[],d=[0,0],f;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,e){if(+b[g]===b[g]){d[g]=b[g];b[g]=e}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a);
|
|
||||||
f||this.uiDialog.hide()},_setOption:function(a,b){var d=this,f=d.uiDialog,g=f.is(":data(resizable)"),e=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);e=true;break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":f.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case "draggable":b?
|
|
||||||
d._makeDraggable():f.draggable("destroy");break;case "height":e=true;break;case "maxHeight":g&&f.resizable("option","maxHeight",b);e=true;break;case "maxWidth":g&&f.resizable("option","maxWidth",b);e=true;break;case "minHeight":g&&f.resizable("option","minHeight",b);e=true;break;case "minWidth":g&&f.resizable("option","minWidth",b);e=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&f.resizable("destroy");g&&typeof b==="string"&&f.resizable("option","handles",b);!g&&b!==false&&
|
|
||||||
d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break;case "width":e=true;break}c.Widget.prototype._setOption.apply(d,arguments);e&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:c.support.minHeight?"auto":Math.max(a.minHeight-
|
|
||||||
b,0)}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.5",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),
|
|
||||||
function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=
|
|
||||||
(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,
|
|
||||||
b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<
|
|
||||||
b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
|
|
||||||
(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.scrollTo&&d.document){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j=
|
|
||||||
{top:b.of.pageY,left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/
|
|
||||||
2;if(b.at[1]==="bottom")j.top+=k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]===
|
|
||||||
"center")i.top-=m/2;i.left=parseInt(i.left);i.top=parseInt(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();
|
|
||||||
b.left=d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];
|
|
||||||
b.left+=a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=
|
|
||||||
c(b),g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
|
|
||||||
(function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
|
|
||||||
this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right",
|
|
||||||
a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.5"})})(jQuery);
|
|
||||||
(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");b.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
|
|
||||||
this.range=d([]);if(b.range){if(b.range===true){this.range=d("<div></div>");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
|
|
||||||
if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length<b.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();
|
|
||||||
else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
|
|
||||||
false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");h=a._start(c,f);if(h===false)return}break}i=a.options.step;h=a.options.values&&a.options.values.length?(g=a.values(f)):(g=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=a._valueMin();break;case d.ui.keyCode.END:g=a._valueMax();break;case d.ui.keyCode.PAGE_UP:g=a._trimAlignValue(h+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=a._trimAlignValue(h-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
|
|
||||||
a._valueMax())return;g=a._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===a._valueMin())return;g=a._trimAlignValue(h-i);break}a._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
|
|
||||||
this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,h,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(b.range===true&&this.values(1)===b.min){g+=1;f=d(this.handles[g])}if(this._start(a,
|
|
||||||
g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();b=f.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-f.width()/2,top:a.pageY-b.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b=
|
|
||||||
this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b=
|
|
||||||
this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);
|
|
||||||
c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c<e))c=e;if(c!==this.values(b)){e=this.values();e[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c});
|
|
||||||
a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=
|
|
||||||
this._trimAlignValue(a);this._refreshValue();this._change(null,0)}return this._value()},values:function(a,b){var c,e,f;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):this.value();
|
|
||||||
else return this._values()},_setOption:function(a,b){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
|
|
||||||
this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a];
|
|
||||||
return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<this._valueMin())return this._valueMin();if(a>this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=
|
|
||||||
this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({width:f-
|
|
||||||
g+"%"},{queue:false,duration:b.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:b.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},
|
|
||||||
b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.5"})})(jQuery);
|
|
||||||
(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading…</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(a,e){if(a=="selected")this.options.collapsible&&
|
|
||||||
e==this.options.selected||this.select(e);else{this.options[a]=e;this._tabify()}},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var a=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[a].concat(d.makeArray(arguments)))},_ui:function(a,e){return{tab:a,panel:e,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var a=
|
|
||||||
d(this);a.html(a.data("label.tabs")).removeData("label.tabs")})},_tabify:function(a){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var b=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
|
|
||||||
(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))b.panels=b.panels.add(b._sanitizeSelector(i));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=b._tabId(f);f.href="#"+i;f=d("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(b.panels[g-1]||b.list);f.data("destroy.tabs",true)}b.panels=b.panels.add(f)}else c.disabled.push(g)});if(a){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
|
|
||||||
this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(b._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
|
|
||||||
this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return b.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
|
|
||||||
if(c.selected>=0&&this.anchors.length){this.panels.eq(c.selected).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");b.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[c.selected],b.panels[c.selected]))});this.load(c.selected)}d(window).bind("unload",function(){b.lis.add(b.anchors).unbind(".tabs");b.lis=b.anchors=b.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[c.collapsible?"addClass":
|
|
||||||
"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);a=0;for(var j;j=this.lis[a];a++)d(j)[d.inArray(a,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs",
|
|
||||||
function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);b._trigger("show",
|
|
||||||
null,b._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");b._trigger("show",null,b._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);b.element.dequeue("tabs")})}:function(g,f){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");b.element.dequeue("tabs")};this.anchors.bind(c.event+".tabs",
|
|
||||||
function(){var g=this,f=d(g).closest("li"),i=b.panels.filter(":not(.ui-tabs-hide)"),l=d(b._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||b.panels.filter(":animated").length||b._trigger("select",null,b._ui(this,l[0]))===false){this.blur();return false}c.selected=b.anchors.index(this);b.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=-1;c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",
|
|
||||||
function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this));this.blur();return false}c.cookie&&b._cookie(c.selected,c.cookie);if(l.length){i.length&&b.element.queue("tabs",function(){s(g,i)});b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",
|
|
||||||
function(){return false})},_getIndex:function(a){if(typeof a=="string")a=this.anchors.index(this.anchors.filter("[href$="+a+"]"));return a},destroy:function(){var a=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=
|
|
||||||
e;var b=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){b.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});a.cookie&&this._cookie(null,a.cookie);return this},add:function(a,e,b){if(b===p)b=this.anchors.length;
|
|
||||||
var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,a).replace(/#\{label\}/g,e));a=!a.indexOf("#")?a.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=d("#"+a);j.length||(j=d(h.panelTemplate).attr("id",a).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(b>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[b]);
|
|
||||||
j.insertBefore(this.panels[b])}h.disabled=d.map(h.disabled,function(k){return k>=b?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[b],this.panels[b]));return this},remove:function(a){a=this._getIndex(a);var e=this.options,b=this.lis.eq(a).remove(),c=this.panels.eq(a).remove();
|
|
||||||
if(b.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(a+(a+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=a}),function(h){return h>=a?--h:h});this._tabify();this._trigger("remove",null,this._ui(b.find("a")[0],c[0]));return this},enable:function(a){a=this._getIndex(a);var e=this.options;if(d.inArray(a,e.disabled)!=-1){this.lis.eq(a).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(b){return b!=a});this._trigger("enable",null,
|
|
||||||
this._ui(this.anchors[a],this.panels[a]));return this}},disable:function(a){a=this._getIndex(a);var e=this.options;if(a!=e.selected){this.lis.eq(a).addClass("ui-state-disabled");e.disabled.push(a);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))}return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},
|
|
||||||
load:function(a){a=this._getIndex(a);var e=this,b=this.options,c=this.anchors.eq(a)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(a).addClass("ui-state-processing");if(b.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(b.spinner)}this.xhr=d.ajax(d.extend({},b.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(c.hash)).html(k);e._cleanup();b.cache&&d.data(c,"cache.tabs",
|
|
||||||
true);e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.error(k,n,a,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(a,
|
|
||||||
e){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.5"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(a,e){var b=this,c=this.options,h=b._rotate||(b._rotate=function(j){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var k=c.selected;b.select(++k<b.anchors.length?k:0)},a);j&&j.stopPropagation()});e=b._unrotate||(b._unrotate=!e?function(j){j.clientX&&b.rotate(null)}:
|
|
||||||
function(){t=c.selected;h()});if(a){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(b.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
|
|
||||||
-4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
|
|||||||
ace.define("ace/mode/yaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"list.markup",regex:/^(?:-{3}|\.{3})\s*(?=#|$)/},{token:"list.markup",regex:/^\s*[\-?](?:$|\s)/},{token:"constant",regex:"!![\\w//]+"},{token:"constant.language",regex:"[&\\*][a-zA-Z0-9-_]+"},{token:["meta.tag","keyword"],regex:/^(\s*\w.*?)(:(?=\s|$))/},{token:["meta.tag","keyword"],regex:/(\w+?)(\s*:(?=\s|$))/},{token:"keyword.operator",regex:"<<\\w*:\\w*"},{token:"keyword.operator",regex:"-\\s*(?=[{])"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:/[|>][-+\d\s]*$/,onMatch:function(e,t,n,r){var i=/^\s*/.exec(r)[0];return n.length<1?n.push(this.next):n[0]="mlString",n.length<2?n.push(i.length):n[1]=i.length,this.token},next:"mlString"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:/(\b|[+\-\.])[\d_]+(?:(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)(?=[^\d-\w]|$)/},{token:"constant.numeric",regex:/[+\-]?\.inf\b|NaN\b|0x[\dA-Fa-f_]+|0b[10_]+/},{token:"constant.language.boolean",regex:"\\b(?:true|false|TRUE|FALSE|True|False|yes|no)\\b"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:/[^\s,:\[\]\{\}]+/}],mlString:[{token:"indent",regex:/^\s*$/},{token:"indent",regex:/^\s*/,onMatch:function(e,t,n){var r=n[1];return r>=e.length?(this.next="start",n.splice(0)):this.next="mlString",this.token},next:"mlString"},{token:"string",regex:".+"}]},this.normalizeRules()};r.inherits(s,i),t.YamlHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=e("../../range").Range,o=t.FoldMode=function(){};r.inherits(o,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=this.indentationBlock(e,n);if(r)return r;var i=/\S/,o=e.getLine(n),u=o.search(i);if(u==-1||o[u]!="#")return;var a=o.length,f=e.getLength(),l=n,c=n;while(++n<f){o=e.getLine(n);var h=o.search(i);if(h==-1)continue;if(o[h]!="#")break;c=n}if(c>l){var p=e.getLine(c).length;return new s(l,a,c,p)}},this.getFoldWidget=function(e,t,n){var r=e.getLine(n),i=r.search(/\S/),s=e.getLine(n+1),o=e.getLine(n-1),u=o.search(/\S/),a=s.search(/\S/);if(i==-1)return e.foldWidgets[n-1]=u!=-1&&u<a?"start":"","";if(u==-1){if(i==a&&r[i]=="#"&&s[i]=="#")return e.foldWidgets[n-1]="",e.foldWidgets[n+1]="","start"}else if(u==i&&r[i]=="#"&&o[i]=="#"&&e.getLine(n-2).search(/\S/)==-1)return e.foldWidgets[n-1]="start",e.foldWidgets[n+1]="","";return u!=-1&&u<i?e.foldWidgets[n-1]="start":e.foldWidgets[n-1]="",i<a?"start":""}}.call(o.prototype)}),ace.define("ace/mode/yaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/yaml_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/coffee"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./yaml_highlight_rules").YamlHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/coffee").FoldMode,a=function(){this.HighlightRules=s,this.$outdent=new o,this.foldingRules=new u,this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart=["#"],this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.$id="ace/mode/yaml"}.call(a.prototype),t.Mode=a}); (function() {
|
|
||||||
ace.require(["ace/mode/yaml"], function(m) {
|
|
||||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
|
||||||
module.exports = m;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
ace.define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-dreamweaver",t.cssText='.ace-dreamweaver .ace_gutter {background: #e8e8e8;color: #333;}.ace-dreamweaver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-dreamweaver {background-color: #FFFFFF;color: black;}.ace-dreamweaver .ace_fold {background-color: #757AD8;}.ace-dreamweaver .ace_cursor {color: black;}.ace-dreamweaver .ace_invisible {color: rgb(191, 191, 191);}.ace-dreamweaver .ace_storage,.ace-dreamweaver .ace_keyword {color: blue;}.ace-dreamweaver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-dreamweaver .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-dreamweaver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-dreamweaver .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-dreamweaver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_support.ace_type,.ace-dreamweaver .ace_support.ace_class {color: #009;}.ace-dreamweaver .ace_support.ace_php_tag {color: #f00;}.ace-dreamweaver .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-dreamweaver .ace_string {color: #00F;}.ace-dreamweaver .ace_comment {color: rgb(76, 136, 107);}.ace-dreamweaver .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-dreamweaver .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-dreamweaver .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-dreamweaver .ace_variable {color: #06F}.ace-dreamweaver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-dreamweaver .ace_entity.ace_name.ace_function {color: #00F;}.ace-dreamweaver .ace_heading {color: rgb(12, 7, 255);}.ace-dreamweaver .ace_list {color:rgb(185, 6, 144);}.ace-dreamweaver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-dreamweaver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-dreamweaver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-dreamweaver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-dreamweaver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-dreamweaver .ace_gutter-active-line {background-color : #DCDCDC;}.ace-dreamweaver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-dreamweaver .ace_meta.ace_tag {color:#009;}.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {color:#060;}.ace-dreamweaver .ace_meta.ace_tag.ace_form {color:#F90;}.ace-dreamweaver .ace_meta.ace_tag.ace_image {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_script {color:#900;}.ace-dreamweaver .ace_meta.ace_tag.ace_style {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_table {color:#099;}.ace-dreamweaver .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-dreamweaver .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() {
|
|
||||||
ace.require(["ace/theme/dreamweaver"], function(m) {
|
|
||||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
|
||||||
module.exports = m;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>esphomeyaml Dashboard</title>
|
|
||||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
||||||
<link rel="stylesheet" href="{{ get_static_file_url('materialize.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ get_static_file_url('esphomeyaml.css') }}">
|
|
||||||
<link rel="shortcut icon" href="{{ get_static_file_url('favicon.ico') }}">
|
|
||||||
|
|
||||||
<script src="{{ get_static_file_url('materialize.min.js') }}"></script>
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<header>
|
|
||||||
<nav>
|
|
||||||
<div class="nav-wrapper indigo">
|
|
||||||
<a href="#" class="brand-logo left">esphomeyaml Dashboard</a>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="ribbon"></div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col card s10 offset-s1 m10 offset-m1 l8 offset-l2">
|
|
||||||
<form action="/login" method="post">
|
|
||||||
<div class="card-content">
|
|
||||||
<span class="card-title">Enter credentials</span>
|
|
||||||
<p>
|
|
||||||
Please login using your Home Assistant credentials.
|
|
||||||
</p>
|
|
||||||
{% if error is not None %}
|
|
||||||
<p>
|
|
||||||
{{ escape(error) }}
|
|
||||||
</p>
|
|
||||||
{% end %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="input-field col s12">
|
|
||||||
<label for="username">Username</label>
|
|
||||||
<input type="text" class="validate" name="username" id="username" />
|
|
||||||
</div>
|
|
||||||
<div class="input-field col s12">
|
|
||||||
<label for="password">Password</label>
|
|
||||||
<input type="password" class="validate" name="password" id="password" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-action right-align">
|
|
||||||
<button class="btn indigo waves-effect waves-light" type="submit" name="action">Login</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer class="page-footer indigo darken-1">
|
|
||||||
<div class="container">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="footer-copyright">
|
|
||||||
<div class="container">
|
|
||||||
© 2018 Copyright Otto Winter, Made with <a class="grey-text text-lighten-4" href="https://materializecss.com/" target="_blank">Materialize</a>
|
|
||||||
<a class="grey-text text-lighten-4 right" href="{{ docs_link }}" target="_blank">esphomeyaml {{ version }} Documentation</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
import functools
|
|
||||||
import sys
|
|
||||||
|
|
||||||
PYTHON_MAJOR = sys.version_info[0]
|
|
||||||
IS_PY2 = PYTHON_MAJOR == 2
|
|
||||||
IS_PY3 = PYTHON_MAJOR == 3
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=no-else-return
|
|
||||||
def safe_input(line):
|
|
||||||
if IS_PY2:
|
|
||||||
return raw_input(line)
|
|
||||||
else:
|
|
||||||
return input(line)
|
|
||||||
|
|
||||||
|
|
||||||
if IS_PY2:
|
|
||||||
text_type = unicode
|
|
||||||
string_types = (str, unicode)
|
|
||||||
integer_types = (int, long)
|
|
||||||
binary_type = str
|
|
||||||
else:
|
|
||||||
text_type = str
|
|
||||||
string_types = (str,)
|
|
||||||
integer_types = (int,)
|
|
||||||
binary_type = bytes
|
|
||||||
|
|
||||||
|
|
||||||
def byte_to_bytes(val): # type: (int) -> bytes
|
|
||||||
if IS_PY2:
|
|
||||||
return chr(val)
|
|
||||||
else:
|
|
||||||
return bytes([val])
|
|
||||||
|
|
||||||
|
|
||||||
def char_to_byte(val): # type: (str) -> int
|
|
||||||
if IS_PY2:
|
|
||||||
if isinstance(val, string_types):
|
|
||||||
return ord(val)
|
|
||||||
elif isinstance(val, int):
|
|
||||||
return val
|
|
||||||
else:
|
|
||||||
raise ValueError
|
|
||||||
else:
|
|
||||||
if isinstance(val, str):
|
|
||||||
return ord(val)
|
|
||||||
elif isinstance(val, int):
|
|
||||||
return val
|
|
||||||
else:
|
|
||||||
raise ValueError
|
|
||||||
|
|
||||||
|
|
||||||
def format_bytes(val):
|
|
||||||
if IS_PY2:
|
|
||||||
return ' '.join('{:02X}'.format(ord(x)) for x in val)
|
|
||||||
else:
|
|
||||||
return ' '.join('{:02X}'.format(x) for x in val)
|
|
||||||
|
|
||||||
|
|
||||||
def sort_by_cmp(list_, cmp):
|
|
||||||
if IS_PY2:
|
|
||||||
list_.sort(cmp=cmp)
|
|
||||||
else:
|
|
||||||
list_.sort(key=functools.cmp_to_key(cmp))
|
|
||||||
@@ -1,296 +0,0 @@
|
|||||||
import binascii
|
|
||||||
import codecs
|
|
||||||
from datetime import datetime, timedelta
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import threading
|
|
||||||
|
|
||||||
from esphomeyaml import const
|
|
||||||
from esphomeyaml.core import CORE
|
|
||||||
from esphomeyaml.helpers import mkdir_p
|
|
||||||
|
|
||||||
# pylint: disable=unused-import, wrong-import-order
|
|
||||||
from esphomeyaml.core import CoreType # noqa
|
|
||||||
from typing import Any, Dict, Optional # noqa
|
|
||||||
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
def storage_path(): # type: () -> str
|
|
||||||
return CORE.relative_path('.esphomeyaml', '{}.json'.format(CORE.config_filename))
|
|
||||||
|
|
||||||
|
|
||||||
def ext_storage_path(base_path, config_filename): # type: (str, str) -> str
|
|
||||||
return os.path.join(base_path, '.esphomeyaml', '{}.json'.format(config_filename))
|
|
||||||
|
|
||||||
|
|
||||||
def esphomeyaml_storage_path(base_path): # type: (str) -> str
|
|
||||||
return os.path.join(base_path, '.esphomeyaml', 'esphomeyaml.json')
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
|
||||||
class StorageJSON(object):
|
|
||||||
def __init__(self, storage_version, name, esphomelib_version, esphomeyaml_version,
|
|
||||||
src_version, arduino_version, address, esp_platform, board, build_path,
|
|
||||||
firmware_bin_path, use_legacy_ota):
|
|
||||||
# Version of the storage JSON schema
|
|
||||||
assert storage_version is None or isinstance(storage_version, int)
|
|
||||||
self.storage_version = storage_version # type: int
|
|
||||||
# The name of the node
|
|
||||||
self.name = name # type: str
|
|
||||||
# The esphomelib version in use
|
|
||||||
assert esphomelib_version is None or isinstance(esphomelib_version, dict)
|
|
||||||
self.esphomelib_version = esphomelib_version # type: Dict[str, str]
|
|
||||||
# The esphomeyaml version this was compiled with
|
|
||||||
self.esphomeyaml_version = esphomeyaml_version # type: str
|
|
||||||
# The version of the file in src/main.cpp - Used to migrate the file
|
|
||||||
assert src_version is None or isinstance(src_version, int)
|
|
||||||
self.src_version = src_version # type: int
|
|
||||||
# The version of the Arduino framework, the build files need to be cleared each time
|
|
||||||
# this changes
|
|
||||||
self.arduino_version = arduino_version # type: str
|
|
||||||
# Address of the ESP, for example livingroom.local or a static IP
|
|
||||||
self.address = address # type: str
|
|
||||||
# The type of ESP in use, either ESP32 or ESP8266
|
|
||||||
self.esp_platform = esp_platform # type: str
|
|
||||||
# The ESP board used, for example nodemcuv2
|
|
||||||
self.board = board # type: str
|
|
||||||
# The absolute path to the platformio project
|
|
||||||
self.build_path = build_path # type: str
|
|
||||||
# The absolute path to the firmware binary
|
|
||||||
self.firmware_bin_path = firmware_bin_path # type: str
|
|
||||||
# Whether to use legacy OTA, will be off after the first successful flash
|
|
||||||
self.use_legacy_ota = use_legacy_ota
|
|
||||||
|
|
||||||
def as_dict(self):
|
|
||||||
return {
|
|
||||||
'storage_version': self.storage_version,
|
|
||||||
'name': self.name,
|
|
||||||
'esphomelib_version': self.esphomelib_version,
|
|
||||||
'esphomeyaml_version': self.esphomeyaml_version,
|
|
||||||
'src_version': self.src_version,
|
|
||||||
'arduino_version': self.arduino_version,
|
|
||||||
'address': self.address,
|
|
||||||
'esp_platform': self.esp_platform,
|
|
||||||
'board': self.board,
|
|
||||||
'build_path': self.build_path,
|
|
||||||
'firmware_bin_path': self.firmware_bin_path,
|
|
||||||
'use_legacy_ota': self.use_legacy_ota,
|
|
||||||
}
|
|
||||||
|
|
||||||
def to_json(self):
|
|
||||||
return json.dumps(self.as_dict(), indent=2) + u'\n'
|
|
||||||
|
|
||||||
def save(self, path):
|
|
||||||
mkdir_p(os.path.dirname(path))
|
|
||||||
with codecs.open(path, 'w', encoding='utf-8') as f_handle:
|
|
||||||
f_handle.write(self.to_json())
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_esphomeyaml_core(esph, old): # type: (CoreType, Optional[StorageJSON]) -> StorageJSON
|
|
||||||
return StorageJSON(
|
|
||||||
storage_version=1,
|
|
||||||
name=esph.name,
|
|
||||||
esphomelib_version=esph.esphomelib_version,
|
|
||||||
esphomeyaml_version=const.__version__,
|
|
||||||
src_version=1,
|
|
||||||
arduino_version=esph.arduino_version,
|
|
||||||
address=esph.address,
|
|
||||||
esp_platform=esph.esp_platform,
|
|
||||||
board=esph.board,
|
|
||||||
build_path=esph.build_path,
|
|
||||||
firmware_bin_path=esph.firmware_bin,
|
|
||||||
use_legacy_ota=True if old is None else old.use_legacy_ota,
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_wizard(name, address, esp_platform, board):
|
|
||||||
# type: (str, str, str, str) -> StorageJSON
|
|
||||||
return StorageJSON(
|
|
||||||
storage_version=1,
|
|
||||||
name=name,
|
|
||||||
esphomelib_version=None,
|
|
||||||
esphomeyaml_version=const.__version__,
|
|
||||||
src_version=1,
|
|
||||||
arduino_version=None,
|
|
||||||
address=address,
|
|
||||||
esp_platform=esp_platform,
|
|
||||||
board=board,
|
|
||||||
build_path=None,
|
|
||||||
firmware_bin_path=None,
|
|
||||||
use_legacy_ota=False,
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _load_impl(path): # type: (str) -> Optional[StorageJSON]
|
|
||||||
with codecs.open(path, 'r', encoding='utf-8') as f_handle:
|
|
||||||
text = f_handle.read()
|
|
||||||
storage = json.loads(text, encoding='utf-8')
|
|
||||||
storage_version = storage['storage_version']
|
|
||||||
name = storage.get('name')
|
|
||||||
esphomelib_version = storage.get('esphomelib_version')
|
|
||||||
esphomeyaml_version = storage.get('esphomeyaml_version')
|
|
||||||
src_version = storage.get('src_version')
|
|
||||||
arduino_version = storage.get('arduino_version')
|
|
||||||
address = storage.get('address')
|
|
||||||
esp_platform = storage.get('esp_platform')
|
|
||||||
board = storage.get('board')
|
|
||||||
build_path = storage.get('build_path')
|
|
||||||
firmware_bin_path = storage.get('firmware_bin_path')
|
|
||||||
use_legacy_ota = storage.get('use_legacy_ota')
|
|
||||||
return StorageJSON(storage_version, name, esphomelib_version, esphomeyaml_version,
|
|
||||||
src_version, arduino_version, address, esp_platform, board, build_path,
|
|
||||||
firmware_bin_path, use_legacy_ota)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def load(path): # type: (str) -> Optional[StorageJSON]
|
|
||||||
try:
|
|
||||||
return StorageJSON._load_impl(path)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
return None
|
|
||||||
|
|
||||||
def __eq__(self, o): # type: (Any) -> bool
|
|
||||||
return isinstance(o, StorageJSON) and self.as_dict() == o.as_dict()
|
|
||||||
|
|
||||||
|
|
||||||
class EsphomeyamlStorageJSON(object):
|
|
||||||
def __init__(self, storage_version, cookie_secret, last_update_check,
|
|
||||||
remote_version):
|
|
||||||
# Version of the storage JSON schema
|
|
||||||
assert storage_version is None or isinstance(storage_version, int)
|
|
||||||
self.storage_version = storage_version # type: int
|
|
||||||
# The cookie secret for the dashboard
|
|
||||||
self.cookie_secret = cookie_secret # type: str
|
|
||||||
# The last time esphomeyaml checked for an update as an isoformat encoded str
|
|
||||||
self.last_update_check_str = last_update_check # type: str
|
|
||||||
# Cache of the version gotten in the last version check
|
|
||||||
self.remote_version = remote_version # type: Optional[str]
|
|
||||||
|
|
||||||
def as_dict(self): # type: () -> dict
|
|
||||||
return {
|
|
||||||
'storage_version': self.storage_version,
|
|
||||||
'cookie_secret': self.cookie_secret,
|
|
||||||
'last_update_check': self.last_update_check_str,
|
|
||||||
'remote_version': self.remote_version,
|
|
||||||
}
|
|
||||||
|
|
||||||
@property
|
|
||||||
def last_update_check(self): # type: () -> Optional[datetime]
|
|
||||||
try:
|
|
||||||
return datetime.strptime(self.last_update_check_str, "%Y-%m-%dT%H:%M:%S")
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
return None
|
|
||||||
|
|
||||||
@last_update_check.setter
|
|
||||||
def last_update_check(self, new): # type: (datetime) -> None
|
|
||||||
self.last_update_check_str = new.strftime("%Y-%m-%dT%H:%M:%S")
|
|
||||||
|
|
||||||
def to_json(self): # type: () -> dict
|
|
||||||
return json.dumps(self.as_dict(), indent=2) + u'\n'
|
|
||||||
|
|
||||||
def save(self, path): # type: (str) -> None
|
|
||||||
mkdir_p(os.path.dirname(path))
|
|
||||||
with codecs.open(path, 'w', encoding='utf-8') as f_handle:
|
|
||||||
f_handle.write(self.to_json())
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _load_impl(path): # type: (str) -> Optional[EsphomeyamlStorageJSON]
|
|
||||||
with codecs.open(path, 'r', encoding='utf-8') as f_handle:
|
|
||||||
text = f_handle.read()
|
|
||||||
storage = json.loads(text, encoding='utf-8')
|
|
||||||
storage_version = storage['storage_version']
|
|
||||||
cookie_secret = storage.get('cookie_secret')
|
|
||||||
last_update_check = storage.get('last_update_check')
|
|
||||||
remote_version = storage.get('remote_version')
|
|
||||||
return EsphomeyamlStorageJSON(storage_version, cookie_secret, last_update_check,
|
|
||||||
remote_version)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def load(path): # type: (str) -> Optional[EsphomeyamlStorageJSON]
|
|
||||||
try:
|
|
||||||
return EsphomeyamlStorageJSON._load_impl(path)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_default(): # type: () -> EsphomeyamlStorageJSON
|
|
||||||
return EsphomeyamlStorageJSON(
|
|
||||||
storage_version=1,
|
|
||||||
cookie_secret=binascii.hexlify(os.urandom(64)),
|
|
||||||
last_update_check=None,
|
|
||||||
remote_version=None,
|
|
||||||
)
|
|
||||||
|
|
||||||
def __eq__(self, o): # type: (Any) -> bool
|
|
||||||
return isinstance(o, EsphomeyamlStorageJSON) and self.as_dict() == o.as_dict()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def should_do_esphomeyaml_update_check(self): # type: () -> bool
|
|
||||||
if self.last_update_check is None:
|
|
||||||
return True
|
|
||||||
return self.last_update_check + timedelta(days=3) < datetime.utcnow()
|
|
||||||
|
|
||||||
|
|
||||||
class CheckForUpdateThread(threading.Thread):
|
|
||||||
def __init__(self, path):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self._path = path
|
|
||||||
|
|
||||||
@property
|
|
||||||
def docs_base(self):
|
|
||||||
return 'https://beta.esphomelib.com' if 'b' in const.__version__ else \
|
|
||||||
'https://esphomelib.com'
|
|
||||||
|
|
||||||
def fetch_remote_version(self):
|
|
||||||
import requests
|
|
||||||
|
|
||||||
storage = EsphomeyamlStorageJSON.load(self._path) or \
|
|
||||||
EsphomeyamlStorageJSON.get_default()
|
|
||||||
if not storage.should_do_esphomeyaml_update_check:
|
|
||||||
return storage
|
|
||||||
|
|
||||||
req = requests.get('{}/_static/version'.format(self.docs_base))
|
|
||||||
req.raise_for_status()
|
|
||||||
storage.remote_version = req.text.strip()
|
|
||||||
storage.last_update_check = datetime.utcnow()
|
|
||||||
storage.save(self._path)
|
|
||||||
return storage
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def format_version(ver):
|
|
||||||
vstr = '.'.join(map(str, ver.version))
|
|
||||||
if ver.prerelease:
|
|
||||||
vstr += ver.prerelease[0] + str(ver.prerelease[1])
|
|
||||||
return vstr
|
|
||||||
|
|
||||||
def cmp_versions(self, storage):
|
|
||||||
# pylint: disable=no-name-in-module, import-error
|
|
||||||
from distutils.version import StrictVersion
|
|
||||||
|
|
||||||
remote_version = StrictVersion(storage.remote_version)
|
|
||||||
self_version = StrictVersion(const.__version__)
|
|
||||||
if remote_version > self_version:
|
|
||||||
_LOGGER.warning("*" * 80)
|
|
||||||
_LOGGER.warning("A new version of esphomeyaml is available: %s (this is %s)",
|
|
||||||
self.format_version(remote_version), self.format_version(self_version))
|
|
||||||
_LOGGER.warning("Changelog: %s/esphomeyaml/changelog/index.html", self.docs_base)
|
|
||||||
_LOGGER.warning("Update Instructions: %s/esphomeyaml/guides/faq.html"
|
|
||||||
"#how-do-i-update-to-the-latest-version", self.docs_base)
|
|
||||||
_LOGGER.warning("*" * 80)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
try:
|
|
||||||
storage = self.fetch_remote_version()
|
|
||||||
self.cmp_versions(storage)
|
|
||||||
except Exception: # pylint: disable=broad-except
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def start_update_check_thread(path):
|
|
||||||
# dummy call to strptime as python 2.7 has a bug with strptime when importing from threads
|
|
||||||
datetime.strptime('20180101', '%Y%m%d')
|
|
||||||
thread = CheckForUpdateThread(os.path.abspath(path))
|
|
||||||
thread.start()
|
|
||||||
return thread
|
|
||||||
Reference in New Issue
Block a user