diff --git a/README.md b/README.md index 1d81b54..cd02ac7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -stock -===== \ No newline at end of file +stocks - application +bench - benchmark script diff --git a/bench/README.md b/bench/README.md new file mode 100644 index 0000000..3094918 --- /dev/null +++ b/bench/README.md @@ -0,0 +1,3 @@ +node 2 node requests benchmark + +(./pic/excel.png) diff --git a/bench/bench.erl b/bench/bench.erl new file mode 100644 index 0000000..458a673 --- /dev/null +++ b/bench/bench.erl @@ -0,0 +1,73 @@ +%% @author Andrew Kondratovich +%% @doc Some benchmarks for stock app +%% + +-module(bench). +-author('Andrew Kondratovich '). + +-compile([export_all]). +% -export([perform/0]). + +-define(PRICE0, 0.0). +-define(PRICE1, 2.0). +-define(VOLUME, 1000). +-define(MINUTE, (60 * 1000)). + + +random_price(P0, P1) -> + V = random:uniform(), + P0 + V * (P1 - P0). + +random_time(F, T) -> + V = random:uniform(erlang:trunc(T - F)), + erlang:trunc(F + V). + +generate_value(P0, P1, F, T, Volume) -> + {random_time(F, T), random_price(P0, P1), random:uniform(Volume)}. + +generate(From, Minutes, PerMinute) -> + lists:map(fun(E) -> + generate_value( + ?PRICE0, + ?PRICE1, + E * ?MINUTE / PerMinute, + (E + 1) * ?MINUTE / PerMinute, + ?VOLUME) + end, lists:seq(From, Minutes * PerMinute - 1)). + +store(Name, Data) -> + Self = self(), + Node = node0(), + erlang:spawn(Node, fun() -> Self ! stock_api:store(Name, Data) end). + +select(Name, From, To, Scale) -> + Self = self(), + Node = node0(), + erlang:spawn(Node, fun() -> Self ! stock_api:select(Name, From, To, Scale) end). + +erase(Name) -> + Node = node0(), + erlang:spawn(Node, fun() -> stock_api:erase(Name) end). + +node0() -> 'stocknode@127.0.0.1'. + +t_store(TSize, Per) -> + Data = generate(0, TSize, Per), + {Time, _} = timer:tc(fun() -> + store("TEST_STORE", Data), + receive _ -> ok after 10000 -> timeout end + end), + Time. + +t_select(Count, Scale) -> + {Time, _} = timer:tc(fun() -> + select("TEST_STORE", 0, Count * ?MINUTE, Scale), + receive _ -> ok after 10000 -> timeout end + end), + Time. + +perform() -> + case net_adm:ping('stocknode@127.0.0.1') of + pang -> exit(stocknode_not_found); + _ -> c:nl(?MODULE) + end. \ No newline at end of file diff --git a/bench/bootstrap.sh b/bench/bootstrap.sh new file mode 100644 index 0000000..cbc77ce --- /dev/null +++ b/bench/bootstrap.sh @@ -0,0 +1 @@ +erlc bench.erl && erl -name 'stocknode-bench@127.0.0.1' -setcookie stocknode -s bench perform diff --git a/bench/pic/excel.png b/bench/pic/excel.png new file mode 100644 index 0000000..eb40406 Binary files /dev/null and b/bench/pic/excel.png differ diff --git a/stocks/README.md b/stocks/README.md new file mode 100644 index 0000000..a2fc5ac --- /dev/null +++ b/stocks/README.md @@ -0,0 +1,7 @@ + rebar get-deps + rebar compile + cd rel + rebar generate + sh ./stocknode/bin/stocknode console + +look at `http://localhost:8000/` diff --git a/stocks/apps/stock/src/ets_manager.erl b/stocks/apps/stock/src/ets_manager.erl new file mode 100644 index 0000000..de9bf4d --- /dev/null +++ b/stocks/apps/stock/src/ets_manager.erl @@ -0,0 +1,80 @@ +%% @author Andrew Kondratovich +%% @doc ETS Manager. Used to save tables in case of process error. +%% +%% http://steve.vinoski.net/blog/2011/03/23/dont-lose-your-ets-tables/ + +-module(ets_manager). +-author('Andrew Kondratovich '). + +-behaviour(gen_server). +-export([start/0, new/2]). +-export([ + init/1, + handle_call/3, + handle_cast/2, + handle_info/2, + terminate/2, + code_change/3 +]). + +-define(TIMEOUT, 1000). + +%%% API +start() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + +%%% gen_server callbacks + +init([]) -> {ok, dict:new()}. + +handle_call({get, Key}, {Process, Tag}, Tables) -> + case dict:find(Key, Tables) of + {ok, Table} -> + true = ets:give_away(Table, Process, Tag), %% give away to calling process + {reply, {ok, Tag}, dict:erase(Key, Tables)}; + error -> + {reply, {error, not_found}, Tables} + end; + +handle_call(_Request, _From, State) -> + {noreply, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info({'ETS-TRANSFER', Table, _, Key}, Tables) -> % retrieve table from died process + {noreply, dict:store(Key, Table, Tables)}; + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% like ets:new/2 +new(Name, Options) when is_list(Name), is_list(Options) -> + new(list_to_atom(Name), Options); + +new(Name, Options) when is_atom(Name), is_list(Options) -> + Key = {Name, Options}, + Server = whereis(?MODULE), %% find yourself + case gen_server:call(Server, {get, Key}) of + {ok, Tag} -> %% we have such table + receive %% and give it back + {'ETS-TRANSFER', Table, Server, Tag} -> Table + after + ?TIMEOUT -> %% shit happens + create({Name, Key}, Options, Server) + end; + {error, not_found} -> create({Name, Key}, Options, Server) + end. + +create({Name, Key}, Options, Server) -> + O = case lists:keymember(heir, 1, Options) of + true -> Options; %% setup heir option if need + false -> [{heir, Server, Key} | Options] + end, + ets:new(Name, O). diff --git a/stocks/apps/stock/src/mochijson2.erl b/stocks/apps/stock/src/mochijson2.erl new file mode 100644 index 0000000..e290e9f --- /dev/null +++ b/stocks/apps/stock/src/mochijson2.erl @@ -0,0 +1,889 @@ +%% @author Bob Ippolito +%% @copyright 2007 Mochi Media, Inc. + +%% @doc Yet another JSON (RFC 4627) library for Erlang. mochijson2 works +%% with binaries as strings, arrays as lists (without an {array, _}) +%% wrapper and it only knows how to decode UTF-8 (and ASCII). +%% +%% JSON terms are decoded as follows (javascript -> erlang): +%%
    +%%
  • {"key": "value"} -> +%% {struct, [{<<"key">>, <<"value">>}]}
  • +%%
  • ["array", 123, 12.34, true, false, null] -> +%% [<<"array">>, 123, 12.34, true, false, null] +%%
  • +%%
+%%
    +%%
  • Strings in JSON decode to UTF-8 binaries in Erlang
  • +%%
  • Objects decode to {struct, PropList}
  • +%%
  • Numbers decode to integer or float
  • +%%
  • true, false, null decode to their respective terms.
  • +%%
+%% The encoder will accept the same format that the decoder will produce, +%% but will also allow additional cases for leniency: +%%
    +%%
  • atoms other than true, false, null will be considered UTF-8 +%% strings (even as a proplist key) +%%
  • +%%
  • {json, IoList} will insert IoList directly into the output +%% with no validation +%%
  • +%%
  • {array, Array} will be encoded as Array +%% (legacy mochijson style) +%%
  • +%%
  • A non-empty raw proplist will be encoded as an object as long +%% as the first pair does not have an atom key of json, struct, +%% or array +%%
  • +%%
+ +-module(mochijson2). +-author('bob@mochimedia.com'). +-export([encoder/1, encode/1]). +-export([decoder/1, decode/1, decode/2]). + +%% This is a macro to placate syntax highlighters.. +-define(Q, $\"). +-define(ADV_COL(S, N), S#decoder{offset=N+S#decoder.offset, + column=N+S#decoder.column}). +-define(INC_COL(S), S#decoder{offset=1+S#decoder.offset, + column=1+S#decoder.column}). +-define(INC_LINE(S), S#decoder{offset=1+S#decoder.offset, + column=1, + line=1+S#decoder.line}). +-define(INC_CHAR(S, C), + case C of + $\n -> + S#decoder{column=1, + line=1+S#decoder.line, + offset=1+S#decoder.offset}; + _ -> + S#decoder{column=1+S#decoder.column, + offset=1+S#decoder.offset} + end). +-define(IS_WHITESPACE(C), + (C =:= $\s orelse C =:= $\t orelse C =:= $\r orelse C =:= $\n)). + +%% @type json_string() = atom | binary() +%% @type json_number() = integer() | float() +%% @type json_array() = [json_term()] +%% @type json_object() = {struct, [{json_string(), json_term()}]} +%% @type json_eep18_object() = {[{json_string(), json_term()}]} +%% @type json_iolist() = {json, iolist()} +%% @type json_term() = json_string() | json_number() | json_array() | +%% json_object() | json_eep18_object() | json_iolist() + +-record(encoder, {handler=null, + utf8=false}). + +-record(decoder, {object_hook=null, + offset=0, + line=1, + column=1, + state=null}). + +%% @spec encoder([encoder_option()]) -> function() +%% @doc Create an encoder/1 with the given options. +%% @type encoder_option() = handler_option() | utf8_option() +%% @type utf8_option() = boolean(). Emit unicode as utf8 (default - false) +encoder(Options) -> + State = parse_encoder_options(Options, #encoder{}), + fun (O) -> json_encode(O, State) end. + +%% @spec encode(json_term()) -> iolist() +%% @doc Encode the given as JSON to an iolist. +encode(Any) -> + json_encode(Any, #encoder{}). + +%% @spec decoder([decoder_option()]) -> function() +%% @doc Create a decoder/1 with the given options. +decoder(Options) -> + State = parse_decoder_options(Options, #decoder{}), + fun (O) -> json_decode(O, State) end. + +%% @spec decode(iolist(), [{format, proplist | eep18 | struct}]) -> json_term() +%% @doc Decode the given iolist to Erlang terms using the given object format +%% for decoding, where proplist returns JSON objects as [{binary(), json_term()}] +%% proplists, eep18 returns JSON objects as {[binary(), json_term()]}, and struct +%% returns them as-is. +decode(S, Options) -> + json_decode(S, parse_decoder_options(Options, #decoder{})). + +%% @spec decode(iolist()) -> json_term() +%% @doc Decode the given iolist to Erlang terms. +decode(S) -> + json_decode(S, #decoder{}). + +%% Internal API + +parse_encoder_options([], State) -> + State; +parse_encoder_options([{handler, Handler} | Rest], State) -> + parse_encoder_options(Rest, State#encoder{handler=Handler}); +parse_encoder_options([{utf8, Switch} | Rest], State) -> + parse_encoder_options(Rest, State#encoder{utf8=Switch}). + +parse_decoder_options([], State) -> + State; +parse_decoder_options([{object_hook, Hook} | Rest], State) -> + parse_decoder_options(Rest, State#decoder{object_hook=Hook}); +parse_decoder_options([{format, Format} | Rest], State) + when Format =:= struct orelse Format =:= eep18 orelse Format =:= proplist -> + parse_decoder_options(Rest, State#decoder{object_hook=Format}). + +json_encode(true, _State) -> + <<"true">>; +json_encode(false, _State) -> + <<"false">>; +json_encode(null, _State) -> + <<"null">>; +json_encode(I, _State) when is_integer(I) -> + integer_to_list(I); +json_encode(F, _State) when is_float(F) -> + mochinum:digits(F); +json_encode(S, State) when is_binary(S); is_atom(S) -> + json_encode_string(S, State); +json_encode([{K, _}|_] = Props, State) when (K =/= struct andalso + K =/= array andalso + K =/= json) -> + json_encode_proplist(Props, State); +json_encode({struct, Props}, State) when is_list(Props) -> + json_encode_proplist(Props, State); +json_encode({Props}, State) when is_list(Props) -> + json_encode_proplist(Props, State); +json_encode({}, State) -> + json_encode_proplist([], State); +json_encode(Array, State) when is_list(Array) -> + json_encode_array(Array, State); +json_encode({array, Array}, State) when is_list(Array) -> + json_encode_array(Array, State); +json_encode({json, IoList}, _State) -> + IoList; +json_encode(Bad, #encoder{handler=null}) -> + exit({json_encode, {bad_term, Bad}}); +json_encode(Bad, State=#encoder{handler=Handler}) -> + json_encode(Handler(Bad), State). + +json_encode_array([], _State) -> + <<"[]">>; +json_encode_array(L, State) -> + F = fun (O, Acc) -> + [$,, json_encode(O, State) | Acc] + end, + [$, | Acc1] = lists:foldl(F, "[", L), + lists:reverse([$\] | Acc1]). + +json_encode_proplist([], _State) -> + <<"{}">>; +json_encode_proplist(Props, State) -> + F = fun ({K, V}, Acc) -> + KS = json_encode_string(K, State), + VS = json_encode(V, State), + [$,, VS, $:, KS | Acc] + end, + [$, | Acc1] = lists:foldl(F, "{", Props), + lists:reverse([$\} | Acc1]). + +json_encode_string(A, State) when is_atom(A) -> + L = atom_to_list(A), + case json_string_is_safe(L) of + true -> + [?Q, L, ?Q]; + false -> + json_encode_string_unicode(xmerl_ucs:from_utf8(L), State, [?Q]) + end; +json_encode_string(B, State) when is_binary(B) -> + case json_bin_is_safe(B) of + true -> + [?Q, B, ?Q]; + false -> + json_encode_string_unicode(xmerl_ucs:from_utf8(B), State, [?Q]) + end; +json_encode_string(I, _State) when is_integer(I) -> + [?Q, integer_to_list(I), ?Q]; +json_encode_string(L, State) when is_list(L) -> + case json_string_is_safe(L) of + true -> + [?Q, L, ?Q]; + false -> + json_encode_string_unicode(L, State, [?Q]) + end. + +json_string_is_safe([]) -> + true; +json_string_is_safe([C | Rest]) -> + case C of + ?Q -> + false; + $\\ -> + false; + $\b -> + false; + $\f -> + false; + $\n -> + false; + $\r -> + false; + $\t -> + false; + C when C >= 0, C < $\s; C >= 16#7f, C =< 16#10FFFF -> + false; + C when C < 16#7f -> + json_string_is_safe(Rest); + _ -> + false + end. + +json_bin_is_safe(<<>>) -> + true; +json_bin_is_safe(<>) -> + case C of + ?Q -> + false; + $\\ -> + false; + $\b -> + false; + $\f -> + false; + $\n -> + false; + $\r -> + false; + $\t -> + false; + C when C >= 0, C < $\s; C >= 16#7f -> + false; + C when C < 16#7f -> + json_bin_is_safe(Rest) + end. + +json_encode_string_unicode([], _State, Acc) -> + lists:reverse([$\" | Acc]); +json_encode_string_unicode([C | Cs], State, Acc) -> + Acc1 = case C of + ?Q -> + [?Q, $\\ | Acc]; + %% Escaping solidus is only useful when trying to protect + %% against "" injection attacks which are only + %% possible when JSON is inserted into a HTML document + %% in-line. mochijson2 does not protect you from this, so + %% if you do insert directly into HTML then you need to + %% uncomment the following case or escape the output of encode. + %% + %% $/ -> + %% [$/, $\\ | Acc]; + %% + $\\ -> + [$\\, $\\ | Acc]; + $\b -> + [$b, $\\ | Acc]; + $\f -> + [$f, $\\ | Acc]; + $\n -> + [$n, $\\ | Acc]; + $\r -> + [$r, $\\ | Acc]; + $\t -> + [$t, $\\ | Acc]; + C when C >= 0, C < $\s -> + [unihex(C) | Acc]; + C when C >= 16#7f, C =< 16#10FFFF, State#encoder.utf8 -> + [xmerl_ucs:to_utf8(C) | Acc]; + C when C >= 16#7f, C =< 16#10FFFF, not State#encoder.utf8 -> + [unihex(C) | Acc]; + C when C < 16#7f -> + [C | Acc]; + _ -> + exit({json_encode, {bad_char, C}}) + end, + json_encode_string_unicode(Cs, State, Acc1). + +hexdigit(C) when C >= 0, C =< 9 -> + C + $0; +hexdigit(C) when C =< 15 -> + C + $a - 10. + +unihex(C) when C < 16#10000 -> + <> = <>, + Digits = [hexdigit(D) || D <- [D3, D2, D1, D0]], + [$\\, $u | Digits]; +unihex(C) when C =< 16#10FFFF -> + N = C - 16#10000, + S1 = 16#d800 bor ((N bsr 10) band 16#3ff), + S2 = 16#dc00 bor (N band 16#3ff), + [unihex(S1), unihex(S2)]. + +json_decode(L, S) when is_list(L) -> + json_decode(iolist_to_binary(L), S); +json_decode(B, S) -> + {Res, S1} = decode1(B, S), + {eof, _} = tokenize(B, S1#decoder{state=trim}), + Res. + +decode1(B, S=#decoder{state=null}) -> + case tokenize(B, S#decoder{state=any}) of + {{const, C}, S1} -> + {C, S1}; + {start_array, S1} -> + decode_array(B, S1); + {start_object, S1} -> + decode_object(B, S1) + end. + +make_object(V, #decoder{object_hook=N}) when N =:= null orelse N =:= struct -> + V; +make_object({struct, P}, #decoder{object_hook=eep18}) -> + {P}; +make_object({struct, P}, #decoder{object_hook=proplist}) -> + P; +make_object(V, #decoder{object_hook=Hook}) -> + Hook(V). + +decode_object(B, S) -> + decode_object(B, S#decoder{state=key}, []). + +decode_object(B, S=#decoder{state=key}, Acc) -> + case tokenize(B, S) of + {end_object, S1} -> + V = make_object({struct, lists:reverse(Acc)}, S1), + {V, S1#decoder{state=null}}; + {{const, K}, S1} -> + {colon, S2} = tokenize(B, S1), + {V, S3} = decode1(B, S2#decoder{state=null}), + decode_object(B, S3#decoder{state=comma}, [{K, V} | Acc]) + end; +decode_object(B, S=#decoder{state=comma}, Acc) -> + case tokenize(B, S) of + {end_object, S1} -> + V = make_object({struct, lists:reverse(Acc)}, S1), + {V, S1#decoder{state=null}}; + {comma, S1} -> + decode_object(B, S1#decoder{state=key}, Acc) + end. + +decode_array(B, S) -> + decode_array(B, S#decoder{state=any}, []). + +decode_array(B, S=#decoder{state=any}, Acc) -> + case tokenize(B, S) of + {end_array, S1} -> + {lists:reverse(Acc), S1#decoder{state=null}}; + {start_array, S1} -> + {Array, S2} = decode_array(B, S1), + decode_array(B, S2#decoder{state=comma}, [Array | Acc]); + {start_object, S1} -> + {Array, S2} = decode_object(B, S1), + decode_array(B, S2#decoder{state=comma}, [Array | Acc]); + {{const, Const}, S1} -> + decode_array(B, S1#decoder{state=comma}, [Const | Acc]) + end; +decode_array(B, S=#decoder{state=comma}, Acc) -> + case tokenize(B, S) of + {end_array, S1} -> + {lists:reverse(Acc), S1#decoder{state=null}}; + {comma, S1} -> + decode_array(B, S1#decoder{state=any}, Acc) + end. + +tokenize_string(B, S=#decoder{offset=O}) -> + case tokenize_string_fast(B, O) of + {escape, O1} -> + Length = O1 - O, + S1 = ?ADV_COL(S, Length), + <<_:O/binary, Head:Length/binary, _/binary>> = B, + tokenize_string(B, S1, lists:reverse(binary_to_list(Head))); + O1 -> + Length = O1 - O, + <<_:O/binary, String:Length/binary, ?Q, _/binary>> = B, + {{const, String}, ?ADV_COL(S, Length + 1)} + end. + +tokenize_string_fast(B, O) -> + case B of + <<_:O/binary, ?Q, _/binary>> -> + O; + <<_:O/binary, $\\, _/binary>> -> + {escape, O}; + <<_:O/binary, C1, _/binary>> when C1 < 128 -> + tokenize_string_fast(B, 1 + O); + <<_:O/binary, C1, C2, _/binary>> when C1 >= 194, C1 =< 223, + C2 >= 128, C2 =< 191 -> + tokenize_string_fast(B, 2 + O); + <<_:O/binary, C1, C2, C3, _/binary>> when C1 >= 224, C1 =< 239, + C2 >= 128, C2 =< 191, + C3 >= 128, C3 =< 191 -> + tokenize_string_fast(B, 3 + O); + <<_:O/binary, C1, C2, C3, C4, _/binary>> when C1 >= 240, C1 =< 244, + C2 >= 128, C2 =< 191, + C3 >= 128, C3 =< 191, + C4 >= 128, C4 =< 191 -> + tokenize_string_fast(B, 4 + O); + _ -> + throw(invalid_utf8) + end. + +tokenize_string(B, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, ?Q, _/binary>> -> + {{const, iolist_to_binary(lists:reverse(Acc))}, ?INC_COL(S)}; + <<_:O/binary, "\\\"", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\" | Acc]); + <<_:O/binary, "\\\\", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\\ | Acc]); + <<_:O/binary, "\\/", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$/ | Acc]); + <<_:O/binary, "\\b", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\b | Acc]); + <<_:O/binary, "\\f", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\f | Acc]); + <<_:O/binary, "\\n", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\n | Acc]); + <<_:O/binary, "\\r", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\r | Acc]); + <<_:O/binary, "\\t", _/binary>> -> + tokenize_string(B, ?ADV_COL(S, 2), [$\t | Acc]); + <<_:O/binary, "\\u", C3, C2, C1, C0, Rest/binary>> -> + C = erlang:list_to_integer([C3, C2, C1, C0], 16), + if C > 16#D7FF, C < 16#DC00 -> + %% coalesce UTF-16 surrogate pair + <<"\\u", D3, D2, D1, D0, _/binary>> = Rest, + D = erlang:list_to_integer([D3,D2,D1,D0], 16), + [CodePoint] = xmerl_ucs:from_utf16be(<>), + Acc1 = lists:reverse(xmerl_ucs:to_utf8(CodePoint), Acc), + tokenize_string(B, ?ADV_COL(S, 12), Acc1); + true -> + Acc1 = lists:reverse(xmerl_ucs:to_utf8(C), Acc), + tokenize_string(B, ?ADV_COL(S, 6), Acc1) + end; + <<_:O/binary, C1, _/binary>> when C1 < 128 -> + tokenize_string(B, ?INC_CHAR(S, C1), [C1 | Acc]); + <<_:O/binary, C1, C2, _/binary>> when C1 >= 194, C1 =< 223, + C2 >= 128, C2 =< 191 -> + tokenize_string(B, ?ADV_COL(S, 2), [C2, C1 | Acc]); + <<_:O/binary, C1, C2, C3, _/binary>> when C1 >= 224, C1 =< 239, + C2 >= 128, C2 =< 191, + C3 >= 128, C3 =< 191 -> + tokenize_string(B, ?ADV_COL(S, 3), [C3, C2, C1 | Acc]); + <<_:O/binary, C1, C2, C3, C4, _/binary>> when C1 >= 240, C1 =< 244, + C2 >= 128, C2 =< 191, + C3 >= 128, C3 =< 191, + C4 >= 128, C4 =< 191 -> + tokenize_string(B, ?ADV_COL(S, 4), [C4, C3, C2, C1 | Acc]); + _ -> + throw(invalid_utf8) + end. + +tokenize_number(B, S) -> + case tokenize_number(B, sign, S, []) of + {{int, Int}, S1} -> + {{const, list_to_integer(Int)}, S1}; + {{float, Float}, S1} -> + {{const, list_to_float(Float)}, S1} + end. + +tokenize_number(B, sign, S=#decoder{offset=O}, []) -> + case B of + <<_:O/binary, $-, _/binary>> -> + tokenize_number(B, int, ?INC_COL(S), [$-]); + _ -> + tokenize_number(B, int, S, []) + end; +tokenize_number(B, int, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, $0, _/binary>> -> + tokenize_number(B, frac, ?INC_COL(S), [$0 | Acc]); + <<_:O/binary, C, _/binary>> when C >= $1 andalso C =< $9 -> + tokenize_number(B, int1, ?INC_COL(S), [C | Acc]) + end; +tokenize_number(B, int1, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> + tokenize_number(B, int1, ?INC_COL(S), [C | Acc]); + _ -> + tokenize_number(B, frac, S, Acc) + end; +tokenize_number(B, frac, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, $., C, _/binary>> when C >= $0, C =< $9 -> + tokenize_number(B, frac1, ?ADV_COL(S, 2), [C, $. | Acc]); + <<_:O/binary, E, _/binary>> when E =:= $e orelse E =:= $E -> + tokenize_number(B, esign, ?INC_COL(S), [$e, $0, $. | Acc]); + _ -> + {{int, lists:reverse(Acc)}, S} + end; +tokenize_number(B, frac1, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> + tokenize_number(B, frac1, ?INC_COL(S), [C | Acc]); + <<_:O/binary, E, _/binary>> when E =:= $e orelse E =:= $E -> + tokenize_number(B, esign, ?INC_COL(S), [$e | Acc]); + _ -> + {{float, lists:reverse(Acc)}, S} + end; +tokenize_number(B, esign, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, C, _/binary>> when C =:= $- orelse C=:= $+ -> + tokenize_number(B, eint, ?INC_COL(S), [C | Acc]); + _ -> + tokenize_number(B, eint, S, Acc) + end; +tokenize_number(B, eint, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> + tokenize_number(B, eint1, ?INC_COL(S), [C | Acc]) + end; +tokenize_number(B, eint1, S=#decoder{offset=O}, Acc) -> + case B of + <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> + tokenize_number(B, eint1, ?INC_COL(S), [C | Acc]); + _ -> + {{float, lists:reverse(Acc)}, S} + end. + +tokenize(B, S=#decoder{offset=O}) -> + case B of + <<_:O/binary, C, _/binary>> when ?IS_WHITESPACE(C) -> + tokenize(B, ?INC_CHAR(S, C)); + <<_:O/binary, "{", _/binary>> -> + {start_object, ?INC_COL(S)}; + <<_:O/binary, "}", _/binary>> -> + {end_object, ?INC_COL(S)}; + <<_:O/binary, "[", _/binary>> -> + {start_array, ?INC_COL(S)}; + <<_:O/binary, "]", _/binary>> -> + {end_array, ?INC_COL(S)}; + <<_:O/binary, ",", _/binary>> -> + {comma, ?INC_COL(S)}; + <<_:O/binary, ":", _/binary>> -> + {colon, ?INC_COL(S)}; + <<_:O/binary, "null", _/binary>> -> + {{const, null}, ?ADV_COL(S, 4)}; + <<_:O/binary, "true", _/binary>> -> + {{const, true}, ?ADV_COL(S, 4)}; + <<_:O/binary, "false", _/binary>> -> + {{const, false}, ?ADV_COL(S, 5)}; + <<_:O/binary, "\"", _/binary>> -> + tokenize_string(B, ?INC_COL(S)); + <<_:O/binary, C, _/binary>> when (C >= $0 andalso C =< $9) + orelse C =:= $- -> + tokenize_number(B, S); + <<_:O/binary>> -> + trim = S#decoder.state, + {eof, S} + end. +%% +%% Tests +%% +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + + +%% testing constructs borrowed from the Yaws JSON implementation. + +%% Create an object from a list of Key/Value pairs. + +obj_new() -> + {struct, []}. + +is_obj({struct, Props}) -> + F = fun ({K, _}) when is_binary(K) -> true end, + lists:all(F, Props). + +obj_from_list(Props) -> + Obj = {struct, Props}, + ?assert(is_obj(Obj)), + Obj. + +%% Test for equivalence of Erlang terms. +%% Due to arbitrary order of construction, equivalent objects might +%% compare unequal as erlang terms, so we need to carefully recurse +%% through aggregates (tuples and objects). + +equiv({struct, Props1}, {struct, Props2}) -> + equiv_object(Props1, Props2); +equiv(L1, L2) when is_list(L1), is_list(L2) -> + equiv_list(L1, L2); +equiv(N1, N2) when is_number(N1), is_number(N2) -> N1 == N2; +equiv(B1, B2) when is_binary(B1), is_binary(B2) -> B1 == B2; +equiv(A, A) when A =:= true orelse A =:= false orelse A =:= null -> true. + +%% Object representation and traversal order is unknown. +%% Use the sledgehammer and sort property lists. + +equiv_object(Props1, Props2) -> + L1 = lists:keysort(1, Props1), + L2 = lists:keysort(1, Props2), + Pairs = lists:zip(L1, L2), + true = lists:all(fun({{K1, V1}, {K2, V2}}) -> + equiv(K1, K2) and equiv(V1, V2) + end, Pairs). + +%% Recursively compare tuple elements for equivalence. + +equiv_list([], []) -> + true; +equiv_list([V1 | L1], [V2 | L2]) -> + equiv(V1, V2) andalso equiv_list(L1, L2). + +decode_test() -> + [1199344435545.0, 1] = decode(<<"[1199344435545.0,1]">>), + <<16#F0,16#9D,16#9C,16#95>> = decode([34,"\\ud835","\\udf15",34]). + +e2j_vec_test() -> + test_one(e2j_test_vec(utf8), 1). + +test_one([], _N) -> + %% io:format("~p tests passed~n", [N-1]), + ok; +test_one([{E, J} | Rest], N) -> + %% io:format("[~p] ~p ~p~n", [N, E, J]), + true = equiv(E, decode(J)), + true = equiv(E, decode(encode(E))), + test_one(Rest, 1+N). + +e2j_test_vec(utf8) -> + [ + {1, "1"}, + {3.1416, "3.14160"}, %% text representation may truncate, trail zeroes + {-1, "-1"}, + {-3.1416, "-3.14160"}, + {12.0e10, "1.20000e+11"}, + {1.234E+10, "1.23400e+10"}, + {-1.234E-10, "-1.23400e-10"}, + {10.0, "1.0e+01"}, + {123.456, "1.23456E+2"}, + {10.0, "1e1"}, + {<<"foo">>, "\"foo\""}, + {<<"foo", 5, "bar">>, "\"foo\\u0005bar\""}, + {<<"">>, "\"\""}, + {<<"\n\n\n">>, "\"\\n\\n\\n\""}, + {<<"\" \b\f\r\n\t\"">>, "\"\\\" \\b\\f\\r\\n\\t\\\"\""}, + {obj_new(), "{}"}, + {obj_from_list([{<<"foo">>, <<"bar">>}]), "{\"foo\":\"bar\"}"}, + {obj_from_list([{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]), + "{\"foo\":\"bar\",\"baz\":123}"}, + {[], "[]"}, + {[[]], "[[]]"}, + {[1, <<"foo">>], "[1,\"foo\"]"}, + + %% json array in a json object + {obj_from_list([{<<"foo">>, [123]}]), + "{\"foo\":[123]}"}, + + %% json object in a json object + {obj_from_list([{<<"foo">>, obj_from_list([{<<"bar">>, true}])}]), + "{\"foo\":{\"bar\":true}}"}, + + %% fold evaluation order + {obj_from_list([{<<"foo">>, []}, + {<<"bar">>, obj_from_list([{<<"baz">>, true}])}, + {<<"alice">>, <<"bob">>}]), + "{\"foo\":[],\"bar\":{\"baz\":true},\"alice\":\"bob\"}"}, + + %% json object in a json array + {[-123, <<"foo">>, obj_from_list([{<<"bar">>, []}]), null], + "[-123,\"foo\",{\"bar\":[]},null]"} + ]. + +%% test utf8 encoding +encoder_utf8_test() -> + %% safe conversion case (default) + [34,"\\u0001","\\u0442","\\u0435","\\u0441","\\u0442",34] = + encode(<<1,"\321\202\320\265\321\201\321\202">>), + + %% raw utf8 output (optional) + Enc = mochijson2:encoder([{utf8, true}]), + [34,"\\u0001",[209,130],[208,181],[209,129],[209,130],34] = + Enc(<<1,"\321\202\320\265\321\201\321\202">>). + +input_validation_test() -> + Good = [ + {16#00A3, <>}, %% pound + {16#20AC, <>}, %% euro + {16#10196, <>} %% denarius + ], + lists:foreach(fun({CodePoint, UTF8}) -> + Expect = list_to_binary(xmerl_ucs:to_utf8(CodePoint)), + Expect = decode(UTF8) + end, Good), + + Bad = [ + %% 2nd, 3rd, or 4th byte of a multi-byte sequence w/o leading byte + <>, + %% missing continuations, last byte in each should be 80-BF + <>, + <>, + <>, + %% we don't support code points > 10FFFF per RFC 3629 + <>, + %% escape characters trigger a different code path + <> + ], + lists:foreach( + fun(X) -> + ok = try decode(X) catch invalid_utf8 -> ok end, + %% could be {ucs,{bad_utf8_character_code}} or + %% {json_encode,{bad_char,_}} + {'EXIT', _} = (catch encode(X)) + end, Bad). + +inline_json_test() -> + ?assertEqual(<<"\"iodata iodata\"">>, + iolist_to_binary( + encode({json, [<<"\"iodata">>, " iodata\""]}))), + ?assertEqual({struct, [{<<"key">>, <<"iodata iodata">>}]}, + decode( + encode({struct, + [{key, {json, [<<"\"iodata">>, " iodata\""]}}]}))), + ok. + +big_unicode_test() -> + UTF8Seq = list_to_binary(xmerl_ucs:to_utf8(16#0001d120)), + ?assertEqual( + <<"\"\\ud834\\udd20\"">>, + iolist_to_binary(encode(UTF8Seq))), + ?assertEqual( + UTF8Seq, + decode(iolist_to_binary(encode(UTF8Seq)))), + ok. + +custom_decoder_test() -> + ?assertEqual( + {struct, [{<<"key">>, <<"value">>}]}, + (decoder([]))("{\"key\": \"value\"}")), + F = fun ({struct, [{<<"key">>, <<"value">>}]}) -> win end, + ?assertEqual( + win, + (decoder([{object_hook, F}]))("{\"key\": \"value\"}")), + ok. + +atom_test() -> + %% JSON native atoms + [begin + ?assertEqual(A, decode(atom_to_list(A))), + ?assertEqual(iolist_to_binary(atom_to_list(A)), + iolist_to_binary(encode(A))) + end || A <- [true, false, null]], + %% Atom to string + ?assertEqual( + <<"\"foo\"">>, + iolist_to_binary(encode(foo))), + ?assertEqual( + <<"\"\\ud834\\udd20\"">>, + iolist_to_binary(encode(list_to_atom(xmerl_ucs:to_utf8(16#0001d120))))), + ok. + +key_encode_test() -> + %% Some forms are accepted as keys that would not be strings in other + %% cases + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode({struct, [{foo, 1}]}))), + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode({struct, [{<<"foo">>, 1}]}))), + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode({struct, [{"foo", 1}]}))), + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode([{foo, 1}]))), + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode([{<<"foo">>, 1}]))), + ?assertEqual( + <<"{\"foo\":1}">>, + iolist_to_binary(encode([{"foo", 1}]))), + ?assertEqual( + <<"{\"\\ud834\\udd20\":1}">>, + iolist_to_binary( + encode({struct, [{[16#0001d120], 1}]}))), + ?assertEqual( + <<"{\"1\":1}">>, + iolist_to_binary(encode({struct, [{1, 1}]}))), + ok. + +unsafe_chars_test() -> + Chars = "\"\\\b\f\n\r\t", + [begin + ?assertEqual(false, json_string_is_safe([C])), + ?assertEqual(false, json_bin_is_safe(<>)), + ?assertEqual(<>, decode(encode(<>))) + end || C <- Chars], + ?assertEqual( + false, + json_string_is_safe([16#0001d120])), + ?assertEqual( + false, + json_bin_is_safe(list_to_binary(xmerl_ucs:to_utf8(16#0001d120)))), + ?assertEqual( + [16#0001d120], + xmerl_ucs:from_utf8( + binary_to_list( + decode(encode(list_to_atom(xmerl_ucs:to_utf8(16#0001d120))))))), + ?assertEqual( + false, + json_string_is_safe([16#110000])), + ?assertEqual( + false, + json_bin_is_safe(list_to_binary(xmerl_ucs:to_utf8([16#110000])))), + %% solidus can be escaped but isn't unsafe by default + ?assertEqual( + <<"/">>, + decode(<<"\"\\/\"">>)), + ok. + +int_test() -> + ?assertEqual(0, decode("0")), + ?assertEqual(1, decode("1")), + ?assertEqual(11, decode("11")), + ok. + +large_int_test() -> + ?assertEqual(<<"-2147483649214748364921474836492147483649">>, + iolist_to_binary(encode(-2147483649214748364921474836492147483649))), + ?assertEqual(<<"2147483649214748364921474836492147483649">>, + iolist_to_binary(encode(2147483649214748364921474836492147483649))), + ok. + +float_test() -> + ?assertEqual(<<"-2147483649.0">>, iolist_to_binary(encode(-2147483649.0))), + ?assertEqual(<<"2147483648.0">>, iolist_to_binary(encode(2147483648.0))), + ok. + +handler_test() -> + ?assertEqual( + {'EXIT',{json_encode,{bad_term,{x,y}}}}, + catch encode({x,y})), + F = fun ({x,y}) -> [] end, + ?assertEqual( + <<"[]">>, + iolist_to_binary((encoder([{handler, F}]))({x, y}))), + ok. + +encode_empty_test_() -> + [{A, ?_assertEqual(<<"{}">>, iolist_to_binary(encode(B)))} + || {A, B} <- [{"eep18 {}", {}}, + {"eep18 {[]}", {[]}}, + {"{struct, []}", {struct, []}}]]. + +encode_test_() -> + P = [{<<"k">>, <<"v">>}], + JSON = iolist_to_binary(encode({struct, P})), + [{atom_to_list(F), + ?_assertEqual(JSON, iolist_to_binary(encode(decode(JSON, [{format, F}]))))} + || F <- [struct, eep18, proplist]]. + +format_test_() -> + P = [{<<"k">>, <<"v">>}], + JSON = iolist_to_binary(encode({struct, P})), + [{atom_to_list(F), + ?_assertEqual(A, decode(JSON, [{format, F}]))} + || {F, A} <- [{struct, {struct, P}}, + {eep18, {P}}, + {proplist, P}]]. + +-endif. diff --git a/stocks/apps/stock/src/mochinum.erl b/stocks/apps/stock/src/mochinum.erl new file mode 100644 index 0000000..c52b15c --- /dev/null +++ b/stocks/apps/stock/src/mochinum.erl @@ -0,0 +1,354 @@ +%% @copyright 2007 Mochi Media, Inc. +%% @author Bob Ippolito + +%% @doc Useful numeric algorithms for floats that cover some deficiencies +%% in the math module. More interesting is digits/1, which implements +%% the algorithm from: +%% http://www.cs.indiana.edu/~burger/fp/index.html +%% See also "Printing Floating-Point Numbers Quickly and Accurately" +%% in Proceedings of the SIGPLAN '96 Conference on Programming Language +%% Design and Implementation. + +-module(mochinum). +-author("Bob Ippolito "). +-export([digits/1, frexp/1, int_pow/2, int_ceil/1]). + +%% IEEE 754 Float exponent bias +-define(FLOAT_BIAS, 1022). +-define(MIN_EXP, -1074). +-define(BIG_POW, 4503599627370496). + +%% External API + +%% @spec digits(number()) -> string() +%% @doc Returns a string that accurately represents the given integer or float +%% using a conservative amount of digits. Great for generating +%% human-readable output, or compact ASCII serializations for floats. +digits(N) when is_integer(N) -> + integer_to_list(N); +digits(0.0) -> + "0.0"; +digits(Float) -> + {Frac1, Exp1} = frexp_int(Float), + [Place0 | Digits0] = digits1(Float, Exp1, Frac1), + {Place, Digits} = transform_digits(Place0, Digits0), + R = insert_decimal(Place, Digits), + case Float < 0 of + true -> + [$- | R]; + _ -> + R + end. + +%% @spec frexp(F::float()) -> {Frac::float(), Exp::float()} +%% @doc Return the fractional and exponent part of an IEEE 754 double, +%% equivalent to the libc function of the same name. +%% F = Frac * pow(2, Exp). +frexp(F) -> + frexp1(unpack(F)). + +%% @spec int_pow(X::integer(), N::integer()) -> Y::integer() +%% @doc Moderately efficient way to exponentiate integers. +%% int_pow(10, 2) = 100. +int_pow(_X, 0) -> + 1; +int_pow(X, N) when N > 0 -> + int_pow(X, N, 1). + +%% @spec int_ceil(F::float()) -> integer() +%% @doc Return the ceiling of F as an integer. The ceiling is defined as +%% F when F == trunc(F); +%% trunc(F) when F < 0; +%% trunc(F) + 1 when F > 0. +int_ceil(X) -> + T = trunc(X), + case (X - T) of + Pos when Pos > 0 -> T + 1; + _ -> T + end. + + +%% Internal API + +int_pow(X, N, R) when N < 2 -> + R * X; +int_pow(X, N, R) -> + int_pow(X * X, N bsr 1, case N band 1 of 1 -> R * X; 0 -> R end). + +insert_decimal(0, S) -> + "0." ++ S; +insert_decimal(Place, S) when Place > 0 -> + L = length(S), + case Place - L of + 0 -> + S ++ ".0"; + N when N < 0 -> + {S0, S1} = lists:split(L + N, S), + S0 ++ "." ++ S1; + N when N < 6 -> + %% More places than digits + S ++ lists:duplicate(N, $0) ++ ".0"; + _ -> + insert_decimal_exp(Place, S) + end; +insert_decimal(Place, S) when Place > -6 -> + "0." ++ lists:duplicate(abs(Place), $0) ++ S; +insert_decimal(Place, S) -> + insert_decimal_exp(Place, S). + +insert_decimal_exp(Place, S) -> + [C | S0] = S, + S1 = case S0 of + [] -> + "0"; + _ -> + S0 + end, + Exp = case Place < 0 of + true -> + "e-"; + false -> + "e+" + end, + [C] ++ "." ++ S1 ++ Exp ++ integer_to_list(abs(Place - 1)). + + +digits1(Float, Exp, Frac) -> + Round = ((Frac band 1) =:= 0), + case Exp >= 0 of + true -> + BExp = 1 bsl Exp, + case (Frac =/= ?BIG_POW) of + true -> + scale((Frac * BExp * 2), 2, BExp, BExp, + Round, Round, Float); + false -> + scale((Frac * BExp * 4), 4, (BExp * 2), BExp, + Round, Round, Float) + end; + false -> + case (Exp =:= ?MIN_EXP) orelse (Frac =/= ?BIG_POW) of + true -> + scale((Frac * 2), 1 bsl (1 - Exp), 1, 1, + Round, Round, Float); + false -> + scale((Frac * 4), 1 bsl (2 - Exp), 2, 1, + Round, Round, Float) + end + end. + +scale(R, S, MPlus, MMinus, LowOk, HighOk, Float) -> + Est = int_ceil(math:log10(abs(Float)) - 1.0e-10), + %% Note that the scheme implementation uses a 326 element look-up table + %% for int_pow(10, N) where we do not. + case Est >= 0 of + true -> + fixup(R, S * int_pow(10, Est), MPlus, MMinus, Est, + LowOk, HighOk); + false -> + Scale = int_pow(10, -Est), + fixup(R * Scale, S, MPlus * Scale, MMinus * Scale, Est, + LowOk, HighOk) + end. + +fixup(R, S, MPlus, MMinus, K, LowOk, HighOk) -> + TooLow = case HighOk of + true -> + (R + MPlus) >= S; + false -> + (R + MPlus) > S + end, + case TooLow of + true -> + [(K + 1) | generate(R, S, MPlus, MMinus, LowOk, HighOk)]; + false -> + [K | generate(R * 10, S, MPlus * 10, MMinus * 10, LowOk, HighOk)] + end. + +generate(R0, S, MPlus, MMinus, LowOk, HighOk) -> + D = R0 div S, + R = R0 rem S, + TC1 = case LowOk of + true -> + R =< MMinus; + false -> + R < MMinus + end, + TC2 = case HighOk of + true -> + (R + MPlus) >= S; + false -> + (R + MPlus) > S + end, + case TC1 of + false -> + case TC2 of + false -> + [D | generate(R * 10, S, MPlus * 10, MMinus * 10, + LowOk, HighOk)]; + true -> + [D + 1] + end; + true -> + case TC2 of + false -> + [D]; + true -> + case R * 2 < S of + true -> + [D]; + false -> + [D + 1] + end + end + end. + +unpack(Float) -> + <> = <>, + {Sign, Exp, Frac}. + +frexp1({_Sign, 0, 0}) -> + {0.0, 0}; +frexp1({Sign, 0, Frac}) -> + Exp = log2floor(Frac), + <> = <>, + {Frac1, -(?FLOAT_BIAS) - 52 + Exp}; +frexp1({Sign, Exp, Frac}) -> + <> = <>, + {Frac1, Exp - ?FLOAT_BIAS}. + +log2floor(Int) -> + log2floor(Int, 0). + +log2floor(0, N) -> + N; +log2floor(Int, N) -> + log2floor(Int bsr 1, 1 + N). + + +transform_digits(Place, [0 | Rest]) -> + transform_digits(Place, Rest); +transform_digits(Place, Digits) -> + {Place, [$0 + D || D <- Digits]}. + + +frexp_int(F) -> + case unpack(F) of + {_Sign, 0, Frac} -> + {Frac, ?MIN_EXP}; + {_Sign, Exp, Frac} -> + {Frac + (1 bsl 52), Exp - 53 - ?FLOAT_BIAS} + end. + +%% +%% Tests +%% +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + +int_ceil_test() -> + ?assertEqual(1, int_ceil(0.0001)), + ?assertEqual(0, int_ceil(0.0)), + ?assertEqual(1, int_ceil(0.99)), + ?assertEqual(1, int_ceil(1.0)), + ?assertEqual(-1, int_ceil(-1.5)), + ?assertEqual(-2, int_ceil(-2.0)), + ok. + +int_pow_test() -> + ?assertEqual(1, int_pow(1, 1)), + ?assertEqual(1, int_pow(1, 0)), + ?assertEqual(1, int_pow(10, 0)), + ?assertEqual(10, int_pow(10, 1)), + ?assertEqual(100, int_pow(10, 2)), + ?assertEqual(1000, int_pow(10, 3)), + ok. + +digits_test() -> + ?assertEqual("0", + digits(0)), + ?assertEqual("0.0", + digits(0.0)), + ?assertEqual("1.0", + digits(1.0)), + ?assertEqual("-1.0", + digits(-1.0)), + ?assertEqual("0.1", + digits(0.1)), + ?assertEqual("0.01", + digits(0.01)), + ?assertEqual("0.001", + digits(0.001)), + ?assertEqual("1.0e+6", + digits(1000000.0)), + ?assertEqual("0.5", + digits(0.5)), + ?assertEqual("4503599627370496.0", + digits(4503599627370496.0)), + %% small denormalized number + %% 4.94065645841246544177e-324 =:= 5.0e-324 + <> = <<0,0,0,0,0,0,0,1>>, + ?assertEqual("5.0e-324", + digits(SmallDenorm)), + ?assertEqual(SmallDenorm, + list_to_float(digits(SmallDenorm))), + %% large denormalized number + %% 2.22507385850720088902e-308 + <> = <<0,15,255,255,255,255,255,255>>, + ?assertEqual("2.225073858507201e-308", + digits(BigDenorm)), + ?assertEqual(BigDenorm, + list_to_float(digits(BigDenorm))), + %% small normalized number + %% 2.22507385850720138309e-308 + <> = <<0,16,0,0,0,0,0,0>>, + ?assertEqual("2.2250738585072014e-308", + digits(SmallNorm)), + ?assertEqual(SmallNorm, + list_to_float(digits(SmallNorm))), + %% large normalized number + %% 1.79769313486231570815e+308 + <> = <<127,239,255,255,255,255,255,255>>, + ?assertEqual("1.7976931348623157e+308", + digits(LargeNorm)), + ?assertEqual(LargeNorm, + list_to_float(digits(LargeNorm))), + %% issue #10 - mochinum:frexp(math:pow(2, -1074)). + ?assertEqual("5.0e-324", + digits(math:pow(2, -1074))), + ok. + +frexp_test() -> + %% zero + ?assertEqual({0.0, 0}, frexp(0.0)), + %% one + ?assertEqual({0.5, 1}, frexp(1.0)), + %% negative one + ?assertEqual({-0.5, 1}, frexp(-1.0)), + %% small denormalized number + %% 4.94065645841246544177e-324 + <> = <<0,0,0,0,0,0,0,1>>, + ?assertEqual({0.5, -1073}, frexp(SmallDenorm)), + %% large denormalized number + %% 2.22507385850720088902e-308 + <> = <<0,15,255,255,255,255,255,255>>, + ?assertEqual( + {0.99999999999999978, -1022}, + frexp(BigDenorm)), + %% small normalized number + %% 2.22507385850720138309e-308 + <> = <<0,16,0,0,0,0,0,0>>, + ?assertEqual({0.5, -1021}, frexp(SmallNorm)), + %% large normalized number + %% 1.79769313486231570815e+308 + <> = <<127,239,255,255,255,255,255,255>>, + ?assertEqual( + {0.99999999999999989, 1024}, + frexp(LargeNorm)), + %% issue #10 - mochinum:frexp(math:pow(2, -1074)). + ?assertEqual( + {0.5, -1073}, + frexp(math:pow(2, -1074))), + ok. + +-endif. diff --git a/stocks/apps/stock/src/stock.app.src b/stocks/apps/stock/src/stock.app.src new file mode 100644 index 0000000..345b779 --- /dev/null +++ b/stocks/apps/stock/src/stock.app.src @@ -0,0 +1,15 @@ +{application, stock, + [ + {description, ""}, + {vsn, "1"}, + {registered, []}, + {applications, [ + kernel, + stdlib, + gproc, + sasl, + os_mon + ]}, + {mod, { stock_app, []}}, + {env, []} + ]}. diff --git a/stocks/apps/stock/src/stock.hrl b/stocks/apps/stock/src/stock.hrl new file mode 100644 index 0000000..c16d601 --- /dev/null +++ b/stocks/apps/stock/src/stock.hrl @@ -0,0 +1,10 @@ +-define(MINUTE, (1000 * 60)). +-define( HOUR, (1000 * 60 * 60)). +-define( DAY, (1000 * 60 * 60 * 24)). +-define( WEEK, (1000 * 60 * 60 * 24 * 7)). + +-define(MINUTE_SCALE, 0). +-define( HOUR_SCALE, 1). +-define( DAY_SCALE, 2). +-define( WEEK_SCALE, 3). +-define( MONTH_SCALE, 4). \ No newline at end of file diff --git a/stocks/apps/stock/src/stock_api.erl b/stocks/apps/stock/src/stock_api.erl new file mode 100644 index 0000000..9096394 --- /dev/null +++ b/stocks/apps/stock/src/stock_api.erl @@ -0,0 +1,257 @@ +%% @author Andrew Kondratovich +%% @doc General API for application + +-module(stock_api). +-author('Andrew Kondratovich '). + +-export([select/4, store/2, info/1, names/0, perf/0, erase/1, merge/2]). +-include("stock.hrl"). + +-spec perf() -> {Cpu, Mem, Time} | {'error', Reason} when + Reason :: any(), + Cpu :: float(), + Mem :: number(), + Time :: number(). +%% @doc request for current cpu/memory consumption +perf() -> + case gproc:lookup_local_name(perf) of %% lookup worker + undefined -> + case stock_perf:start_link([]) of %% start new + {ok, Worker} -> gen_server:call(Worker, perf); + _ -> {error, "Cannot create worker"} %% woops + end; + Worker -> + gen_server:call(Worker, perf) %% retrieve data + end. + +-spec erase(Name) -> Result when + Result :: 'ok' | {'error', Error}, + Error :: 'not_found' | 'simple_one_for_one', + Name :: string(). +%% @doc when we want to clear stock data +%% we need to say about it to process +%% and send request to supervisor +erase(Name) -> + case gproc:lookup_local_name(Name) of + undefined -> ok; + Pid -> + %% we send message to worker because + %% it should cancel `heir` option + %% for ets tables + gen_server:call(Pid, before_death), + stock_sup:stop_worker(Pid) + end. + +-spec info(Name) -> Result when + Name :: string(), + Result :: [] | [Info], + Info :: {Type, Value}, + Type :: 'name' | 'wordsize' | 'heap_size' | 'total_heap_size', + Value :: string() | number() | float(). +%% @doc get memory consumption of specified process +info(Name) when is_list(Name) -> + info(Name, gproc:lookup_local_name(Name)). + +info(_, undefined) -> []; + +%% get heap size of process and wordsize +info(Name, Worker) -> + [ + %% list of tuples - prepared for to_json() + {name, iolist_to_binary(Name)}, + gproc:info(Worker, heap_size), + gproc:info(Worker, total_heap_size), + {wordsize, erlang:system_info(wordsize)} + ]. + +-spec names() -> Result when + Result :: list(). +%% @doc list of available workers +names() -> + lists:map( + fun(N) -> iolist_to_binary(N) end, + %% select local names with `stock` tag + gproc:select([{{{n, l, '$1'}, '_', stock}, [], ['$1']}]) + ). + +%% store new data to ets tables +to_ets(Worker, Data) -> + Sorted = lists:keysort(1, Data), %% sort data according time + {Merged, Last} = lists:foldl(fun premerge/2, {[], []}, Sorted), %% scale to minutes + gen_server:cast(Worker, {put, [Last | Merged]}). %% send to worker + +-spec store(Name, Data) -> 'ok' | {'error', Reason} when + Name :: string(), + Data :: [Obj], + Obj :: {Time, Price, Volume}, + Time :: number(), + Price :: float(), + Volume :: number(), + Reason :: any(). +%% @doc API point to store data +store(_, []) -> ok; + +store(Name, Data) -> + case get_or_create_worker(string:to_upper(Name)) of + {error, Reason} -> {error, Reason}; + {ok, Worker} -> to_ets(Worker, Data) + end. + +-spec select(Name, From, To, Scale) -> Result when + Name :: string(), + From :: number(), + To :: number(), + Scale :: number(), + Result :: [Obj], + Obj :: {Time, {Time0, Open}, {Time1, Close}, Max, Min, Volume}, + Time :: number(), %% begin of time range unit + Time0 :: number(), %% time of first deal + Time1 :: number(), %% time of last deal + Open :: float(), %% open price + Close :: float(), %% close price + Max :: float(), %% max price + Min :: float(), %% min price + Volume :: number(). %% total volume of time range +%% @doc API point to select data +select(Name, From, To, Scale) -> + case gproc:lookup_local_name(string:to_upper(Name)) of + undefined -> []; + Pid -> from_ets(Pid, From, To, Scale) + end. + +%% for minute time scale we have premerged data in table +from_ets(Worker, From, To, ?MINUTE_SCALE) when From < To -> + gen_server:call(Worker, {get, {From, To}}); + +%% get data from ets and merge it according scale unit +from_ets(Worker, F, T, S) when F < T -> + From = correct_from(F, S), + To = correct_to(T, S), + All = collect(Worker, From, To, S), %% retrieve and merge data + lists:filter(fun(E) -> E =/= [] end, All); %% remove empty + +from_ets(_, _, _, _) -> []. + +%% We walk from end to begin because of reverse order. +%% We retrieve data from worker for range of time +%% and collect it to list. +collect(Worker, From, To, Scale) -> + Limit = correct_from(To, Scale), %% down limit of first step + collect0([], Worker, From, Limit, To, Scale). + +%% when we pass From time limit - return data +collect0(Data, _, From, _, To, _) when To =< From -> Data; + +collect0(Data, Worker, From, Limit, To, Scale) -> + NextLimit = correct_from(Limit - 1, Scale), %% down limit of next step + V = gen_server:call(Worker, {merge, {Limit, To}}), %% get merged data from worker + collect0([V | Data], Worker, From, NextLimit, Limit, Scale). %% continue for next step + +before({Time0, _} = V, {Time1, _}) when Time1 >= Time0 -> V; +before(_, V) -> V. + +later({Time0, _} = V, {Time1, _}) when Time0 >= Time1 -> V; +later(_, V) -> V. + +%% Fold-like function. +%% It walks through the list and merge +%% elements to one ohlc temp object. +%% When function passes time step (one minute) +%% it puts temp ohlc value in list and begin +%% to merge data for the next time range. +premerge(V, {Data, []}) -> + Time = correct_from(erlang:element(1, V), 0), + {Data, merge([], V, Time)}; + +%% V0 - next element in list +%% V1 - current temp ohlc object +premerge(V0, {Data, V1}) -> + Time0 = erlang:element(1, V0), + Time1 = erlang:element(1, V1), + if + Time0 >= Time1 + ?MINUTE -> + Time = correct_from(Time0, 0), %% get correct time stamp + {[V1 | Data], merge([], V0, Time)}; + true -> {Data, merge(V1, V0)} + end. + +%% merge raw data with already premerged +merge([], {Time, Price, Volume}, Time0) -> + {Time0, {Time, Price}, {Time, Price}, Price, Price, Volume}; + +merge([], V, Time0) when is_tuple(V) -> + erlang:setelement(1, V, Time0); + +merge([V0], V1, Time) -> merge(V0, V1, Time); + +merge(V0, {Time, Price, Volume}, Time0) -> + merge(V0, {Time, {Time, Price}, {Time, Price}, Price, Price, Volume}, Time0); + +%% merge two values +merge({Time0, Open0, Close0, Min0, Max0, Volume0}, + {_, Open1, Close1, Min1, Max1, Volume1}, Time0) -> + {Time0, before(Open0, Open1), later(Close0, Close1), min(Min0, Min1), max(Max0, Max1), Volume0 + Volume1}. + +merge([], V1) -> + merge([], V1, erlang:element(1, V1)); + +merge([V0], V1) -> + merge(V0, V1); + +merge(V0, V1) -> + merge(V0, V1, erlang:element(1, V0)). + +%% check if worker with required name exists +%% and return it's pid back or create new +get_or_create_worker(Name) -> + case gproc:lookup_local_name(Name) of + undefined -> %% create new worker + case stock_sup:start_worker(Name) of + {ok, Worker} -> {ok, Worker}; + _ -> {error, "Cannot create worker: " ++ Name} + end; + Pid -> %% we already have worker + {ok, Pid} + end. + +%% correct from timestamp to end of time unit +correct_to(From, ?MINUTE_SCALE) -> + correct_from(From + ?MINUTE, ?MINUTE_SCALE); + +correct_to(From, ?HOUR_SCALE) -> %% hour + correct_from(From + ?HOUR, ?HOUR_SCALE); + +correct_to(From, ?DAY_SCALE) -> %% day + correct_from(From + ?DAY, ?DAY_SCALE); + +%% correct timestamp for end of week +correct_to(From, ?WEEK_SCALE) -> + correct_from(From + ?WEEK, ?WEEK_SCALE); + +%% correct timestamp for end of month +correct_to(From, ?MONTH_SCALE) -> + {{Ye, Mo, _}, _} = stock_util:to_date(From), + case Mo of + 12 -> stock_util:from_date({{Ye + 1, 1, 1}, {0, 0, 0}}); + _ -> stock_util:from_date({{Ye, Mo + 1, 1}, {0, 0, 0}}) + end. + +%% correct from timestamp to begin of time unit +correct_from(From, ?MINUTE_SCALE) -> + erlang:trunc(From / ?MINUTE) * ?MINUTE; + +correct_from(From, ?HOUR_SCALE) -> %% hour + erlang:trunc(From / ?HOUR) * ?HOUR; + +correct_from(From, ?DAY_SCALE) -> %% day + erlang:trunc(From / ?DAY) * ?DAY; + +%% correct timestamp for begin of week +correct_from(From, ?WEEK_SCALE) -> + {Date, _} = stock_util:to_date(From), + stock_util:from_date({stock_util:safe_begin_of_week(Date), {0, 0, 0}}); + +%% correct timestamp for begin of month +correct_from(From, ?MONTH_SCALE) -> + {{Ye, Mo, _}, _} = stock_util:to_date(From), + stock_util:from_date({{Ye, Mo, 1}, {0, 0, 0}}). \ No newline at end of file diff --git a/stocks/apps/stock/src/stock_app.erl b/stocks/apps/stock/src/stock_app.erl new file mode 100644 index 0000000..d3ea193 --- /dev/null +++ b/stocks/apps/stock/src/stock_app.erl @@ -0,0 +1,22 @@ +%% @author Andrew Kondratovich +%% @doc Stock application source file +%% + +-module(stock_app). +-author('Andrew Kondratovich '). + +-behaviour(application). + +%% Application callbacks +-export([start/2, stop/1]). + +%% =================================================================== +%% Application callbacks +%% =================================================================== + +start(_StartType, _StartArgs) -> + ets_manager:start(), %% start ets manager + stock_sup:start_link(). + +stop(_State) -> + ok. diff --git a/stocks/apps/stock/src/stock_perf.erl b/stocks/apps/stock/src/stock_perf.erl new file mode 100644 index 0000000..f540601 --- /dev/null +++ b/stocks/apps/stock/src/stock_perf.erl @@ -0,0 +1,67 @@ +%% @author Andrew Kondratovich +%% @doc Worker that handles performance requests +%% Updates info one time in 2 seconds +%% + +-module(stock_perf). +-author('Andrew Kondratovich '). + +-behaviour(gen_server). +-export([start_link/1]). +-export([ + init/1, + handle_call/3, + handle_cast/2, + handle_info/2, + terminate/2, + code_change/3, + update_perf/1 +]). + +%%% API +start_link(Args) -> + gen_server:start_link(?MODULE, Args, []). + +%%% gen_server callbacks + +init(_Args) -> + true = gproc:reg({n, l, perf}, perf), + timer:apply_interval(2000, ?MODULE, update_perf, [self()]), %% every 2 second update info + {ok, perf()}. + +update_perf(Worker) -> + gen_server:cast(Worker, update_perf). + +nnow() -> + {Ms, S, _} = erlang:now(), + S * 1000 + Ms * 1000 * 1000 * 1000. + +perf() -> + Cpu = case os:type() of + {unix, _} -> cpu_sup:util(); + _ -> 0.0 %% os specific + end, + Mem = erlang:memory(total), + {Cpu, Mem, nnow()}. + +%% return current state {Cpu, Mem, Time} +handle_call(perf, _From, State) -> + {reply, State, State}; + +handle_call(_Request, _From, State) -> + {noreply, State}. + +handle_cast(update_perf, _State) -> + {noreply, perf()}; + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. diff --git a/stocks/apps/stock/src/stock_sup.erl b/stocks/apps/stock/src/stock_sup.erl new file mode 100644 index 0000000..8593820 --- /dev/null +++ b/stocks/apps/stock/src/stock_sup.erl @@ -0,0 +1,58 @@ +%% @author Andrew Kondratovich +%% @doc Worker supervisor +%% + +-module(stock_sup). +-author('Andrew Kondratovich '). + +-behaviour(supervisor). + +%% API +-export([ + start_link/0, + start_worker/1, + stop_worker/1 +]). + +%% Supervisor callbacks +-export([init/1]). + +%% =================================================================== +%% API functions +%% =================================================================== + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +-define(WORKER_SUP, stock_worker_sup). +-define(WORKER_MOD, stock_worker). + +start_worker(Args) -> + supervisor:start_child(?WORKER_SUP, [Args]). + +stop_worker(Worker) -> + supervisor:terminate_child(?WORKER_SUP, Worker). + +%% =================================================================== +%% Supervisor callbacks +%% =================================================================== + +init([stock_worker_start]) -> %% Worker supervisor + Restart = permanent, + Shutdown = 2000, + Type = worker, + + Children = [{worker, {?WORKER_MOD, start_link, []}, Restart, Shutdown, Type, [?WORKER_MOD]}], + + Strategy = simple_one_for_one, + MaxR = 10, MaxT = 10, + {ok, {{Strategy, MaxR, MaxT}, Children}}; + +init([]) -> %% Main supervisor + Restart = permanent, + Shutdown = brutal_kill, + Children = [{?WORKER_SUP, {supervisor, start_link, [{local, ?WORKER_SUP}, ?MODULE, [stock_worker_start]]}, Restart, Shutdown, supervisor, [?MODULE]}], + Strategy = one_for_one, + MaxR = 5, MaxT = 10, + {ok, {{Strategy, MaxR, MaxT}, Children}}. + diff --git a/stocks/apps/stock/src/stock_util.erl b/stocks/apps/stock/src/stock_util.erl new file mode 100644 index 0000000..d748f62 --- /dev/null +++ b/stocks/apps/stock/src/stock_util.erl @@ -0,0 +1,71 @@ +%% @author Andrew Kondratovich +%% @doc some useful functions +%% + +-module(stock_util). +-author('Andrew Kondratovich '). + +-export([ + prettify/1, + to_json/1, + to_date/1, + from_date/1, + safe_begin_of_week/1 +]). + +prettify(Data) when is_list(Data) -> + lists:map(fun prettify/1, Data); + +%% prepare data for to_json encode +prettify({From, {_, Begin}, {_, End}, Min, Max, Volume}) -> + [ + {"from", From}, + {"begin", Begin}, + {"end", End}, + {"min", Min}, + {"max", Max}, + {"summary", Volume} + ]. + +to_json(Data) -> %% this is very slow =( + iolist_to_binary(mochijson2:encode(Data)). + +-spec to_date(Milliseconds) -> Result when + Result :: {Date, Time}, + Date :: {number(), number(), number()}, + Time :: {number(), number(), number()}, + Milliseconds :: number(). +%% @doc convert timestamp to date/time tuple +to_date(Milliseconds) -> + BaseDate = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}), + Seconds = BaseDate + (Milliseconds div 1000), + calendar:gregorian_seconds_to_datetime(Seconds). + +-spec from_date(DateTime) -> Result when + Result :: number(), + DateTime :: {Date, Time}, + Date :: {number(), number(), number()}, + Time :: {number(), number(), number()}. +%% @doc convert date/time tuple to timestamp +from_date(DateTime) -> + BaseDate = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}), + (calendar:datetime_to_gregorian_seconds(DateTime) - BaseDate) * 1000. + +%% get date of this week monday +safe_begin_of_week({Ye, Mo, Da}) -> + safe_begin_of_week({Ye, Mo, Da}, calendar:day_of_the_week(Ye, Mo, Da)). + +%% when monday in current month +safe_begin_of_week({Ye, Mo, Da}, D) when (Da - D) >= 0 -> + {Ye, Mo, Da - (D - 1)}; + +%% what if monday in previous month ? +%% (but in this year) +safe_begin_of_week({Ye, Mo, Da}, D) when Mo > 1 -> + P = calendar:last_day_of_the_month(Ye, Mo - 1), + {Ye, Mo - 1, (P + Da) - (D - 1)}; + +%% the last case - monday in previous year +safe_begin_of_week({Ye, _, Da}, D) -> + P = calendar:last_day_of_the_month(Ye - 1, 12), + {Ye - 1, 12, (P + Da) - (D - 1)}. \ No newline at end of file diff --git a/stocks/apps/stock/src/stock_worker.erl b/stocks/apps/stock/src/stock_worker.erl new file mode 100644 index 0000000..f3bd80c --- /dev/null +++ b/stocks/apps/stock/src/stock_worker.erl @@ -0,0 +1,112 @@ +%% @author Andrew Kondratovich +%% @doc worker gen_server +%% +%% We have one process for every stock. +%% For large amount of stocks and uniform +%% load all cores will be in use. +%% This worker handles premerged ohlc data +%% for minutes.In worst case for `month` scale +%% for one month we need 60 * 24 * 30 (31) values. +%% Also, selection is about 100 times faster than +%% to_string self-encoding T_T + +-module(stock_worker). +-author('Andrew Kondratovich '). + +-behaviour(gen_server). +-export([start_link/1]). +-export([ + init/1, + handle_call/3, + handle_cast/2, + handle_info/2, + terminate/2, + code_change/3 +]). + +%%% API +start_link(Args) -> + gen_server:start_link(?MODULE, Args, []). + +%% we need to check if we have already data +%% for this time period +save(T, V) when is_tuple(V) -> + %% Get (maybe) existing element + Ex = ets:lookup(T, erlang:element(1, V)), + %% merge it with new and put back + ets:insert(T, stock_api:merge(Ex, V)). + +%% ets:select/2 is very inefficient way to select +%% bounded range of values - it looks through +%% the whole table and is slow on big tables - +%% so I used next / lookup combo (see below). +select(T, From, To, F) -> + %% we select first key in range, so + %% we can be sure that lookup returns + %% element and avoid additional check + select0(T, ets:prev(T, To), From, [], F). + +%% key iteration finished +select0(_, '$end_of_table', _, Acc0, _) -> Acc0; + +%% we passed key limit +select0(_, Key, Limit, Acc0, _) when Key < Limit -> Acc0; + +select0(T, Key, Limit, Acc0, F) -> + %% we know that this key and value + %% exists in table + [V] = ets:lookup(T, Key), + %% get next key and call recursively + Key2 = ets:prev(T, Key), + select0(T, Key2, Limit, F(V, Acc0), F). + +%%% gen_server callbacks + +init(Id) -> + %% register new name in gproc + true = gproc:reg({n, l, Id}, stock), + %% create two ETS tables + %% (ordered by time - 1st element in tuple) + T0 = ets_manager:new(Id, [ordered_set, private]), + {ok, T0}. + +f_fold (V, Acc) -> [V | Acc]. +f_merge(V, Acc) -> stock_api:merge(Acc, V). + +handle_call({get, {From, To}}, _From, Table) + when is_integer(From), is_integer(To) -> + Reply = select(Table, From, To, fun f_fold/2), + {reply, Reply, Table}; + +handle_call({merge, {From, To}}, _From, Table) + when is_integer(From), is_integer(To) -> + case select(Table, From, To, fun f_merge/2) of + [] -> {reply, [], Table}; + Re -> {reply, erlang:setelement(1, Re, From), Table} + end; + +%% when we want to remove all data for this stock +%% we need to cancel `heir` option in table +handle_call(before_death, _From, Table) -> + ets:setopts(Table, {heir, none}), + {reply, ok, Table}; + +handle_call(_Request, _From, State) -> + {noreply, State}. + +%% Premerged - list of ohlc data for minute scale +handle_cast({put, Premerged}, Table) -> + lists:map(fun(V) -> save(Table, V) end, Premerged), + {noreply, Table}; + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. diff --git a/stocks/etc/www/css/core.css b/stocks/etc/www/css/core.css new file mode 100644 index 0000000..7556890 --- /dev/null +++ b/stocks/etc/www/css/core.css @@ -0,0 +1,136 @@ +body { + font-size: 12px; + font-family: monospace; +} + +input, select { + font-family: monospace; +} + +#back { + width: 1200px; + margin: auto; +} + +#right { + width: 60%; + margin-left: 20%; + height: 240px; +} + +#left { + width: 60%; + float: left; +} + +#top { + width: 20%; + float: left; +} + +#data { + display: none; +} + +#data td, #result td { + text-align: right; +} + +#data, #search { + width: 100%; +} + +#legend input, #search input, #search select { + width: 100%; +} + +#find, #generate, #save { + float: right; +} + +#result { + width: 100%; + margin-top: 10px; + display: none; +} + +#result th { + font-weight: normal; +} + +#result tr { + text-align: left; +} + +.price0, .amount0 { + width: 80px !important; +} + +span.tip { + display: none; + color: gray; +} + +span.tip-show { + color: gray; +} + +#legend { + width: 100%; +} + +#panel { + margin-left: 20%; + margin-bottom: 30px; +} + +#panel span { + margin-right: 30px; +} + +#panel > span { + color: gray; +} + +#slist { + /*width: 50%;*/ + /*float: left;*/ + overflow: auto; + height: 220px; +} + +#info { + width: 100%; +} + +#sfilter { + /*display: none;*/ +} + +#infor { + width: 100%; + /*float: right;*/ + + display: none; +} + +#info tr:hover span.ninfo { + border-bottom: 1px dotted gray; +} + +#stock { + display: none; +} + +#info tr { + cursor: pointer; +} + +.perf { + display: none; + margin: auto; + margin-top: 20px; + width: 60%; + + height: 200px; +} diff --git a/stocks/etc/www/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/stocks/etc/www/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100644 index 0000000..954e22d Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png differ diff --git a/stocks/etc/www/css/images/ui-bg_diagonals-thick_20_666666_40x40.png b/stocks/etc/www/css/images/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100644 index 0000000..64ece57 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_diagonals-thick_20_666666_40x40.png differ diff --git a/stocks/etc/www/css/images/ui-bg_flat_10_000000_40x100.png b/stocks/etc/www/css/images/ui-bg_flat_10_000000_40x100.png new file mode 100644 index 0000000..abdc010 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_flat_10_000000_40x100.png differ diff --git a/stocks/etc/www/css/images/ui-bg_glass_100_f6f6f6_1x400.png b/stocks/etc/www/css/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000..9b383f4 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_glass_100_f6f6f6_1x400.png differ diff --git a/stocks/etc/www/css/images/ui-bg_glass_100_fdf5ce_1x400.png b/stocks/etc/www/css/images/ui-bg_glass_100_fdf5ce_1x400.png new file mode 100644 index 0000000..a23baad Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_glass_100_fdf5ce_1x400.png differ diff --git a/stocks/etc/www/css/images/ui-bg_glass_65_ffffff_1x400.png b/stocks/etc/www/css/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000..42ccba2 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/stocks/etc/www/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/stocks/etc/www/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100644 index 0000000..39d5824 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png differ diff --git a/stocks/etc/www/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/stocks/etc/www/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100644 index 0000000..f127367 Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ diff --git a/stocks/etc/www/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/stocks/etc/www/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100644 index 0000000..359397a Binary files /dev/null and b/stocks/etc/www/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png differ diff --git a/stocks/etc/www/css/images/ui-icons_222222_256x240.png b/stocks/etc/www/css/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000..b273ff1 Binary files /dev/null and b/stocks/etc/www/css/images/ui-icons_222222_256x240.png differ diff --git a/stocks/etc/www/css/images/ui-icons_228ef1_256x240.png b/stocks/etc/www/css/images/ui-icons_228ef1_256x240.png new file mode 100644 index 0000000..a641a37 Binary files /dev/null and b/stocks/etc/www/css/images/ui-icons_228ef1_256x240.png differ diff --git a/stocks/etc/www/css/images/ui-icons_ef8c08_256x240.png b/stocks/etc/www/css/images/ui-icons_ef8c08_256x240.png new file mode 100644 index 0000000..85e63e9 Binary files /dev/null and b/stocks/etc/www/css/images/ui-icons_ef8c08_256x240.png differ diff --git a/stocks/etc/www/css/images/ui-icons_ffd27a_256x240.png b/stocks/etc/www/css/images/ui-icons_ffd27a_256x240.png new file mode 100644 index 0000000..e117eff Binary files /dev/null and b/stocks/etc/www/css/images/ui-icons_ffd27a_256x240.png differ diff --git a/stocks/etc/www/css/images/ui-icons_ffffff_256x240.png b/stocks/etc/www/css/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..42f8f99 Binary files /dev/null and b/stocks/etc/www/css/images/ui-icons_ffffff_256x240.png differ diff --git a/stocks/etc/www/css/jquery-ui-1.8.20.custom.css b/stocks/etc/www/css/jquery-ui-1.8.20.custom.css new file mode 100644 index 0000000..b250f89 --- /dev/null +++ b/stocks/etc/www/css/jquery-ui-1.8.20.custom.css @@ -0,0 +1,377 @@ +/*! + * jQuery UI CSS Framework 1.8.20 + * + * Copyright 2012, 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/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/*! + * jQuery UI CSS Framework 1.8.20 + * + * Copyright 2012, 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/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } +.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*! + * jQuery UI Slider 1.8.20 + * + * Copyright 2012, 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/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/*! + * jQuery UI Datepicker 1.8.20 + * + * Copyright 2012, 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/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/stocks/etc/www/css/jquery-ui-timepicker-addon.css b/stocks/etc/www/css/jquery-ui-timepicker-addon.css new file mode 100644 index 0000000..e0d03c2 --- /dev/null +++ b/stocks/etc/www/css/jquery-ui-timepicker-addon.css @@ -0,0 +1,6 @@ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } diff --git a/stocks/etc/www/http_api.yaws b/stocks/etc/www/http_api.yaws new file mode 100644 index 0000000..e4d5a7b --- /dev/null +++ b/stocks/etc/www/http_api.yaws @@ -0,0 +1,116 @@ + + %% @author Andrew Kondratovich + %% @doc YAWS Template. HTTP API code. + %% This file contains functions to handle http requests. + + -author('Andrew Kondratovich '). + -export([handle_message/1]). + + %% parse required arguments for search request + parse_search_argv(Q) -> + Name = check_arg(lists:keysearch("name", 1, Q), ""), + {From, []} = string:to_integer(check_arg(lists:keysearch("from", 1, Q), "0")), + {To, []} = string:to_integer(check_arg(lists:keysearch("to", 1, Q), "0")), + {Scale, []} = string:to_integer(check_arg(lists:keysearch("scale", 1, Q), "0")), + {Name, From, To, Scale}. + + check_arg({value, {_, V}}, _) -> + V; + + check_arg(false, Default) -> + Default. + + %% handler for `info` request + api_info(A) -> + Argv = yaws_api:parse_query(A), + Result = case check_arg(lists:keysearch("name", 1, Argv), undefined) of + undefined -> []; %% woops + Name -> stock_api:info(Name) %% call general api method + end, + {content, "application/json; charset=utf-8", stock_util:to_json(Result)}. + + %% get names of available stocks + api_names(A) -> {content, "application/json; charset=utf-8", stock_util:to_json(stock_api:names())}. + + %% transform proplist of json data to tuple + proplist_to_tuple(PL) -> + { + proplists:get_value(<<"time">>, PL), + proplists:get_value(<<"price">>, PL), + proplists:get_value(<<"volume">>, PL) + }. + + %% handler for store requests + api_store(A) -> + {ok, R} = yaws_api:postvar(A, "data"), %% get json string of data + {ok, Name} = yaws_api:postvar(A, "name"), %% name of stock + Raw = mochijson2:decode(R, [{format, proplist}]), %% decode json + stock_api:store(Name, lists:map(fun proplist_to_tuple/1, Raw)), %% call general api method + {content, "application/json; charset=utf-8", "ok"}. + + %% remove specified stock from system + api_erase(A) -> + {ok, Name} = yaws_api:postvar(A, "name"), + stock_api:erase(Name), + {content, "application/json; charset=utf-8", "ok"}. + + %% search request + api_search(A) -> + Argv = yaws_api:parse_query(A), + case parse_search_argv(Argv) of %% get pack of parameters + {Name, From, To, Scale} -> + Raw = stock_api:select(Name, From, To, Scale), %% get data + R = stock_util:prettify(Raw), %% prepare for json + {content, "application/json; charset=utf-8", stock_util:to_json(R)}; %% send back + _ -> + {content, "application/json; charset=utf-8", "error"} + end. + + %% Web Socket handler. Used only in performance chart. + %% WebSocket support api in yaws changes sometimes. + %% And sometimes it doesn't work anymore -_- + handle_message(_) -> + {Cpu, Mem, Now} = stock_api:perf(), + R = stock_util:to_json([{cpu, Cpu}, {mem, Mem}, {now, Now}]), + {reply, {text, R}}. + + %% start ws handler + api_ws_perf(A) -> + {websocket, ?MODULE, []}. + + %% select api from get requests + do_get(A) -> + Argv = yaws_api:parse_query(A), + case check_arg(lists:keysearch("api", 1, Argv), undefined) of + "search" -> api_search(A); + "info" -> api_info(A); + "names" -> api_names(A); + "ws_perf" -> api_ws_perf(A); + _ -> {content, "application/json; charset=utf-8", "{'error': 404}"} + end. + + %% select api from post requests + do_post(A) -> + case yaws_api:postvar(A, "api") of + {ok, Api} -> + case Api of + "store" -> api_store(A); + "erase" -> api_erase(A); + _ -> {content, "application/json; charset=utf-8", "{'error': 404}"} + end; + _ -> {content, "application/json; charset=utf-8", "{'error': 404}"} + end. + + out(#arg{req = Req} = A) -> + try + {http_request, Method, _, _} = Req, + case Method of + 'GET' -> do_get(A); + 'POST' -> do_post(A) + end + catch + _: Reason -> + error_logger:error_report(Reason), + {content, "application/json; charset=utf-8", "error"} + end. + diff --git a/stocks/etc/www/index.yaws b/stocks/etc/www/index.yaws new file mode 100644 index 0000000..9793c21 --- /dev/null +++ b/stocks/etc/www/index.yaws @@ -0,0 +1,74 @@ + + Stocks + + + + + + + + + + + +
+
+ => search + => store + => info +
+ +
+ + diff --git a/stocks/etc/www/info.yaws b/stocks/etc/www/info.yaws new file mode 100644 index 0000000..2332eca --- /dev/null +++ b/stocks/etc/www/info.yaws @@ -0,0 +1,52 @@ + + Stocks + + + + + + + + + + + + +
+
+ => search + => store + => info +
+ +
+
+
+ + diff --git a/stocks/etc/www/js/core.js b/stocks/etc/www/js/core.js new file mode 100644 index 0000000..371dfd1 --- /dev/null +++ b/stocks/etc/www/js/core.js @@ -0,0 +1,481 @@ +function get_int(selector, def) { + var c = $(selector); + var value = parseInt(c.val()); + if (isNaN(value)) { + c.val(def); + return def; + } else return value; +}; + +function get_float(selector, def) { + var c = $(selector); + var value = parseFloat(c.val()); + if (isNaN(value)) { + c.val(def); + return parseFloat(def); + } else return value; +}; + +function get_time(selector, def) { + var value = def; + try { + var date = $(selector).datetimepicker('getDate'); + value = date.getTime() - date.getTimezoneOffset() * 60 * 1000; + } catch (e) {}; + return value; +}; + +function format_time(time) { + var dt = time.getUTCDate(); + var mn = time.getUTCMonth() + 1; + + var hrs = time.getUTCHours(); + var mns = time.getUTCMinutes(); + return (dt >= 10 ? dt : '0' + dt) + '/' + (mn >= 10 ? mn : '0' + mn) + '/' + time.getUTCFullYear() + ' ' + (hrs >= 10 ? hrs : '0' + hrs) + ':' + (mns >= 10 ? mns : '0' + mns); +}; + +function deliver(data0, _name) { + var data = $(data0).toArray(); + $.ajax({ + type: 'post', + url: 'http_api.yaws', + data: {api: "store", data: JSON.stringify(data), name: _name}, + dataType: 'text', + success: function(back) {}, + error: function(data) {} + }); +}; + +function generate() { + var count = get_int('#gcount', 10); + + var afrom = get_int('#gafrom', 100); + if (afrom <= 0) afrom = 100; + var ato = get_int('#gato', 5000); + + var pfrom = get_float('#gpfrom', "0.00"); + var pto = get_float('#gpto', "6.00"); + + var now = new Date(); + var year = now.getFullYear(); + var month = now.getMonth(); + var date = now.getDate(); + + var ft = new Date(year, month, date).getTime(); + var tt = new Date(year, month, date + 1).getTime(); + + var tfrom = get_time('#gtfrom', ft); + var tto = get_time('#gtto', tt); + var deltatime = (tto - tfrom) / count; + + var back = []; + for (var i = 0; i < count; i++) { + var prtime = tfrom + deltatime * i; + var time = new Date(random_int(prtime, prtime + deltatime)); + + var row_data = { + time: time.getTime(), + price: random(pfrom, pto), + volume: Math.floor(random_int(afrom, ato) / 100) * 100 + }; + + back.push(row_data); + } + + return back; +}; + +function i_generation() { + i_timepicker($('#gtfrom'), $('#gtto')); + + $('#save').click(function(e) { + var _name = $('#gname').val(); + if (_name.trim().length == 0) return; + $('#data').find('tr').not('.head').remove(); + + var data0 = []; + if ($('#data').data('fake') || $('.data0').size() == 0) data0 = generate(); + else { + $('#data').data('fake', true); + data0 = $('.data0').map(function() { return $(this).data('info'); }); + } + + if (data0.length == 0) return; + + while (true) { + var end = $(data0.splice(100)); + deliver(data0, _name); + if (end.size() == 0) return; + else data0 = end; + } + }); + + $('#ifshow').click(function(e) { + if ($(this).is(':checked')) $('#generate').html("Generate and show"); + else $('#generate').html("Generate and send"); + }); + + $('#generate').click(function(e) { + var datatable = $('#data'); + datatable.data('fake', false); + datatable.find('tr').not('.head').remove(); + datatable.show(); + + $("#legend span.tip").show(); + + var back = generate(); + var tdata = datatable.find('tbody'); + for (var i = 0; i < back.length; i++) { + var row_data = back[i]; + var row = $('' + + '' + + '' + format_time(new Date(row_data.time)) + '' + + '' + pf(row_data.price) + '' + + '' + row_data.volume + '' + + '' + + ''); + + row.data('info', row_data); + tdata.append(row); + } + + $('.data0 td').dblclick(function(e) { + var thiz = e.target; + if (thiz.tagName != "SPAN") return; + + var clazz = thiz.className; + var value = thiz.innerHTML; + var inp = document.createElement("input"); + inp.value = value; + thiz.parentNode.replaceChild(inp, thiz); + + var fsave = function(e) { + try { + var value = inp.value; + var span = document.createElement("span"); + span.className = clazz; + span.innerHTML = value; + inp.parentNode.replaceChild(span, inp); + + var row_data = $(span).parents('tr').data('info'); + row_data.time = value; + $(span).parents('tr').data('info', row_data); + } catch (error) {} // bug with double triggering in chrome with open console + }; + + var $inp = $(inp); + if (clazz == "time0") { + var tfrom = get_time('#gtfrom', Date.now()); + var tto = get_time('#gtto', Date.now() + 1000 * 60 * 60 * 24); + + $inp.datetimepicker({ + dateFormat: 'dd/mm/yy', + timeFormat: 'hh:mm', + minDate: new Date(tfrom), + maxDate: new Date(tto), + onClose: function(dateText, inst) { + fsave(); + } + }); + } else { + $inp.focusout(fsave); + $inp.keyup(function(e) { + if (e.keyCode == 13 || e.keyCode == 27) fsave(e); + }); + } + + $inp.focus(); + }); + }); +}; + +function random_int(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +}; + +function random(min, max) { + return Math.random() * (max - min) + min; +}; + +function i_timepicker(from, to) { + from.datetimepicker({ + dateFormat: 'dd/mm/yy', + timeFormat: 'hh:mm', + onClose: function(dateText, inst) { + var endDateTextBox = to; + if (endDateTextBox.val() != '') { + var testStartDate = new Date(dateText); + var testEndDate = new Date(endDateTextBox.val()); + if (testStartDate > testEndDate) + endDateTextBox.val(dateText); + } + else { + endDateTextBox.val(dateText); + } + }, + onSelect: function (selectedDateTime){ + var start = $(this).datetimepicker('getDate'); + to.datetimepicker('option', 'minDate', new Date(start.getTime())); + } + }); + + to.datetimepicker({ + dateFormat: 'dd/mm/yy', + timeFormat: 'hh:mm', + onClose: function(dateText, inst) { + var startDateTextBox = from; + if (startDateTextBox.val() != '') { + var testStartDate = new Date(startDateTextBox.val()); + var testEndDate = new Date(dateText); + if (testStartDate > testEndDate) + startDateTextBox.val(dateText); + } + else { + startDateTextBox.val(dateText); + } + }, + onSelect: function (selectedDateTime){ + var end = $(this).datetimepicker('getDate'); + from.datetimepicker('option', 'maxDate', new Date(end.getTime())); + } + }); + + var now = new Date(); + var year = now.getFullYear(); + var month = now.getMonth(); + var date = now.getDate(); + + var ft = new Date(year, month, date); + var tt = new Date(year, month, date + 1); + + from.datetimepicker('option', 'maxDate', tt); + to.datetimepicker('option', 'minDate', ft); + + from.datetimepicker('setDate', ft); + to.datetimepicker('setDate', tt); +}; + +function i_bind() { + $('#find').click(function(e) { + var _from = get_time('#from', 0); + var _to = get_time('#to', 0); + var _name = $('#name').val(); + var _scale = $('#scale').val(); + + if (_name.trim().length == 0) return; + + var time0 = Date.now(); + $.ajax({ + type: 'get', + url: 'http_api.yaws', + data: {api: "search", name: _name, from: _from, to: _to, scale: _scale}, + dataType: 'json', + success: function(back) { + var datatable = $('#result'); + datatable.find('tr').not('.head').remove(); + datatable.show(); + + var tdata = datatable.find('tbody'); + for (var i in back) { + var obj = back[i]; + var time = new Date(obj.from); + var begin = obj.begin; + var end = obj.end; + var min = obj.min; + var max = obj.max; + var total = obj.summary; + + tdata.append('' + + '' + + '' + format_time(time) + '' + + '' + pf(begin) + '' + + '' + pf(end) + '' + + '' + pf(min) + '' + + '' + pf(max) + '' + + '' + total + '' + + '' + + ''); + } + + var stock = $('#stock'); + if (back.length > 10) { + stock.find('#stockdiv').remove(); + var graph = $('
'); + stock.append(graph); + graph.hide(); + graph.width(720); + stock.show(); + stock.find('#showg').unbind(); + draw_stock('stockdiv', back, $("#name").val().toUpperCase()); + stock.find('#showg').click(function(e) { graph.toggle('scale'); }); + } else stock.hide(); + }, + error: function(back) { + console.log(back); + } + }); + }); +}; + +function pfs(n) { + if (n < 1024) return n + ' B'; + if (n < 1024 * 1024) return pf(n / 1024) + ' KB'; + if (n < 1024 * 1024 * 1024) return pf(n / (1024 * 1024)) + ' MB'; + return pf(n / (1024 * 1024 * 1024)) + ' GB'; // lolwut ? +}; + +function pf(n) { + var sn = String(n); + var pp = sn.search("\\."); + if (pp == -1) { + return sn + ".00"; + } else { + if (sn.length - 3 >= pp) return sn.substring(0, pp + 3); + return (sn + "00").substring(0, pp + 3); + } +}; + +// http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript +function query_param(name) { + name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + var regexS = "[\\?&]" + name + "=([^&#]*)"; + var regex = new RegExp(regexS); + var results = regex.exec(window.location.search); + if(results == null) return ""; + else return decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + +function i_info() { + if (typeof WebSocket != "undefined") { + var cpu_chart = undefined; + var mem_chart = undefined; + ws_perf(function(msg) { + var data = JSON.parse(msg.data); + if (typeof data.now == "undefined") return; + + var mincount = 40; + if (cpu_chart.series[0].data.length < mincount) { + for (var i = 0; i < mincount; i++) { + cpu_chart.series[0].addPoint([data.now - 2000 * (mincount + 1 - i), data.cpu], false, false); + mem_chart.series[0].addPoint([data.now - 2000 * (mincount + 1 - i), data.mem / (1024 * 1024)], false, false); + } + } + + cpu_chart.series[0].addPoint([data.now, data.cpu], true, true); + mem_chart.series[0].addPoint([data.now, data.mem / (1024 * 1024)], true, true); + }, function() { + $('.perf').show(); + cpu_chart = draw_perf('cpu', 'CPU (System)', '%'); + mem_chart = draw_perf('mem', 'Memory (Erlang Node)', 'mb'); + }); + } + + $.ajax({ + type: 'get', + url: 'http_api.yaws', + data: {api: "names"}, + dataType: 'json', + success: function(back) { + var rtable = $('#info tbody'); + + for (var i in back) { + var obj = back[i]; + + rtable.append('' + + '' + + '' + obj + '' + + // ' >> ' + + '' + + ''); + } + + var check_value = function() { + var value = $('#sfilter').val(); + var all = $('#info tr'); + var ignore = all.filter(function(i) { + return $(this).find('.ninfo').text().search(value.toUpperCase()) == -1; + }); + + all.show(); + ignore.hide(); + }; + + var cid = -1; + $('#sfilter').focus(function(e) { + cid = setInterval(check_value, 500); + }); + + $('#sfilter').focusout(function(e) { + check_value(); + clearInterval(cid); + }); + + $('.ninfo').click(function(e) { + var _name = $(this).text(); + // var _name = $(this).parent().prev().find('span').text(); + $.ajax({ + type: 'get', + url: 'http_api.yaws', + data: {api: "info", name: _name}, + dataType: 'json', + success: function(back) { + if (back.length == 0) return; + var infotable = $('#infor tbody'); + + infotable.parent().show(); + infotable.html(""); + infotable.append('' + + '' + + 'Name:' + + '' + (back.name || '') + '' + + '' + + '' + + 'Heap size:' + + '' + (pfs(back.heap_size * back.wordsize) || '') + '' + + '' + + '' + + 'Total heap size:' + + '' + (pfs(back.total_heap_size * back.wordsize) || '') + '' + + '' + + '' + + '' + + 'go to search' + + '' + + '' + + '' + + '' + + '' + + 'delete' + + '' + + '' + + ''); + + infotable.find('td:last-child').css('text-align', 'right'); + }, + error: function(back) { + console.log(back); + } + }); + }); + }, + error: function(back) { + console.log(back); + } + }); +}; + +function erase(_name) { + if ($('[name=erase]').is(':checked')) { + $.ajax({ + type: 'post', + url: 'http_api.yaws', + data: {api: "erase", name: _name}, + dataType: 'text', + success: function(back) { + $('#info tr').filter(function(e) { return $(this).find('.ninfo').text() == _name; }).remove(); + $('#infor').find('tbody').html(""); + }, + error: function(data) {} + }); + } +}; diff --git a/stocks/etc/www/js/graph.js b/stocks/etc/www/js/graph.js new file mode 100644 index 0000000..cee5fd0 --- /dev/null +++ b/stocks/etc/www/js/graph.js @@ -0,0 +1,111 @@ +function draw_perf(container, name, per) { + Highcharts.setOptions({global: { useUTC: false }}); + + return new Highcharts.Chart({ + chart: { + renderTo: container, + marginRight: 10 + }, + title: { text: name }, + xAxis: { + type: 'datetime', + tickPixelInterval: 150 + }, + yAxis: { + title: { text: per }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + formatter: function() { + return ''+ this.series.name +'
'+ + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) +'
'+ + Highcharts.numberFormat(this.y, 2); + } + }, + legend: { + enabled: false + }, + series: [{ + name: per, + type: 'spline', + data: [] + }] + }); +}; + +function draw_stock(container, data, name) { + Highcharts.setOptions({global: { useUTC: true }}); + + // split the data set into ohlc and volume + var ohlc = [], + volume = [], + dataLength = data.length; + + for (i = 0; i < dataLength; i++) { + ohlc.push([ + data[i].from, // the date + parseFloat(pf(data[i].begin)), // open + parseFloat(pf(data[i].max)), // high + parseFloat(pf(data[i].min)), // low + parseFloat(pf(data[i].end)) // close + ]); + + volume.push([ + data[i].from, // the date + data[i].summary // the volume + ]) + } + + // create the chart + chart = new Highcharts.StockChart({ + chart: { + renderTo: container, + alignTicks: false, + height: 290 + }, + + navigator: { enabled: false }, + scrollbar: { enabled: false }, + rangeSelector: { enabled: false }, + exporting: { enabled: false }, + title: { text: name }, + + plotOptions: { + series: { + dataGrouping : { + groupPixelWidth: 10 + } + } + }, + + yAxis: [{ + title: { text: 'Price' }, + height: 100, + lineWidth: 2 + }, + + { + title: { text: 'Volume' }, + top: 150, + height: 100, + offset: 0, + lineWidth: 2 + }], + + series: [{ + type: 'candlestick', + name: name, + data: ohlc + }, + { + type: 'column', + name: 'Volume', + data: volume, + yAxis: 1 + }] + }); +}; diff --git a/stocks/etc/www/js/highcharts.js b/stocks/etc/www/js/highcharts.js new file mode 100644 index 0000000..a22d76f --- /dev/null +++ b/stocks/etc/www/js/highcharts.js @@ -0,0 +1,203 @@ +/* + Highcharts JS v2.2.2 (2012-04-26) + + (c) 2009-2011 Torstein H?nsi + + License: www.highcharts.com/license +*/ +(function(){function N(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function Ya(){for(var a=0,b=arguments,c=b.length,d={};a3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+ya(a-c).toFixed(f).slice(2):"")} +function Ca(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function dc(a,b,c,d){var e,c=r(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d=y[pb]&&(i.setMilliseconds(0),i.setSeconds(b>=y[Pa]?0:k*Sa(i.getSeconds()/k)));if(b>=y[Pa])i[qc](b>=y[za]?0:k*Sa(i[fc]()/k));if(b>=y[za])i[rc](b>=y[Ra]?0:k*Sa(i[gc]()/k));if(b>=y[Ra])i[hc](b>=y[sa]?1:k*Sa(i[Da]()/k));b>= +y[sa]&&(i[sc](b>=y[ba]?0:k*Sa(i[qb]()/k)),h=i[rb]());b>=y[ba]&&(h-=h%k,i[tc](h));if(b===y[oa])i[hc](i[Da]()-i[ic]()+r(d,1));d=1;h=i[rb]();for(var j=i.getTime(),l=i[qb](),i=i[Da]();jc+e&&(i-=i+a-(c+e),j=g-b+d-h,l=!0);j=j&&g<=j+b&&(j=g+d+h));j+b>d+f&&(j=d+f-b-h);return{x:i,y:j}}function Mc(a,b){var c=a.length,d,e;for(e=0;ec&&(c=a[b]);return c}function Hb(a){for(var b in a)a[b]&&a[b].destroy&& +a[b].destroy(),delete a[b]}function Sb(a){zb||(zb=xa(Ea));a&&zb.appendChild(a);zb.innerHTML=""}function jc(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else U.console&&console.log(c)}function Ab(a){return parseFloat(a.toPrecision(14))}function Ib(a,b){Tb=r(a,b.animation)}function wc(){var a=Ba.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";sb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,r(c,1),r(g,0),r(h,0),r(i,0))).getTime()};fc=b+"Minutes";gc=b+"Hours"; +ic=b+"Day";Da=b+"Date";qb=b+"Month";rb=b+"FullYear";qc=c+"Minutes";rc=c+"Hours";hc=c+"Date";sc=c+"Month";tc=c+"FullYear"}function fb(){}function xc(a,b){function c(a){function b(a,c){this.pos=a;this.type=c||"";this.isNew=!0;c||this.addLabel()}function c(a){if(a)this.options=a,this.id=a.id;return this}function d(a,b,c,e){this.isNegative=b;this.options=a;this.x=c;this.stack=e;this.alignOptions={align:a.align||(W?b?"left":"right":"center"),verticalAlign:a.verticalAlign||(W?"middle":b?"bottom":"top"), +y:r(a.y,W?4:b?14:-6),x:r(a.x,W?b?-6:6:0)};this.textAlign=a.textAlign||(W?b?"right":"left":"center")}function e(){var a=[],b=[],c;E=M=null;o(x.series,function(e){if(e.visible||!s.ignoreHiddenSeries){var f=e.options,g,h,i,j,k,m,l,F,n,x=f.threshold,Bb,o=[],t=0;if(Z&&x<=0)x=f.threshold=null;if(p)f=e.xData,f.length&&(E=Ta(r(E,f[0]),Rb(f)),M=X(r(M,f[0]),Gb(f)));else{var v,w,Jb,z=e.cropped,O=e.xAxis.getExtremes(),Y=!!e.modifyValue;g=f.stacking;Ha=g==="percent";if(g)k=f.stack,j=e.type+r(k,""),m="-"+j,e.stackKey= +j,h=a[j]||[],a[j]=h,i=b[m]||[],b[m]=i;Ha&&(E=0,M=99);f=e.processedXData;l=e.processedYData;Bb=l.length;for(c=0;c=O.min&&(f[c-1]||F)<=O.max))if(F=n.length)for(;F--;)n[F]!==null&&(o[t++]=n[F]);else o[t++]=n;!Ha&&o.length&&(E=Ta(r(E,o[0]),Rb(o)),M=X(r(M,o[0]),Gb(o)));u(x)&&(E>=x? +(E=x,Ja=!0):M=0.5)a=C(a),e=f(a,b,c);else if(a>=0.08){var h=Sa(b),i,j,k,m,l,F;for(i=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];hb&&e.push(l),l>c&&(F=!0),l=m}}else if(b=bb(b),c=bb(c),a=q[d?"minorTickInterval":"tickInterval"], +a=r(a==="auto"?null:a,x._minorAutoInterval,(c-b)*(q.tickPixelInterval/(d?5:1))/((d?ia/P.length:ia)||1)),a=dc(a,null,na.pow(10,Sa(na.log(a)/na.LN10))),e=Ub(f(a,b,c),nb),!d)x._minorAutoInterval=a/5;d||(La=a);return e}function h(){var a=[],b,c;if(Z){c=P.length;for(b=1;b=U,c,d,e,f,g,h;if(p&&U===V&&!Z)u(q.min)||u(q.max)?U=null:(o(x.series,function(a){f=a.xData;for(d=g=a.xIncrement?1: +f.length-1;d>0;d--)if(e=f[d]-f[d-1],c===V||e0||!Ka))I+=b*Ba}La=G===I||G===void 0||I===void 0?1:ba&&!c&&d===la.options.tickPixelInterval?la.tickInterval:r(c,Ua?1:(I-G)*d/(ia||1));p&&!a&&o(x.series,function(a){a.processData(G!==Pb||I!==va)});Db();x.beforeSetTickPositions&&x.beforeSetTickPositions();x.postProcessTickInterval&&(La=x.postProcessTickInterval(La));!Y&&!Z&&(Wa= +na.pow(10,Sa(na.log(La)/na.LN10)),u(q.tickInterval)||(La=dc(La,null,Wa,q)));x.tickInterval=La;Ga=q.minorTickInterval==="auto"&&La?La/5:q.minorTickInterval;(P=q.tickPositions||Xa&&Xa.apply(x,[G,I]))||(P=Y?(x.getNonLinearTimeTicks||Lc)(Kc(La,q.units),G,I,q.startOfWeek,x.ordinalPositions,x.closestPointRange,!0):Z?g(La,G,I):f(La,G,I));if(!ba&&(a=P[0],c=P[P.length-1],q.startOnTick?G=a:G>a&&P.shift(),q.endOnTick?I=c:Icb[$a]&&q.alignTicks!==!1))cb[$a]=P.length} +function k(a){a=(new c(a)).render();oa.push(a);return a}function l(){var a=q.title,d=q.stackLabels,e=q.alternateGridColor,f=q.lineWidth,g,i,j=m.hasRendered&&u(Pb)&&!isNaN(Pb),F=(g=x.series.length&&u(G)&&u(I))||r(q.showEmpty,!0),n,p;if(g||ba)if(Ga&&!Ua&&o(h(),function(a){ra[a]||(ra[a]=new b(a,"minor"));j&&ra[a].isNew&&ra[a].render(null,!0);ra[a].isActive=!0;ra[a].render()}),o(P.slice(1).concat([P[0]]),function(a,c){c=c===P.length-1?0:c+1;if(!ba||a>=G&&a<=I)Ma[a]||(Ma[a]=new b(a)),j&&Ma[a].isNew&&Ma[a].render(c, +!0),Ma[a].isActive=!0,Ma[a].render(c)}),e&&o(P,function(a,b){if(b%2===0&&a=1E3?cc(a,0):a},Pa=O&&q.labels.staggerLines,sa=q.reversed,Ea=Ua&&q.tickmarkPlacement==="between"?0.5:0;b.prototype={addLabel:function(){var a=this.pos,b=q.labels,c=Ua&&O&&Ua.length&&!b.step&&!b.staggerLines&&!b.rotation&&ja/Ua.length||!O&&ja/2,d=a===P[0],e=a===P[P.length-1],f=Ua&& +u(Ua[a])?Ua[a]:a,g=this.label,h=P.info,i;Y&&h&&(i=q.dateTimeLabelFormats[h.higherRanks[a]||h.unitName]);this.isFirst=d;this.isLast=e;a=ab.call({axis:x,chart:m,isFirst:d,isLast:e,dateTimeLabelFormat:i,value:Z?Ab(bb(f)):f});c=c&&{width:X(1,C(c-2*(b.padding||10)))+ga};c=N(c,b.style);u(g)?g&&g.attr({text:a}).css(c):this.label=u(a)&&b.enabled?J.text(a,0,0,b.useHTML).attr({align:b.align,rotation:b.rotation}).css(c).add(S):null},getLabelSize:function(){var a=this.label;return a?(this.labelBBox=a.getBBox(!0))[O? +"height":"width"]:0},getLabelSides:function(){var a=q.labels,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.align]-a.x;return[-a,b-a]},handleOverflow:function(a){var b=!0,c=this.isFirst,d=this.isLast,e=this.label,f=e.x;if(c||d){var g=this.getLabelSides(),h=g[0],g=g[1],i=m.plotLeft,j=i+x.len,k=(a=Ma[P[a+(c?1:-1)]])&&a.label.x+a.getLabelSides()[c?0:1];c&&!sa||d&&sa?f+hk&&(b=!1)):f+g>j&&(f=j-g,a&&f+h0&&gb>0){d=K({align:O&&j&&"center",x:O?!j&&4:10,verticalAlign:!O&&j&&"middle",y:O?j?16:10:j?6:-4,rotation:O&&!j&&90},d);if(!e)a.label=e=J.text(d.text,0,0).attr({align:d.textAlign|| +d.align,rotation:d.rotation,zIndex:q}).css(d.style).add();j=[F[1],F[4],r(F[6],F[1])];F=[F[2],F[5],r(F[7],F[2])];l=Rb(j);q=Rb(F);e.align(d,!1,{x:l,y:q,width:Gb(j)-l,height:Gb(F)-q});e.show()}else e&&e.hide();return a},destroy:function(){Hb(this);Eb(oa,this)}};d.prototype={destroy:function(){Hb(this)},setTotal:function(a){this.cum=this.total=a},render:function(a){var b=this.options.formatter.call(this);this.label?this.label.attr({text:b,visibility:Za}):this.label=m.renderer.text(b,0,0).css(this.options.style).attr({align:this.textAlign, +rotation:this.options.rotation,visibility:Za}).add(a)},setOffset:function(a,b){var c=this.isNegative,d=x.translate(this.total,0,0,0,1),e=x.translate(0),e=ya(d-e),f=m.xAxis[0].translate(this.x)+a,g=m.plotHeight,c={x:W?c?d:d-e:f,y:W?g-f-b:c?g-d-e:g-d,width:W?e:b,height:W?b:e};this.label&&this.label.align(this.alignOptions,null,c).attr({visibility:db})}};Lb=function(a,b,c,d,e){var f=1,g=0,h=d?jb:H,d=d?Pb:G,e=q.ordinal||Z&&e;h||(h=H);c&&(f*=-1,g=ia);sa&&(f*=-1,g-=f*ia);b?(sa&&(a=ia-a),a=a/h+d,e&&(a=x.lin2val(a))): +(e&&(a=x.val2lin(a)),a=f*(a-d)*h+g+f*Ca);return a};Q=function(a,b,c){var d,e,f,a=Lb(a,null,null,c),g=c&&Ra||pa,h=c&&Ya||qa,i,c=e=C(a+Qa);d=f=C(g-a-Qa);if(isNaN(a))i=!0;else if(O){if(d=A,f=g-Kb,cy+B)i=!0}else if(c=y,e=h-Yb,dA+gb)i=!0;return i?null:J.crispLine([ta,c,d,fa,e,f],b||0)};Db=function(){var a=I-G,b=0,c,d;if(p)ba?b=la.pointRange:o(x.series,function(a){b=X(b,a.pointRange);d=a.closestPointRange;!a.noSharedTooltip&&u(d)&&(c=u(c)?Ta(c,d):d)}),x.pointRange=b,x.closestPointRange=c;jb= +H;x.translationSlope=H=ia/(a+b||1);Qa=O?y:Kb;Ca=H*(b/2)};ua.push(x);m[p?"xAxis":"yAxis"].push(x);W&&p&&sa===V&&(sa=!0);N(x,{addPlotBand:k,addPlotLine:k,adjustTickAmount:function(){if(cb&&cb[$a]&&!Y&&!Ua&&!ba&&q.alignTicks!==!1){var a=Da,b=P.length;Da=cb[$a];if(ba||a===null?a=b:c1||ya(b-p)>1?function(){c(a,b)}:null}function d(){if(!l){var a=m.hoverPoints;s.hide();a&&o(a,function(a){a.setState()});m.hoverPoints=null;l=!0}}var e,f=a.borderWidth,g=a.crosshairs,h=[],i=a.style,j=a.shared,k=T(i.padding),l=!0,n=0,p=0;i.padding= +0;var s=J.label("",0,0,null,null,null,a.useHTML,null,"tooltip").attr({padding:k,fill:a.backgroundColor,"stroke-width":f,r:a.borderRadius,zIndex:8}).css(i).hide().add();Fa||s.shadow(a.shadow);return{shared:j,refresh:function(f){var i,k,q,n,p={},w=[];q=f.tooltipPos;i=a.formatter||b;var p=m.hoverPoints,t;j&&(!f.series||!f.series.noSharedTooltip)?(n=0,p&&o(p,function(a){a.setState()}),m.hoverPoints=f,o(f,function(a){a.setState(Ga);n+=a.plotY;w.push(a.getLabelConfig())}),k=f[0].plotX,n=C(n)/f.length,p= +{x:f[0].category},p.points=w,f=f[0]):p=f.getLabelConfig();p=i.call(p);e=f.series;k=r(k,f.plotX);n=r(n,f.plotY);i=C(q?q[0]:W?ja-n:k);k=C(q?q[1]:W?ha-k:n);q=j||!e.isCartesian||e.tooltipOutsidePlot||va(i,k);p===!1||!q?d():(l&&(s.show(),l=!1),s.attr({text:p}),t=a.borderColor||f.color||e.color||"#606060",s.attr({stroke:t}),q=vc(s.width,s.height,R,L,ja,ha,{x:i,y:k},r(a.distance,12),W),c(C(q.x),C(q.y)));if(g){g=Fb(g);var v;q=g.length;for(var z;q--;)if(v=f.series[q?"yAxis":"xAxis"],g[q]&&v)if(v=v.getPlotLinePath(q? +r(f.stackY,f.y):f.x,1),h[q])h[q].attr({d:v,visibility:db});else{z={"stroke-width":g[q].width||1,stroke:g[q].color||"#C0C0C0",zIndex:g[q].zIndex||2};if(g[q].dashStyle)z.dashstyle=g[q].dashStyle;h[q]=J.path(v).attr(z).add()}}aa(m,"tooltipRefresh",{text:p,x:i+R,y:k+L,borderColor:t})},hide:d,hideCrosshairs:function(){o(h,function(a){a&&a.hide()})},destroy:function(){o(h,function(a){a&&a.destroy()});s&&(s=s.destroy())}}}function e(a){function b(a){var c,d,a=a||U.event;if(!a.target)a.target=a.srcElement; +if(a.originalEvent)a=a.originalEvent;if(a.event)a=a.event;c=a.touches?a.touches.item(0):a;hb=zc(H);c.pageX===V?(d=a.x,c=a.y):(d=c.pageX-hb.left,c=c.pageY-hb.top);return N(a,{chartX:C(d),chartY:C(c)})}function c(a){var b={xAxis:[],yAxis:[]};o(ua,function(c){var d=c.translate,e=c.isXAxis;b[e?"xAxis":"yAxis"].push({axis:c,value:d((W?!e:e)?a.chartX-R:ha-a.chartY+L,!0)})});return b}function e(a){var b=m.hoverSeries,c=m.hoverPoint,d=m.hoverPoints||c;if(a&&Va&&d)Va.refresh(d);else{if(c)c.onMouseOut();if(b)b.onMouseOut(); +Va&&(Va.hide(),Va.hideCrosshairs());mb=null}}function f(){if(l){var a={xAxis:[],yAxis:[]},b=l.getBBox(),c=b.x-R,d=b.y-L,e;k&&(o(ua,function(f){if(f.options.zoomEnabled!==!1){var g=f.translate,h=f.isXAxis,i=W?!h:h,j=g(i?c:ha-d-b.height,!0,0,0,1),g=g(i?c+b.width:ha-d,!0,0,0,1);!isNaN(j)&&!isNaN(g)&&(a[h?"xAxis":"yAxis"].push({axis:f,min:Ta(j,g),max:X(j,g)}),e=!0)}}),e&&aa(m,"selection",a,sb));l=l.destroy()}if(m)Q(H,{cursor:"auto"}),m.cancelClick=k,m.mouseIsDown=za=k=!1;Na(B,Wa?"touchend":"mouseup", +f)}function g(a){Ac(a);hb&&!va(a.pageX-hb.left-R,a.pageY-hb.top-L)&&e()}function h(){e();hb=null}var i,j,k,l,n=Fa?"":s.zoomType,p=/x/.test(n),v=/y/.test(n),t=p&&!W||v&&W,w=v&&!W||p&&W;if(!Pa)m.trackerGroup=Pa=J.g("tracker").attr({zIndex:9}).add();if(a.enabled)m.tooltip=Va=d(a),xb=setInterval(function(){kb&&kb()},32);(function(){H.onmousedown=function(a){a=b(a);!Wa&&a.preventDefault&&a.preventDefault();m.mouseIsDown=za=!0;m.cancelClick=!1;m.mouseDownX=i=a.chartX;j=a.chartY;ka(B,Wa?"touchend":"mouseup", +f)};var d=function(c){if(!c||!(c.touches&&c.touches.length>1)){c=b(c);if(!Wa)c.returnValue=!1;var d=c.chartX,e=c.chartY,f=!va(d-R,e-L);Wa&&c.type==="touchstart"&&(A(c.target,"isTracker")?m.runTrackerClick||c.preventDefault():!fb&&!f&&c.preventDefault());f&&(dR+ja&&(d=R+ja),eL+ha&&(e=L+ha));if(za&&c.type!=="touchstart"){if(k=Math.sqrt(Math.pow(i-d,2)+Math.pow(j-e,2)),k>10){var g=va(i-R,j-L);if(Mb&&(p||v)&&g)l||(l=J.rect(R,L,t?1:ja,w?1:ha,0).attr({fill:s.selectionMarkerFill||"rgba(69,114,167,0.25)", +zIndex:7}).add());l&&t&&(c=d-i,l.attr({width:ya(c),x:(c>0?0:c)+i}));l&&w&&(e-=j,l.attr({height:ya(e),y:(e>0?0:e)+j}));g&&!l&&s.panning&&m.pan(d)}}else if(!f){var h,d=m.hoverPoint,e=m.hoverSeries,n,o,g=qa,z=W?ha+L-c.chartY:c.chartX-R;if(Va&&a.shared&&(!e||!e.noSharedTooltip)){h=[];n=S.length;for(o=0;o +g&&h.splice(n,1);if(h.length&&h[0].plotX!==mb)Va.refresh(h),mb=h[0].plotX}if(e&&e.tracker&&(c=e.tooltipPoints[z])&&c!==d)c.onMouseOver()}return f||!Mb}};H.onmousemove=d;ka(H,"mouseleave",h);ka(B,"mousemove",g);H.ontouchstart=function(a){if(p||v)H.onmousedown(a);d(a)};H.ontouchmove=d;H.ontouchend=function(){k&&e()};H.onclick=function(a){var d=m.hoverPoint,a=b(a);a.cancelBubble=!0;if(!m.cancelClick)if(d&&(A(a.target,"isTracker")||A(a.target.parentNode,"isTracker"))){var e=d.plotX,f=d.plotY;N(d,{pageX:hb.left+ +R+(W?ja-f:e),pageY:hb.top+L+(W?ha-e:f)});aa(d.series,"click",N(a,{point:d}));d.firePointEvent("click",a)}else N(a,c(a)),va(a.chartX-R,a.chartY-L)&&aa(m,"click",a)}})();N(this,{zoomX:p,zoomY:v,resetTracker:e,normalizeMouseEvent:b,destroy:function(){if(m.trackerGroup)m.trackerGroup=Pa=m.trackerGroup.destroy();Na(H,"mouseleave",h);Na(B,"mousemove",g);H.onclick=H.onmousedown=H.onmousemove=H.ontouchstart=H.ontouchend=H.ontouchmove=null}})}function f(a){var b=a.type||s.type||s.defaultSeriesType,c=Ha[b], +d=m.hasRendered;if(d)if(W&&b==="column")c=Ha.bar;else if(!W&&b==="bar")c=Ha.column;b=new c;b.init(m,a);!d&&b.inverted&&(W=!0);if(b.isCartesian)Mb=b.isCartesian;S.push(b);return b}function g(){s.alignTicks!==!1&&o(ua,function(a){a.adjustTickAmount()});cb=null}function h(a){var b=m.isDirtyLegend,c,d=m.isDirtyBox,e=S.length,f=e,h=m.clipRect;for(Ib(a,m);f--;)if(a=S[f],a.isDirty&&a.options.stacking){c=!0;break}if(c)for(f=e;f--;)if(a=S[f],a.options.stacking)a.isDirty=!0;o(S,function(a){a.isDirty&&a.options.legendType=== +"point"&&(b=!0)});if(b&&oa.renderLegend)oa.renderLegend(),m.isDirtyLegend=!1;Mb&&(Da||(cb=null,o(ua,function(a){a.setScale()})),g(),Vb(),o(ua,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,aa(a,"afterSetExtremes",a.getExtremes());if(a.isDirty||d||c)a.redraw(),d=!0}));d&&(ob(),h&&(Nb(h),h.animate({width:m.plotSizeX,height:m.plotSizeY+1})));o(S,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});tb&&tb.resetTracker&&tb.resetTracker(!0);J.draw();aa(m,"redraw")}function i(){var a= +t.xAxis||{},b=t.yAxis||{},a=Fb(a);o(a,function(a,b){a.index=b;a.isX=!0});b=Fb(b);o(b,function(a,b){a.index=b});a=a.concat(b);o(a,function(a){new c(a)});g()}function k(){var a=Ba.lang,b=s.resetZoomButton,c=b.theme,d=c.states,e=b.relativeTo==="chart"?null:{x:R,y:L,width:ja,height:ha};m.resetZoomButton=J.button(a.resetZoom,null,null,zb,c,d&&d.hover).attr({align:b.position.align,title:a.resetZoomTitle}).add().align(b.position,!1,e)}function j(a,b){Qa=K(t.title,a);eb=K(t.subtitle,b);o([["title",a,Qa], +["subtitle",b,eb]],function(a){var b=a[0],c=m[b],d=a[1],a=a[2];c&&d&&(c=c.destroy());a&&a.text&&!c&&(m[b]=J.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":ib+b,zIndex:a.zIndex||4}).css(a.style).add().align(a,!1,Ia))})}function l(){function a(c){var d=s.width||la.offsetWidth,e=s.height||la.offsetHeight,c=c?c.target:U;if(d&&e&&(c===U||c===B)){if(d!==da||e!==ca)clearTimeout(b),b=setTimeout(function(){rb(d,e,!1)},100);da=d;ca=e}}var b;ka(U,"resize",a);ka(m,"destroy",function(){Na(U,"resize",a)})} +function n(){m&&aa(m,"endResize",null,function(){Da-=1})}function p(){for(var a=W||s.inverted||s.type==="bar"||s.defaultSeriesType==="bar",b=t.series,c=b&&b.length;!a&&c--;)b[c].type==="bar"&&(a=!0);m.inverted=W=a}function v(){var a=t.labels,b=t.credits,c;j();oa=m.legend=new Qb;o(ua,function(a){a.setScale()});Vb();cb=null;o(ua,function(a){a.setTickPositions(!0)});g();Vb();ob();Mb&&o(ua,function(a){a.render()});if(!m.seriesGroup)m.seriesGroup=J.g("series-group").attr({zIndex:3}).add();o(S,function(a){a.translate(); +a.setTooltipPoints();a.render()});a.items&&o(a.items,function(){var b=N(a.style,this.style),c=T(b.left)+R,d=T(b.top)+L+12;delete b.left;delete b.top;J.text(this.html,c,d).attr({zIndex:2}).css(b).add()});if(b.enabled&&!m.credits)c=b.href,m.credits=J.text(b.text,0,0).on("click",function(){if(c)location.href=c}).attr({align:b.position.align,zIndex:8}).css(b.style).add().align(b.position);m.hasRendered=!0}function Z(){if(!Ob&&U==U.top&&B.readyState!=="complete"||Fa&&!U.canvg)Fa?Bc.push(Z,t.global.canvasToolsURL): +B.attachEvent("onreadystatechange",function(){B.detachEvent("onreadystatechange",Z);B.readyState==="complete"&&Z()});else{la=s.renderTo;Aa=ib+lc++;yb(la)&&(la=B.getElementById(la));la||jc(13,!0);la.innerHTML="";la.offsetWidth||(E=la.cloneNode(0),Q(E,{position:ub,top:"-9999px",display:"block"}),B.body.appendChild(E));da=(E||la).offsetWidth;ca=(E||la).offsetHeight;m.chartWidth=qa=s.width||da||600;m.chartHeight=pa=s.height||(ca>19?ca:400);m.container=H=xa(Ea,{className:ib+"container"+(s.className?" "+ +s.className:""),id:Aa},N({position:mc,overflow:Za,width:qa+ga,height:pa+ga,textAlign:"left",lineHeight:"normal"},s.style),E||la);m.renderer=J=s.forExport?new Cb(H,qa,pa,!0):new Wb(H,qa,pa);Fa&&J.create(m,H,qa,pa);aa(m,"init");if(Highcharts.RangeSelector&&t.rangeSelector.enabled)m.rangeSelector=new Highcharts.RangeSelector(m);pb();qb();p();i();o(t.series||[],function(a){f(a)});if(Highcharts.Scroller&&(t.navigator.enabled||t.scrollbar.enabled))m.scroller=new Highcharts.Scroller(m);m.render=v;m.tracker= +tb=new e(t.tooltip);v();J.draw();b&&b.apply(m,[m]);o(m.callbacks,function(a){a.apply(m,[m])});E&&(la.appendChild(H),Sb(E));aa(m,"load")}}var t,w=a.series;a.series=null;t=K(Ba,a);t.series=a.series=w;var s=t.chart,w=s.margin,w=lb(w)?w:[w,w,w,w],Y=r(s.marginTop,w[0]),z=r(s.marginRight,w[1]),ia=r(s.marginBottom,w[2]),D=r(s.marginLeft,w[3]),jb=s.spacingTop,Db=s.spacingRight,$a=s.spacingBottom,y=s.spacingLeft,Ia,Qa,eb,L,M,$,R,ma,la,E,H,Aa,da,ca,qa,pa,Ya,Ra,wa,ba,Oa,Ca,m=this,fb=(w=s.events)&&!!w.click, +ra,va,Va,za,vb,sa,ab,ha,ja,tb,Pa,oa,Xa,wb,hb,Mb=s.showAxes,Da=0,ua=[],cb,S=[],W,J,kb,xb,mb,ob,Vb,pb,qb,rb,sb,zb,Qb=function(){function a(b,c){var d=b.legendItem,e=b.legendLine,g=b.legendSymbol,h=p.color,i=c?f.itemStyle.color:h,h=c?b.color:h;d&&d.css({fill:i});e&&e.attr({stroke:h});g&&g.attr({stroke:h,fill:h})}function b(a){var c=a.legendItem,d=a.legendLine,e=a._legendItemPos,f=e[0],e=e[1],g=a.legendSymbol,a=a.checkbox;c&&c.attr({x:v?f:Xa-f,y:e});d&&d.translate(v?f:Xa-f,e-4);g&&(c=f+g.xOff,g.attr({x:v? +c:Xa-c,y:e+g.yOff}));if(a)a.x=f,a.y=e}function c(){o(j,function(a){var b=a.checkbox,c=A.alignAttr;b&&Q(b,{left:c.translateX+a.legendItemWidth+b.x-40+ga,top:c.translateY+b.y-11+ga})})}function d(b){var c,e,j,k,m=b.legendItem;k=b.series||b;var q=k.options,o=q&&q.borderWidth||0;if(!m){k=/^(bar|pie|area|column)$/.test(k.type);b.legendItem=m=J.text(f.labelFormatter.call(b),0,0,f.useHTML).css(b.visible?l:p).on("mouseover",function(){b.setState(Ga);m.css(n)}).on("mouseout",function(){m.css(b.visible?l:p); +b.setState()}).on("click",function(){var a=function(){b.setVisible()};b.firePointEvent?b.firePointEvent("legendItemClick",null,a):aa(b,"legendItemClick",null,a)}).attr({align:v?"left":"right",zIndex:2}).add(A);if(!k&&q&&q.lineWidth){var Ia={"stroke-width":q.lineWidth,zIndex:2};if(q.dashStyle)Ia.dashstyle=q.dashStyle;b.legendLine=J.path([ta,(-h-i)*(v?1:-1),0,fa,-i*(v?1:-1),0]).attr(Ia).add(A)}if(k)j=J.rect(c=-h-i,e=-11,h,12,2).attr({zIndex:3}).add(A),v||(c+=h);else if(q&&q.marker&&q.marker.enabled)j= +q.marker.radius,j=J.symbol(b.symbol,c=-h/2-i-j,e=-4-j,2*j,2*j).attr(b.pointAttr[Ja]).attr({zIndex:3}).add(A),v||(c+=h/2);if(j)j.xOff=c+o%2/2,j.yOff=e+o%2/2;b.legendSymbol=j;a(b,b.visible);if(q&&q.showCheckbox)b.checkbox=xa("input",{type:"checkbox",checked:b.selected,defaultChecked:b.selected},f.itemCheckboxStyle,H),ka(b.checkbox,"click",function(a){aa(b,"checkboxClick",{checked:a.target.checked},function(){b.select()})})}c=m.getBBox();e=b.legendItemWidth=f.itemWidth||h+i+c.width+s;C=c.height;if(g&& +Y-r+e>(B||qa-2*s-r))Y=r,u+=t+C+w;!g&&u+f.y+C>pa-jb-$a&&(u=Z,Y+=z,z=0);z=X(z,e);ia=X(ia,u+w);b._legendItemPos=[Y,u];g?Y+=e:u+=t+C+w;E=B||X(Y-r+(g?0:e),E)}function e(){Y=r;u=Z;ia=E=0;A||(A=J.g("legend").attr({zIndex:7}).add());j=[];o(L,function(a){var b=a.options;b.showInLegend&&(j=j.concat(a.legendItems||(b.legendType==="point"?a.data:a)))});Mc(j,function(a,b){return(a.options.legendIndex||0)-(b.options.legendIndex||0)});M&&j.reverse();o(j,d);Xa=B||E;wb=ia-q+C;if(D||Qa){Xa+=2*s;wb+=2*s;if(y){if(Xa> +0&&wb>0)y[y.isNew?"attr":"animate"](y.crisp(null,null,null,Xa,wb)),y.isNew=!1}else y=J.rect(0,0,Xa,wb,f.borderRadius,D||0).attr({stroke:f.borderColor,"stroke-width":D||0,fill:Qa||Ka}).add(A).shadow(f.shadow),y.isNew=!0;y[j.length?"show":"hide"]()}o(j,b);for(var a=["left","right","top","bottom"],g,h=4;h--;)g=a[h],k[g]&&k[g]!=="auto"&&(f[h<2?"align":"verticalAlign"]=g,f[h<2?"x":"y"]=T(k[g])*(h%2?-1:1));j.length&&A.align(N(f,{width:Xa,height:wb}),!0,Ia);Da||c()}var f=m.options.legend;if(f.enabled){var g= +f.layout==="horizontal",h=f.symbolWidth,i=f.symbolPadding,j,k=f.style,l=f.itemStyle,n=f.itemHoverStyle,p=K(l,f.itemHiddenStyle),s=f.padding||T(k.padding),v=!f.rtl,t=f.itemMarginTop||0,w=f.itemMarginBottom||0,q=18,z=0,r=4+s+h+i,Z=s+t+q-5,Y,u,ia,C=0,y,D=f.borderWidth,Qa=f.backgroundColor,A,E,B=f.width,L=m.series,M=f.reversed;e();ka(m,"endResize",c);return{colorizeItem:a,destroyItem:function(a){var b=a.checkbox;o(["legendItem","legendLine","legendSymbol"],function(b){a[b]&&a[b].destroy()});b&&Sb(a.checkbox)}, +renderLegend:e,destroy:function(){y&&(y=y.destroy());A&&(A=A.destroy())}}}};va=function(a,b){return a>=0&&a<=ja&&b>=0&&b<=ha};zb=function(){var a=m.resetZoomButton;aa(m,"selection",{resetSelection:!0},sb);if(a)m.resetZoomButton=a.destroy()};sb=function(a){var b;m.resetZoomEnabled!==!1&&!m.resetZoomButton&&k();!a||a.resetSelection?o(ua,function(a){a.options.zoomEnabled!==!1&&(a.setExtremes(null,null,!1),b=!0)}):o(a.xAxis.concat(a.yAxis),function(a){var c=a.axis;if(m.tracker[c.isXAxis?"zoomX":"zoomY"])c.setExtremes(a.min, +a.max,!1),b=!0});b&&h(r(s.animation,m.pointCount<100))};m.pan=function(a){var b=m.xAxis[0],c=m.mouseDownX,d=b.pointRange/2,e=b.getExtremes(),f=b.translate(c-a,!0)+d,c=b.translate(c+ja-a,!0)-d;(d=m.hoverPoints)&&o(d,function(a){a.setState()});f>Ta(e.dataMin,e.min)&&c=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};y=Ya(ec,1,pb,1E3,Pa,6E4,za,36E5,Ra,864E5,oa,6048E5,sa,2592E6,ba,31556952E3);kb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h, +i,k=function(a){for(g=a.length;g--;)a[g]===ta&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(k(b),k(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
',pointFormat:'{series.name}: {point.y}
', +shadow:!0,shared:Fa,snap:Wa?25:10,style:{color:"#333333",fontSize:"12px",padding:"5px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"10px"}}};var Zb={dateTimeLabelFormats:Ya(ec,"%H:%M:%S.%L",pb,"%H:%M:%S",Pa,"%H:%M",za,"%H:%M",Ra,"%e. %b",oa,"%e. %b",sa,"%b '%y",ba,"%Y"),endOnTick:!1,gridLineColor:"#C0C0C0",labels:D,lineColor:"#C0D0E0",lineWidth:1, +max:null,min:null,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#6D869F",fontWeight:"bold"}},type:"linear"},kc=K(Zb,{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{align:"right",x:-8, +y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Y-values"},stackLabels:{enabled:!1,formatter:function(){return this.total},style:D.style}}),Pc={labels:{align:"right",x:-8,y:null},title:{rotation:270}},Oc={labels:{align:"left",x:8,y:null},title:{rotation:90}},yc={labels:{align:"center",x:0,y:14},title:{rotation:0}},Nc=K(yc,{labels:{y:-5,overflow:"justify"}}),Aa=Ba.plotOptions,D=Aa.line;Aa.spline=K(D);Aa.scatter=K(D,{lineWidth:0,states:{hover:{lineWidth:0}}, +tooltip:{headerFormat:'{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
"}});Aa.area=K(D,{threshold:0});Aa.areaspline=K(Aa.area);Aa.column=K(D,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{y:null,verticalAlign:null}, +threshold:0});Aa.bar=K(Aa.column,{dataLabels:{align:"left",x:5,y:null,verticalAlign:"middle"}});Aa.pie=K(D,{borderColor:"#FFFFFF",borderWidth:1,center:["50%","50%"],colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name},y:5},legendType:"point",marker:null,size:"75%",showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}}});wc();var Oa=function(a){var b=[],c;(function(a){(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))? +b=[T(c[1]),T(c[2]),T(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))&&(b=[T(c[1],16),T(c[2],16),T(c[3],16),1])})(a);return{get:function(c){return b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a},brighten:function(a){if(mb(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=T(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},setOpacity:function(a){b[3]=a;return this}}};fb.prototype={init:function(a,b){this.element= +b==="span"?xa(b):B.createElementNS("http://www.w3.org/2000/svg",b);this.renderer=a;this.attrSetters={}},animate:function(a,b,c){b=r(b,Tb,!0);Nb(this);if(b){b=K(b);if(c)b.complete=c;ac(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName,i=this.renderer,k,j=this.attrSetters,l=this.shadows,n,p=this;yb(a)&&u(b)&&(c=a,a={},a[c]=b);if(yb(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),p=A(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&& +(p=parseFloat(p));else for(c in a)if(k=!1,d=a[c],e=j[c]&&j[c](d,c),e!==!1){e!==V&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0"),this.d=d;else if(c==="x"&&h==="text"){for(e=0;en&&(Q(b,{width:n+ga,display:"block",whiteSpace:"normal"}),j=n),n=a.fontMetrics(b.style.fontSize).b,t=p<0&&-j,w=v<0&&-l,Z=p*v<0,t+=v*n*(Z?1-h:h),w-=p*n*(k?Z?h:1-h:1),i&&(t-=j* +h*(p<0?-1:1),k&&(w-=l*h*(v<0?-1:1)),Q(b,{textAlign:g})),this.xCorr=t,this.yCorr=w;Q(b,{left:e+t+ga,top:f+w+ga});this.cTT=s}}else this.alignOnAdd=!0},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.inverted,d=this.rotation,e=[];c&&(a+=this.attr("width"),b+=this.attr("height"));(a||b)&&e.push("translate("+a+","+b+")");c?e.push("rotate(90) scale(-1,1)"):d&&e.push("rotate("+d+" "+this.x+" "+this.y+")");e.length&&A(this.element,"transform",e.join(" "))},toFront:function(){var a= +this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){a?(this.alignOptions=a,this.alignByTranslate=b,c||this.renderer.alignedObjects.push(this)):(a=this.alignOptions,b=this.alignByTranslate);var c=r(c,this.renderer),d=a.align,e=a.verticalAlign,f=(c.x||0)+(a.x||0),g=(c.y||0)+(a.y||0),h={};/^(right|center)$/.test(d)&&(f+=(c.width-(a.width||0))/{right:1,center:2}[d]);h[b?"translateX":"x"]=C(f);/^(bottom|middle)$/.test(e)&&(g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1)); +h[b?"translateY":"y"]=C(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(a){var b,c,d=this.rotation;c=this.element;var e=d*Cc;if(c.namespaceURI==="http://www.w3.org/2000/svg"){try{b=c.getBBox?N({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(f){}if(!b||b.width<0)b={width:0,height:0};a=b.width;c=b.height;if(d)b.width=ya(c*ca(e))+ya(a*$(e)),b.height=ya(c*$(e))+ya(a*ca(e))}else b=this.htmlGetBBox(a);return b},show:function(){return this.attr({visibility:db})}, +hide:function(){return this.attr({visibility:Za})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=A(f,"zIndex"),h;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=T(g);if(c.handleZ)for(c=0;cg||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;aa(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)}, +destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.box,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=null;Nb(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f/g,'').replace(/<(i|em)>/g,'').replace(//g, +"").split(//g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=A(b,"x"),h=a.styles,i=h&&T(h.width),k=h&&h.lineHeight,j,h=d.length,l=[];h--;)b.removeChild(d[h]);i&&!a.added&&this.box.appendChild(b);c[c.length-1]===""&&c.pop();o(c,function(c,d){var h,r=0,t,c=c.replace(//g,"|||");h=c.split("|||");o(h,function(c){if(c!==""||h.length===1){var n={},o=B.createElementNS("http://www.w3.org/2000/svg","tspan");e.test(c)&&A(o,"style",c.match(e)[1].replace(/(;| |^)color([ :])/, +"$1fill$2"));f.test(c)&&(A(o,"onclick",'location.href="'+c.match(f)[1]+'"'),Q(o,{cursor:"pointer"}));c=(c.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");o.appendChild(B.createTextNode(c));r?n.dx=3:n.x=g;if(!r){if(d){!Ob&&a.renderer.forExport&&Q(o,{display:"block"});t=U.getComputedStyle&&T(U.getComputedStyle(j,null).getPropertyValue("line-height"));if(!t||isNaN(t)){var z;if(!(z=k))if(!(z=j.offsetHeight))l[d]=b.getBBox().height,z=C(l[d]-(l[d-1]||0))||18;t=z}A(o,"dy",t)}j= +o}A(o,n);b.appendChild(o);r++;if(i)for(var c=c.replace(/-/g,"- ").split(" "),u=[];c.length||u.length;)z=a.getBBox().width,n=z>i,!n||c.length===1?(c=u,u=[],c.length&&(o=B.createElementNS("http://www.w3.org/2000/svg","tspan"),A(o,{dy:k||16,x:g}),b.appendChild(o),z>i&&(i=z))):(o.removeChild(o.firstChild),u.unshift(c.pop())),c.length&&o.appendChild(B.createTextNode(c.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g){var h=this.label(a,b,c),i=0,k,j,l,n,p,a={x1:0,y1:0,x2:0,y2:1},e=K(Ya("stroke-width", +1,"stroke","#999","fill",Ya("linearGradient",a,"stops",[[0,"#FFF"],[1,"#DDD"]]),"r",3,"padding",3,"style",Ya("color","black")),e);l=e.style;delete e.style;f=K(e,Ya("stroke","#68A","fill",Ya("linearGradient",a,"stops",[[0,"#FFF"],[1,"#ACF"]])),f);n=f.style;delete f.style;g=K(e,Ya("stroke","#68A","fill",Ya("linearGradient",a,"stops",[[0,"#9BD"],[1,"#CDF"]])),g);p=g.style;delete g.style;ka(h.element,"mouseenter",function(){h.attr(f).css(n)});ka(h.element,"mouseleave",function(){k=[e,f,g][i];j=[l,n,p][i]; +h.attr(k).css(j)});h.setState=function(a){(i=a)?a===2&&h.attr(g).css(p):h.attr(e).css(l)};return h.on("click",function(){d.call(h)}).attr(e).css(N({cursor:"default"},l))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=C(a[1])+b%2/2);a[2]===a[5]&&(a[2]=a[5]=C(a[2])+b%2/2);return a},path:function(a){return this.createElement("path").attr({d:a,fill:Ka})},circle:function(a,b,c){a=lb(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(lb(a))b=a.y,c=a.r,d=a.innerR, +e=a.start,f=a.end,a=a.x;return this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){if(lb(a))b=a.y,c=a.width,d=a.height,e=a.r,f=a.strokeWidth,a=a.x;e=this.createElement("rect").attr({rx:e,ry:e,fill:Ka});return e.attr(e.crisp(f,a,b,X(c,0),X(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[r(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g"); +return u(a)?b.attr({"class":ib+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:Ka};arguments.length>1&&N(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(C(b),C(c),d,e,f),i=/^url\((.*?)\)$/,k,j;h?(g=this.path(h),N(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&N(g,f)):i.test(a)&& +(j=function(a,b){a.attr({width:b[0],height:b[1]});a.alignByTranslate||a.translate(-C(b[0]/2),-C(b[1]/2))},k=a.match(i)[1],a=Fc[k],g=this.image(k).attr({x:b,y:c}),a?j(g,a):(g.attr({width:0,height:0}),xa("img",{onload:function(){j(g,Fc[k]=[this.width,this.height])},src:k})));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return[ta,a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return[ta,a,b,fa,a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a, +b,c,d){return[ta,a+c/2,b,fa,a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return[ta,a,b,fa,a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return[ta,a+c/2,b,fa,a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-1.0E-6,d=e.innerR,h=$(f),i=ca(f),k=$(g),g=ca(g),e=e.end-f');if(b)c=b===Ea||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element= +xa(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);ab&&d.gVis===Za&&Q(c,{visibility:Za});d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();aa(this,"add");return this},toggleChildren:function(a,b){for(var c=a.childNodes,d=c.length;d--;)Q(c[d],{visibility:b}),c[d].nodeName==="DIV"&&this.toggleChildren(c[d],b)},updateTransform:fb.prototype.htmlUpdateTransform, +attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,k=this.symbolName,j,l=this.shadows,n,p=this.attrSetters,o=this;yb(a)&&u(b)&&(c=a,a={},a[c]=b);if(yb(a))c=a,o=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d=a[c],n=!1,e=p[c]&&p[c](d,c),e!==!1&&d!==null){e!==V&&(d=e);if(k&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))j||(this.symbolAttr(a),j=!0),n=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");e=d.length;for(n= +[];e--;)n[e]=mb(d[e])?C(d[e]*10)-5:d[e]==="Z"?"x":d[e];d=n.join(" ")||"x";f.path=d;if(l)for(e=l.length;e--;)l[e].path=d;n=!0}else if(c==="zIndex"||c==="visibility"){if(ab&&c==="visibility"&&h==="DIV")f.gVis=d,this.toggleChildren(f,d),d===db&&(d=null);d&&(g[c]=d);n=!0}else if(c==="width"||c==="height")d=X(0,d),this[c]=d,this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,n=!0;else if(c==="x"||c==="y")this[c]=d,g[{x:"left",y:"top"}[c]]=d;else if(c==="class")f.className=d;else if(c==="stroke")d= +i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,mb(d)&&(d+=ga);else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||xa(i.prepVML([""]),null,null,f))[c]=d||"solid",this.dashstyle=d,n=!0;else if(c==="fill")h==="SPAN"?g.color=d:(f.filled=d!==Ka?!0:!1,d=i.color(d,f,c),c="fillcolor");else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),n=!0;else if(c==="text")this.bBox=null, +f.innerHTML=d,n=!0;if(l&&c==="visibility")for(e=l.length;e--;)l[e].style[c]=d;n||(ab?f[c]=d:A(f,c,d))}return o},clip:function(a){var b=this,c=a.members,d=b.element;c.push(b);b.destroyClip=function(){Eb(c,b)};d.parentNode.className==="highcharts-tracker"&&!ab&&Q(d,{visibility:Za});return b.css(a.getCSS(b.inverted))},css:fb.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Sb(a)},destroy:function(){this.destroyClip&&this.destroyClip();return fb.prototype.destroy.apply(this)},empty:function(){for(var a= +this.element.childNodes,b=a.length,c;b--;)c=a[b],c.parentNode.removeChild(c)},on:function(a,b){this.element["on"+a]=function(){var a=U.event;a.target=a.srcElement;b(a)};return this},shadow:function(a,b){var c=[],d,e=this.element,f=this.renderer,g,h=e.style,i,k=e.path;k&&typeof k.value!=="string"&&(k="x");if(a){for(d=1;d<=3;d++)i=[''],g=xa(f.prepVML(i),null,{left:T(h.left)+ +1,top:T(h.top)+1}),i=[''],xa(f.prepVML(i),null,null,g),b?b.element.appendChild(g):e.parentNode.insertBefore(g,e),c.push(g);this.shadows=c}return this}},wa=da(fb,wa),D={Element:wa,isIE8:va.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position=mc;a.appendChild(d.element);this.box=e;this.boxWrapper=d;this.setSize(b,c,!1);if(!B.namespaces.hcv)B.namespaces.add("hcv","urn:schemas-microsoft-com:vml"), +B.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "},clipRect:function(a,b,c,d){var e=this.createElement();return N(e,{members:[],left:a,top:b,width:c,height:d,getCSS:function(a){var b=this.top,c=this.left,d=c+this.width,e=b+this.height,b={clip:"rect("+C(a?c:b)+"px,"+C(a?e:d)+"px,"+C(a?d:e)+"px,"+C(a?b:c)+"px)"};!a&&ab&&N(b,{width:d+ga,height:e+ga});return b},updateClipping:function(){o(e.members,function(a){a.css(e.getCSS(a.inverted))})}})}, +color:function(a,b,c){var d,e=/^rgba/;if(a&&a.linearGradient){var f,g,h=a.linearGradient,i=h.x1||h[0]||0,k=h.y1||h[1]||0,j=h.x2||h[2]||0,h=h.y2||h[3]||0,l,n,p,r;o(a.stops,function(a,b){e.test(a[1])?(d=Oa(a[1]),f=d.get("rgb"),g=d.get("a")):(f=a[1],g=1);b?(p=f,r=g):(l=f,n=g)});if(c==="fill")a=90-na.atan((h-k)/(j-i))*180/ra,a=[''],xa(this.prepVML(a),null,null,b);else return f}else if(e.test(a)&& +b.tagName!=="IMG")return d=Oa(a),a=["<",c,' opacity="',d.get("a"),'"/>'],xa(this.prepVML(a),null,null,b),d.get("rgb");else{b=b.getElementsByTagName(c);if(b.length)b[0].opacity=1;return a}},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<", +"1&&f.css({left:b,top:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(lb(a))b=a.y,c= +a.width,d=a.height,f=a.strokeWidth,a=a.x;var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,X(c,0),X(d,0)))},invertChild:function(a,b){var c=b.style;Q(a,{flip:"x",left:T(c.width)-10,top:T(c.height)-10,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,c=e.r||c||d,d=$(f),h=ca(f),i=$(g),k=ca(g),e=e.innerR,j=0.08/c,l=e&&0.25/e||0;if(g-f===0)return["x"];else 2*ra-g+fa+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=a.data;a.data=null;c=K(c[this.type],c.series,a);c.data=a.data=d;this.tooltipOptions=K(b.tooltip,c.tooltip);return c},getColor:function(){var a=this.chart.options.colors,b=this.chart.counters;this.color=this.options.color||a[b.color++]||"#0000ff";b.wrapColor(a.length)},getSymbol:function(){var a=this.options.marker,b=this.chart,c=b.options.symbols, +b=b.counters;this.symbol=a.symbol||c[b.symbol++];if(/^url/.test(this.symbol))a.radius=0;b.wrapSymbol(c.length)},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,h=this.chart,i=this.xData,k=this.yData,j=f&&f.shift||0,l=this.options.data;Ib(d,h);if(f&&c)f.shift=j+1;if(g){if(c)g.shift=j+1;g.isArea=!0}b=r(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);i.push(d.x);k.push(this.valueCount===4?[d.open,d.high,d.low,d.close]:d.y);l.push(a);c&&(e[0]&&e[0].remove? +e[0].remove(!1):(e.shift(),i.shift(),k.shift(),l.shift()));this.getAttribs();this.isDirtyData=this.isDirty=!0;b&&h.redraw()},setData:function(a,b){var c=this.points,d=this.options,e=this.initialColor,f=this.chart,g=null,h=this.xAxis;this.xIncrement=null;this.pointRange=h&&h.categories&&1||d.pointRange;if(u(e))f.counters.color=e;var i=[],k=[],j=a?a.length:[],l=this.valueCount===4;if(j>(d.turboThreshold||1E3)){for(e=0;g===null&&ej||this.forceCrop))if(a=i.getExtremes(),i=a.min, +j=a.max,b[d-1]j)b=[],c=[];else if(b[0]j){for(a=0;a=i){e=X(0,a-1);break}for(;aj){f=a+1;break}b=b.slice(e,f);c=c.slice(e,f);g=!0}for(a=b.length-1;a>0;a--)if(d=b[a]-b[a-1],d>0&&(h===V||d0||k)g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(this.group)},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{}, +b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=r(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=Aa[a.type].marker?a.options.marker:a.options,c=b.states,d=c[Ga],e,f=a.color,g={stroke:f,fill:f},h=a.points,i=[],k,j=a.pointAttrToOptions,l;a.options.marker?(d.radius=d.radius||b.radius+2,d.lineWidth=d.lineWidth||b.lineWidth+1):d.color=d.color||Oa(d.color||f).brighten(d.brightness).get();i[Ja]=a.convertAttribs(b,g);o([Ga,"select"],function(b){i[b]=a.convertAttribs(c[b],i[Ja])});a.pointAttr= +i;for(f=h.length;f--;){g=h[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===!1)b.radius=0;e=!1;if(g.options)for(l in j)u(b[j[l]])&&(e=!0);if(e){k=[];c=b.states||{};e=c[Ga]=c[Ga]||{};if(!a.options.marker)e.color=Oa(e.color||g.options.color).brighten(e.brightness||d.brightness).get();k[Ja]=a.convertAttribs(b,i[Ja]);k[Ga]=a.convertAttribs(c[Ga],i[Ga],k[Ja]);k.select=a.convertAttribs(c.select,i.select,k[Ja])}else k=i;g.pointAttr=k}},destroy:function(){var a=this,b=a.chart,c=a.clipRect,d= +/AppleWebKit\/533/.test(va),e,f,g=a.data||[],h,i,k;aa(a,"destroy");Na(a);o(["xAxis","yAxis"],function(b){if(k=a[b])Eb(k.series,a),k.isDirty=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(f=g.length;f--;)(h=g[f])&&h.destroy&&h.destroy();a.points=null;if(c&&c!==b.clipRect)a.clipRect=c.destroy();o(["area","graph","dataLabelsGroup","group","tracker"],function(b){a[b]&&(e=d&&b==="group"?"hide":"destroy",a[b][e]())});if(b.hoverSeries===a)b.hoverSeries=null;Eb(b.series,a);for(i in a)delete a[i]},drawDataLabels:function(){var a= +this,b=a.options,c=b.dataLabels;if(c.enabled||a._hasPointLabels){var d,e,f=a.points,g,h,i,k=a.dataLabelsGroup,j=a.chart,l=a.xAxis,l=l?l.left:j.plotLeft,n=a.yAxis,n=n?n.top:j.plotTop,p=j.renderer,v=j.inverted,y=a.type,t=b.stacking,w=y==="column"||y==="bar",s=c.verticalAlign===null,Y=c.y===null,z=p.fontMetrics(c.style.fontSize),A=z.h,D=z.b,E,B;w&&(z={top:D,middle:D-A/2,bottom:-A+D},t?(s&&(c=K(c,{verticalAlign:"middle"})),Y&&(c=K(c,{y:z[c.verticalAlign]}))):s?c=K(c,{verticalAlign:"top"}):Y&&(c=K(c,{y:z[c.verticalAlign]}))); +k?k.translate(l,n):k=a.dataLabelsGroup=p.g("data-labels").attr({visibility:a.visible?db:Za,zIndex:6}).translate(l,n).add();h=c;o(f,function(f){E=f.dataLabel;c=h;(g=f.options)&&g.dataLabels&&(c=K(c,g.dataLabels));if(B=c.enabled){var l=f.barX&&f.barX+f.barW/2||r(f.plotX,-999),n=r(f.plotY,-999),o=c.y===null?f.y>=b.threshold?-A+D:D:c.y;d=(v?j.plotWidth-n:l)+c.x;e=C((v?j.plotHeight-l:n)+o)}if(E&&a.isCartesian&&(!j.isInsidePlot(d,e)||!B))f.dataLabel=E.destroy();else if(B){l=c.align;i=c.formatter.call(f.getLabelConfig(), +c);y==="column"&&(d+={left:-1,right:1}[l]*f.barW/2||0);!t&&v&&f.y<0&&(l="right",d-=10);c.style.color=r(c.color,c.style.color,a.color,"black");if(E)E.attr({text:i}).animate({x:d,y:e});else if(u(i))E=f.dataLabel=p[c.rotation?"text":"label"](i,d,e,null,null,null,c.useHTML,!0).attr({align:l,fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":c.borderWidth,r:c.borderRadius||0,rotation:c.rotation,padding:c.padding,zIndex:1}).css(c.style).add(k).shadow(c.shadow);if(w&&b.stacking&&E)l=f.barX,n=f.barY, +o=f.barW,f=f.barH,E.align(c,null,{x:v?j.plotWidth-n-f:l,y:v?j.plotHeight-l-o:n,width:v?f:o,height:v?o:f})}})}},drawGraph:function(){var a=this,b=a.options,c=a.graph,d=[],e,f=a.area,g=a.group,h=b.lineColor||a.color,i=b.lineWidth,k=b.dashStyle,j,l=a.chart.renderer,n=a.yAxis.getThreshold(b.threshold),p=/^area/.test(a.type),v=[],u=[];o(a.segments,function(c){j=[];o(c,function(d,e){a.getPointSpline?j.push.apply(j,a.getPointSpline(c,d,e)):(j.push(e?fa:ta),e&&b.step&&j.push(d.plotX,c[e-1].plotY),j.push(d.plotX, +d.plotY))});c.length>1?d=d.concat(j):v.push(c[0]);if(p){var e=[],f,g=j.length;for(f=0;f=0;f--)fa&&i>e?(i=X(a,e),j=2*e-i):ig&&j>e?(j=X(g,e),i=2*e-j):js?g-s:w-(f<=w?s:0));N(b,{barX:h,barY:i,barW:y,barH:j});b.shapeType="rect";f={x:h,y:i,width:y,height:j,r:c.borderRadius,strokeWidth:e};e%2&&(f.y-=1,f.height+=1);b.shapeArgs=f;b.trackerArgs=ya(j)<3&&K(b.shapeArgs,{height:6,y:i-3})})},getSymbol:function(){},drawGraph:function(){},drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e;o(a.points, +function(f){var g=f.plotY;if(g!==V&&!isNaN(g)&&f.y!==null)d=f.graphic,e=f.shapeArgs,d?(Nb(d),d.animate(c.Element.prototype.crisp.apply({},[e.strokeWidth,e.x,e.y,e.width,e.height]))):f.graphic=d=c[f.shapeType](e).attr(f.pointAttr[f.selected?"select":Ja]).add(a.group).shadow(b.shadow)})},drawTracker:function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options,h=g.cursor,i=h&&{cursor:h},k=a.drawTrackerGroup(),j,l,n;o(a.points,function(h){e=h.tracker;d=h.trackerArgs||h.shapeArgs;l=h.plotY; +n=!a.isCartesian||l!==V&&!isNaN(l);delete d.strokeWidth;if(h.y!==null&&n)e?e.attr(d):h.tracker=c[h.shapeType](d).attr({isTracker:f,fill:Gc,visibility:a.visible?db:Za}).on(Wa?"touchstart":"mouseover",function(c){j=c.relatedTarget||c.fromElement;if(b.hoverSeries!==a&&A(j,"isTracker")!==f)a.onMouseOver();h.onMouseOver()}).on("mouseout",function(b){if(!g.stickyTracking&&(j=b.relatedTarget||b.toElement,A(j,"isTracker")!==f))a.onMouseOut()}).css(i).add(h.group||k)})},animate:function(a){var b=this,c=b.points, +d=b.options;if(!a)o(c,function(a){var c=a.graphic,a=a.shapeArgs,g=b.yAxis,h=d.threshold;c&&(c.attr({height:0,y:u(h)?g.getThreshold(h):g.translate(g.getExtremes().min,0,1,0,1)}),c.animate({height:a.height,y:a.y},d.animation))}),b.animate=null},remove:function(){var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0});M.prototype.remove.apply(a,arguments)}});Ha.column=Qb;D=da(Qb,{type:"bar",init:function(){this.inverted=!0;Qb.prototype.init.apply(this,arguments)}}); +Ha.bar=D;D=da(M,{type:"scatter",sorted:!1,translate:function(){var a=this;M.prototype.translate.apply(a);o(a.points,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){for(var a=this,b=a.options.cursor,b=b&&{cursor:b},c=a.points,d=c.length,e;d--;)if(e=c[d].graphic)e.element._i=d;a._hasTracking?a._hasTracking=!0:a.group.attr({isTracker:!0}).on(Wa?"touchstart":"mouseover",function(b){a.onMouseOver();if(b.target._i!==V)c[b.target._i].onMouseOver()}).on("mouseout", +function(){if(!a.options.stickyTracking)a.onMouseOut()}).css(b)}});Ha.scatter=D;D=da(xb,{init:function(){xb.prototype.init.apply(this,arguments);var a=this,b;N(a,{visible:a.visible!==!1,name:r(a.name,"Slice")});b=function(){a.slice()};ka(a,"select",b);ka(a,"unselect",b);return a},setVisible:function(a){var b=this.series.chart,c=this.tracker,d=this.dataLabel,e=this.connector,f=this.shadowGroup,g;g=(this.visible=a=a===V?!this.visible:a)?"show":"hide";this.group[g]();if(c)c[g]();if(d)d[g]();if(e)e[g](); +if(f)f[g]();this.legendItem&&b.legend.colorizeItem(this,a)},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;Ib(c,d);r(b,!0);a=this.sliced=u(a)?a:!this.sliced;a={translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop};this.group.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}});D=da(M,{type:"pie",isCartesian:!1,pointClass:D,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor=this.chart.counters.color}, +animate:function(){var a=this;o(a.points,function(b){var c=b.graphic,b=b.shapeArgs,d=-ra/2;c&&(c.attr({r:0,start:d,end:d}),c.animate({r:b.r,start:b.start,end:b.end},a.options.animation))});a.animate=null},setData:function(a,b){M.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();r(b,!0)&&this.chart.redraw()},translate:function(){this.generatePoints();var a=0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f=c.center.concat([c.size,c.innerSize||0]),g=this.chart,h= +g.plotWidth,i=g.plotHeight,k,j,l,n=this.points,p=2*ra,r,u=Ta(h,i),t,w,s,y=c.dataLabels.distance,f=Ub(f,function(a,b){return(t=/%$/.test(a))?[h,i,u,u][b]*T(a)/100:a});this.getX=function(a,b){l=na.asin((a-f[1])/(f[2]/2+y));return f[0]+(b?-1:1)*$(l)*(f[2]/2+y)};this.center=f;o(n,function(b){a+=b.y});o(n,function(c){r=a?c.y/a:0;k=C(b*p*1E3)/1E3;b+=r;j=C(b*p*1E3)/1E3;c.shapeType="arc";c.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:k,end:j};l=(j+k)/2;c.slicedTranslation=Ub([$(l)*d+g.plotLeft,ca(l)* +d+g.plotTop],C);w=$(l)*f[2]/2;s=ca(l)*f[2]/2;c.tooltipPos=[f[0]+w*0.7,f[1]+s*0.7];c.labelPos=[f[0]+w+$(l)*y,f[1]+s+ca(l)*y,f[0]+w+$(l)*e,f[1]+s+ca(l)*e,f[0]+w,f[1]+s,y<0?"center":l

0,v=[[],[]],u,t,w,s,y=2,z;if(d.enabled){M.prototype.drawDataLabels.apply(this);o(a,function(a){a.dataLabel&&v[a.labelPos[7]0){for(z=n-l-k;z<=n+ +l+k;z+=a)A.push(z);w=A.length;if(C>w){h=[].concat(D);h.sort(s);for(z=C;z--;)h[z].rank=z;for(z=C;z--;)D[z].rank>=w&&D.splice(z,1);C=D.length}for(z=0;z0){if(t=E.pop(),B=t.i,t=t.y,u>t&&A[B+1]!==null||u3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+Ga(a-c).toFixed(f).slice(2):"")} +function nb(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function nc(a,b,c,d){var e,c=r(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d=K[ob]&&(j.setMilliseconds(0),j.setSeconds(b>=K[cb]?0:k*La(j.getSeconds()/k)));if(b>=K[cb])j[Ac](b>=K[db]?0:k*La(j[oc]()/k));if(b>=K[db])j[Bc](b>=K[P]?0:k*La(j[pc]()/k));if(b>=K[P])j[qc](b>=K[pa]?1:k*La(j[eb]()/k));b>=K[pa]&& +(j[Cc](b>=K[fa]?0:k*La(j[ac]()/k)),h=j[bc]());b>=K[fa]&&(h-=h%k,j[Dc](h));if(b===K[Ca])j[qc](j[eb]()-j[rc]()+r(d,1));d=1;h=j[bc]();for(var i=j.getTime(),m=j[ac](),j=j[eb]();ic+e&&(j-=j+a-(c+e),i=g-b+d-h,m=!0);i=i&&g<=i+b&&(i=g+d+h)):i+b>d+f&&(i=d+f-b-h);return{x:j,y:i}}function Xc(a,b){var c=a.length,d,e;for(e=0;ec&&(c=a[b]);return c}function Ab(a){for(var b in a)a[b]&&a[b].destroy&&a[b].destroy(), +delete a[b]}function Nb(a){dc||(dc=da(sb));a&&dc.appendChild(a);dc.innerHTML=""}function sc(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else ba.console&&console.log(c)}function Jb(a){return parseFloat(a.toPrecision(14))}function Ob(a,b){Vb=r(a,b.animation)}function Gc(){var a=ja.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";cc=a?Date.UTC:function(a,b,c,g,h,j){return(new Date(a,b,r(c,1),r(g,0),r(h,0),r(j,0))).getTime()};oc=b+"Minutes";pc=b+"Hours";rc=b+"Day"; +eb=b+"Date";ac=b+"Month";bc=b+"FullYear";Ac=c+"Minutes";Bc=c+"Hours";qc=c+"Date";Cc=c+"Month";Dc=c+"FullYear"}function Qa(){}function ec(a,b){function c(a){function b(a,c){this.pos=a;this.type=c||"";this.isNew=!0;c||this.addLabel()}function c(a){if(a)this.options=a,this.id=a.id;return this}function d(a,b,c,e){this.isNegative=b;this.options=a;this.x=c;this.stack=e;this.alignOptions={align:a.align||(ha?b?"left":"right":"center"),verticalAlign:a.verticalAlign||(ha?"middle":b?"bottom":"top"),y:r(a.y, +ha?4:b?14:-6),x:r(a.x,ha?b?-6:6:0)};this.textAlign=a.textAlign||(ha?b?"right":"left":"center")}function e(){var a=[],b=[],c;C=R=null;q(E.series,function(e){if(e.visible||!p.ignoreHiddenSeries){var f=e.options,g,h,j,i,k,m,l,n,y,v=f.threshold,Da,t=[],q=0;if(ga&&v<=0)v=f.threshold=null;if(o)f=e.xData,f.length&&(C=wa(r(C,f[0]),Mb(f)),R=O(r(R,f[0]),Ib(f)));else{var u,fc,s,Y=e.cropped,E=e.xAxis.getExtremes(),Yc=!!e.modifyValue;g=f.stacking;sa=g==="percent";if(g)k=f.stack,i=e.type+r(k,""),m="-"+i,e.stackKey= +i,h=a[i]||[],a[i]=h,j=b[m]||[],b[m]=j;sa&&(C=0,R=99);f=e.processedXData;l=e.processedYData;Da=l.length;for(c=0;c=E.min&&(f[c-1]||n)<=E.max))if(n=y.length)for(;n--;)y[n]!==null&&(t[q++]=y[n]);else t[q++]=y;!sa&&t.length&&(C=wa(r(C,t[0]),Mb(t)),R=O(r(R,t[0]),Ib(t)));A(v)&&(C>=v? +(C=v,Qb=!0):R=0.5)a=x(a),e=f(a,b,c);else if(a>=0.08){var h=La(b),j,i,k,m,l,n;for(j=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];hb&&e.push(l),l>c&&(n=!0),l=m}}else if(b=bb(b),c=bb(c),a=z[d?"minorTickInterval":"tickInterval"], +a=r(a==="auto"?null:a,E._minorAutoInterval,(c-b)*(z.tickPixelInterval/(d?5:1))/((d?M/ca.length:M)||1)),a=nc(a,null,va.pow(10,La(va.log(a)/va.LN10))),e=Kb(f(a,b,c),yb),!d)E._minorAutoInterval=a/5;d||(Oa=a);return e}function h(){var a=[],b,c;if(ga){c=ca.length;for(b=1;b=Va,c,d,e,f,g,h;o&&Va===D&&!ga&&(A(z.min)||A(z.max)?Va=null:(q(E.series,function(a){f=a.xData;for(d=g=a.xIncrement? +1:f.length-1;d>0;d--)if(e=f[d]-f[d-1],c===D||e0||!Mc))Q+=b*Wa}Oa=L===Q||L===void 0||Q===void 0?1:ea&&!c&&d===ba.options.tickPixelInterval?ba.tickInterval:r(c,Ta?1:(Q-L)*d/(M||1));o&&!a&&q(E.series,function(a){a.processData(L!==V||Q!==da)});J();E.beforeSetTickPositions&&E.beforeSetTickPositions();E.postProcessTickInterval&&(Oa=E.postProcessTickInterval(Oa));!Y&&!ga&&(Jc=va.pow(10,La(va.log(Oa)/ +va.LN10)),A(z.tickInterval)||(Oa=nc(Oa,null,Jc,z)));E.tickInterval=Oa;pa=z.minorTickInterval==="auto"&&Oa?Oa/5:z.minorTickInterval;(ca=z.tickPositions||vb&&vb.apply(E,[L,Q]))||(ca=Y?(E.getNonLinearTimeTicks||$b)(zc(Oa,z.units),L,Q,z.startOfWeek,E.ordinalPositions,E.closestPointRange,!0):ga?g(Oa,L,Q):f(Oa,L,Q));if(!ea&&(a=ca[0],c=ca[ca.length-1],z.startOnTick?L=a:L>a&&ca.shift(),z.endOnTick?Q=c:Qpb[qa]&&z.alignTicks!==!1))pb[qa]=ca.length}function k(a){a= +(new c(a)).render();za.push(a);return a}function m(){var a=z.title,d=z.stackLabels,e=z.alternateGridColor,f=z.lineWidth,g,j,i=n.hasRendered&&A(V)&&!isNaN(V),l=(g=E.series.length&&A(L)&&A(Q))||r(z.showEmpty,!0),o,p;if(g||ea)if(pa&&!Ta&&q(h(),function(a){Ma[a]||(Ma[a]=new b(a,"minor"));i&&Ma[a].isNew&&Ma[a].render(null,!0);Ma[a].isActive=!0;Ma[a].render()}),q(ca.slice(1).concat([ca[0]]),function(a,c){c=c===ca.length-1?0:c+1;if(!ea||a>=L&&a<=Q)Pa[a]||(Pa[a]=new b(a)),i&&Pa[a].isNew&&Pa[a].render(c,!0), +Pa[a].isActive=!0,Pa[a].render(c)}),e&&q(ca,function(a,b){if(b%2===0&&a=1E3?Zb(a,0):a},Ya=y&&z.labels.staggerLines,oa=z.reversed,Ca=Ta&&z.tickmarkPlacement==="between"?0.5:0;b.prototype={addLabel:function(){var a=this.pos,b=z.labels,c=Ta&&y&&Ta.length&&!b.step&&!b.staggerLines&&!b.rotation&&Aa/Ta.length||!y&&Aa/2,d=a===ca[0],e=a===ca[ca.length-1],f=Ta&& +A(Ta[a])?Ta[a]:a,g=this.label,h=ca.info,j;Y&&h&&(j=z.dateTimeLabelFormats[h.higherRanks[a]||h.unitName]);this.isFirst=d;this.isLast=e;a=Qa.call({axis:E,chart:n,isFirst:d,isLast:e,dateTimeLabelFormat:j,value:ga?Jb(bb(f)):f});c=c&&{width:O(1,x(c-2*(b.padding||10)))+la};c=G(c,b.style);A(g)?g&&g.attr({text:a}).css(c):this.label=A(a)&&b.enabled?T.text(a,0,0,b.useHTML).attr({align:b.align,rotation:b.rotation}).css(c).add(Za):null},getLabelSize:function(){var a=this.label;return a?(this.labelBBox=a.getBBox())[y? +"height":"width"]:0},getLabelSides:function(){var a=z.labels,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.align]-a.x;return[-a,b-a]},handleOverflow:function(a){var b=!0,c=this.isFirst,d=this.isLast,e=this.label,f=e.x;if(c||d){var g=this.getLabelSides(),h=g[0],g=g[1],j=n.plotLeft,i=j+E.len,k=(a=Pa[ca[a+(c?1:-1)]])&&a.label.x+a.getLabelSides()[c?0:1];c&&!oa||d&&oa?f+hk&&(b=!1)):f+g>i&&(f=i-g,a&&f+h0&&qb>0){d=I({align:y&&i&&"center",x:y?!i&&4:10,verticalAlign:!y&&i&&"middle",y:y?i?16:10:i?6:-4,rotation:y&&!i&&90},d);if(!e)a.label=e=T.text(d.text,0,0).attr({align:d.textAlign||d.align, +rotation:d.rotation,zIndex:p}).css(d.style).add();i=[m[1],m[4],r(m[6],m[1])];m=[m[2],m[5],r(m[7],m[2])];n=Mb(i);p=Mb(m);e.align(d,!1,{x:n,y:p,width:Ib(i)-n,height:Ib(m)-p});e.show()}else e&&e.hide();return a},destroy:function(){Ab(this);Lb(za,this)}};d.prototype={destroy:function(){Ab(this)},setTotal:function(a){this.cum=this.total=a},render:function(a){var b=this.options.formatter.call(this);this.label?this.label.attr({text:b,visibility:Xa}):this.label=n.renderer.text(b,0,0).css(this.options.style).attr({align:this.textAlign, +rotation:this.options.rotation,visibility:Xa}).add(a)},setOffset:function(a,b){var c=this.isNegative,d=E.translate(this.total,0,0,0,1),e=E.translate(0),e=Ga(d-e),f=n.xAxis[0].translate(this.x)+a,g=n.plotHeight,c={x:ha?c?d:d-e:f,y:ha?g-f-b:c?g-d-e:g-d,width:ha?e:b,height:ha?b:e};this.label&&this.label.align(this.alignOptions,null,c).attr({visibility:$a})}};Pb=function(a,b,c,d,e){var f=1,g=0,h=d?ib:Ua,d=d?V:L,e=z.ordinal||ga&&e;h||(h=Ua);c&&(f*=-1,g=M);oa&&(f*=-1,g-=f*M);b?(oa&&(a=M-a),a=a/h+d,e&&(a= +E.lin2val(a))):(e&&(a=E.val2lin(a)),a=f*(a-d)*h+g+f*ta);return a};S=function(a,b,c){var d,e,f,a=Pb(a,null,null,c),g=c&&Ja||xa,h=c&&Na||Ea,j,c=e=x(a+N);d=f=x(g-a-N);if(isNaN(a))j=!0;else if(y){if(d=w,f=g-Fb,cna+H)j=!0}else if(c=na,e=h-K,dw+qb)j=!0;return j?null:T.crispLine([ya,c,d,ka,e,f],b||0)};J=function(){var a=Q-L,b=0,c,d;if(o)ea?b=ba.pointRange:q(E.series,function(a){b=O(b,a.pointRange);d=a.closestPointRange;!a.noSharedTooltip&&A(d)&&(c=A(c)?wa(c,d):d)}),E.pointRange=b,E.closestPointRange= +c;ib=Ua;E.translationSlope=Ua=M/(a+b||1);N=y?na:Fb;ta=Ua*(b/2)};Ha.push(E);n[o?"xAxis":"yAxis"].push(E);ha&&o&&oa===D&&(oa=!0);G(E,{addPlotBand:k,addPlotLine:k,adjustTickAmount:function(){if(pb&&pb[qa]&&!Y&&!Ta&&!ea&&z.alignTicks!==!1){var a=Sa,b=ca.length;Sa=pb[qa];if(ba||a===null?a=b:c1||Ga(b-p)>1?function(){c(a,b)}:null}function d(){if(!m){var a=n.hoverPoints;o.hide();a&&q(a,function(a){a.setState()});n.hoverPoints=null;m=!0}}var e,f=a.borderWidth,g=a.crosshairs,h=[],j=a.style,i=a.shared,k=Z(j.padding),m=!0,l=0,p=0;j.padding= +0;var o=T.label("",0,0,null,null,null,a.useHTML).attr({padding:k,fill:a.backgroundColor,"stroke-width":f,r:a.borderRadius,zIndex:8}).css(j).hide().add();rb||o.shadow(a.shadow);return{shared:i,refresh:function(f){var j,k,l,p,y={},v=[];l=f.tooltipPos;j=a.formatter||b;var y=n.hoverPoints,t;i&&(!f.series||!f.series.noSharedTooltip)?(p=0,y&&q(y,function(a){a.setState()}),n.hoverPoints=f,q(f,function(a){a.setState(fb);p+=a.plotY;v.push(a.getLabelConfig())}),k=f[0].plotX,p=x(p)/f.length,y={x:f[0].category}, +y.points=v,f=f[0]):y=f.getLabelConfig();y=j.call(y);e=f.series;k=r(k,f.plotX);p=r(p,f.plotY);j=x(l?l[0]:ha?Aa-p:k);k=x(l?l[1]:ha?Ba-k:p);l=i||!e.isCartesian||e.tooltipOutsidePlot||Ya(j,k);y===!1||!l?d():(m&&(o.show(),m=!1),o.attr({text:y}),t=a.borderColor||f.color||e.color||"#606060",o.attr({stroke:t}),l=Fc(o.width,o.height,B,U,Aa,Ba,{x:j,y:k},r(a.distance,12),ha),c(x(l.x),x(l.y)));if(g){g=zb(g);var u;l=g.length;for(var s;l--;)if(u=f.series[l?"yAxis":"xAxis"],g[l]&&u)if(u=u.getPlotLinePath(l?r(f.stackY, +f.y):f.x,1),h[l])h[l].attr({d:u,visibility:$a});else{s={"stroke-width":g[l].width||1,stroke:g[l].color||"#C0C0C0",zIndex:g[l].zIndex||2};if(g[l].dashStyle)s.dashstyle=g[l].dashStyle;h[l]=T.path(u).attr(s).add()}}aa(n,"tooltipRefresh",{text:y,x:j+B,y:k+U,borderColor:t})},hide:d,hideCrosshairs:function(){q(h,function(a){a&&a.hide()})},destroy:function(){q(h,function(a){a&&a.destroy()});o&&(o=o.destroy())}}}function e(a){function b(a){var c,d,e,a=a||ba.event;if(!a.target)a.target=a.srcElement;if(a.originalEvent)a= +a.originalEvent;if(a.event)a=a.event;c=a.touches?a.touches.item(0):a;tb=Ic(H);d=tb.left;e=tb.top;Ub?(d=a.x,c=a.y):(d=c.pageX-d,c=c.pageY-e);return G(a,{chartX:x(d),chartY:x(c)})}function c(a){var b={xAxis:[],yAxis:[]};q(Ha,function(c){var d=c.translate,e=c.isXAxis;b[e?"xAxis":"yAxis"].push({axis:c,value:d((ha?!e:e)?a.chartX-B:Ba-a.chartY+U,!0)})});return b}function e(){var a=n.hoverSeries,b=n.hoverPoint;if(b)b.onMouseOut();if(a)a.onMouseOut();Sa&&(Sa.hide(),Sa.hideCrosshairs());cb=null}function f(){if(l){var a= +{xAxis:[],yAxis:[]},b=l.getBBox(),c=b.x-B,d=b.y-U;k&&(q(Ha,function(e){if(e.options.zoomEnabled!==!1){var f=e.translate,g=e.isXAxis,h=ha?!g:g,j=f(h?c:Ba-d-b.height,!0,0,0,1),f=f(h?c+b.width:Ba-d,!0,0,0,1);a[g?"xAxis":"yAxis"].push({axis:e,min:wa(j,f),max:O(j,f)})}}),aa(n,"selection",a,ob));l=l.destroy()}W(H,{cursor:"auto"});n.mouseIsDown=Ia=k=!1;ua(S,Fa?"touchend":"mouseup",f)}function g(a){var b=A(a.pageX)?a.pageX:a.page.x,a=A(a.pageX)?a.pageY:a.page.y;tb&&!Ya(b-tb.left-B,a-tb.top-U)&&e()}function h(){e(); +tb=null}var j,i,k,l,m=rb?"":p.zoomType,o=/x/.test(m),y=/y/.test(m),v=o&&!ha||y&&ha,t=y&&!ha||o&&ha;if(!Qb)n.trackerGroup=Qb=T.g("tracker").attr({zIndex:9}).add();if(a.enabled)n.tooltip=Sa=d(a),nb=setInterval(function(){ab&&ab()},32);(function(){H.onmousedown=function(a){a=b(a);!Fa&&a.preventDefault&&a.preventDefault();n.mouseIsDown=Ia=!0;n.mouseDownX=j=a.chartX;i=a.chartY;X(S,Fa?"touchend":"mouseup",f)};var d=function(c){if(!c||!(c.touches&&c.touches.length>1)){c=b(c);if(!Fa)c.returnValue=!1;var d= +c.chartX,e=c.chartY,f=!Ya(d-B,e-U);Fa&&c.type==="touchstart"&&($(c.target,"isTracker")?n.runTrackerClick||c.preventDefault():!db&&!f&&c.preventDefault());f&&(dB+Aa&&(d=B+Aa),eU+Ba&&(e=U+Ba));if(Ia&&c.type!=="touchstart"){if(k=Math.sqrt(Math.pow(j-d,2)+Math.pow(i-e,2)),k>10){var g=Ya(j-B,i-U);if(pa&&(o||y)&&g)l||(l=T.rect(B,U,v?1:Aa,t?1:Ba,0).attr({fill:p.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add());l&&v&&(c=d-j,l.attr({width:Ga(c),x:(c>0?0:c)+j}));l&&t&&(e-=i,l.attr({height:Ga(e), +y:(e>0?0:e)+i}));g&&!l&&p.panning&&n.pan(d)}}else if(!f){var h,d=n.hoverPoint,e=n.hoverSeries,m,u,g=Ea,s=ha?c.chartY:c.chartX-B;if(Sa&&a.shared&&(!e||!e.noSharedTooltip)){h=[];m=R.length;for(u=0;ug&&h.splice(m,1);if(h.length&&h[0].plotX!==cb)Sa.refresh(h),cb=h[0].plotX}if(e&&e.tracker&& +(c=e.tooltipPoints[s])&&c!==d)c.onMouseOver()}return f||!pa}};H.onmousemove=d;X(H,"mouseleave",h);X(S,"mousemove",g);H.ontouchstart=function(a){if(o||y)H.onmousedown(a);d(a)};H.ontouchmove=d;H.ontouchend=function(){k&&e()};H.onclick=function(a){var d=n.hoverPoint,a=b(a);a.cancelBubble=!0;if(!k)if(d&&($(a.target,"isTracker")||$(a.target.parentNode,"isTracker"))){var e=d.plotX,f=d.plotY;G(d,{pageX:tb.left+B+(ha?Aa-f:e),pageY:tb.top+U+(ha?Ba-e:f)});aa(d.series,"click",G(a,{point:d}));d.firePointEvent("click", +a)}else G(a,c(a)),Ya(a.chartX-B,a.chartY-U)&&aa(n,"click",a);k=!1}})();G(this,{zoomX:o,zoomY:y,resetTracker:e,normalizeMouseEvent:b,destroy:function(){if(n.trackerGroup)n.trackerGroup=Qb=n.trackerGroup.destroy();ua(H,"mouseleave",h);ua(S,"mousemove",g);H.onclick=H.onmousedown=H.onmousemove=H.ontouchstart=H.ontouchend=H.ontouchmove=null}})}function f(a){var b=a.type||p.type||p.defaultSeriesType,c=ma[b],d=n.hasRendered;if(d)if(ha&&b==="column")c=ma.bar;else if(!ha&&b==="bar")c=ma.column;b=new c;b.init(n, +a);!d&&b.inverted&&(ha=!0);if(b.isCartesian)pa=b.isCartesian;R.push(b);return b}function g(){p.alignTicks!==!1&&q(Ha,function(a){a.adjustTickAmount()});pb=null}function h(a){var b=n.isDirtyLegend,c,d=n.isDirtyBox,e=R.length,f=e,h=n.clipRect;for(Ob(a,n);f--;)if(a=R[f],a.isDirty&&a.options.stacking){c=!0;break}if(c)for(f=e;f--;)if(a=R[f],a.options.stacking)a.isDirty=!0;q(R,function(a){a.isDirty&&a.options.legendType==="point"&&(b=!0)});if(b&&ub.renderLegend)ub.renderLegend(),n.isDirtyLegend=!1;pa&& +(oa||(pb=null,q(Ha,function(a){a.setScale()})),g(),Qa(),q(Ha,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,aa(a,"afterSetExtremes",a.getExtremes());if(a.isDirty||d)a.redraw(),d=!0}));d&&(eb(),h&&(Rb(h),h.animate({width:n.plotSizeX,height:n.plotSizeY+1})));q(R,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});Cb&&Cb.resetTracker&&Cb.resetTracker();T.draw();aa(n,"redraw")}function j(){var a=s.xAxis||{},b=s.yAxis||{},a=zb(a);q(a,function(a,b){a.index=b;a.isX=!0});b=zb(b); +q(b,function(a,b){a.index=b});a=a.concat(b);q(a,function(a){new c(a)});g()}function k(){var a=ja.lang,b=p.resetZoomButton,c=b.theme,d=c.states,e=b.relativeTo==="chart"?null:{x:B,y:U,width:Aa,height:Ba};n.resetZoomButton=T.button(a.resetZoom,null,null,wb,c,d&&d.hover).attr({align:b.position.align,title:a.resetZoomTitle}).add().align(b.position,!1,e)}function i(a,b){Za=I(s.title,a);K=I(s.subtitle,b);q([["title",a,Za],["subtitle",b,K]],function(a){var b=a[0],c=n[b],d=a[1],a=a[2];c&&d&&(c=c.destroy()); +a&&a.text&&!c&&(n[b]=T.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":gb+b,zIndex:a.zIndex||4}).css(a.style).add().align(a,!1,Ua))})}function m(){za=p.renderTo;ea=gb+uc++;Gb(za)&&(za=S.getElementById(za));za||sc(13,!0);za.innerHTML="";za.offsetWidth||(hb=za.cloneNode(0),W(hb,{position:Db,top:"-9999px",display:""}),S.body.appendChild(hb));V=(hb||za).offsetWidth;P=(hb||za).offsetHeight;n.chartWidth=Ea=p.width||V||600;n.chartHeight=xa=p.height||(P>19?P:400);n.container=H=da(sb,{className:gb+ +"container"+(p.className?" "+p.className:""),id:ea},G({position:vc,overflow:Xa,width:Ea+la,height:xa+la,textAlign:"left",lineHeight:"normal"},p.style),hb||za);n.renderer=T=p.forExport?new Eb(H,Ea,xa,!0):new Sb(H,Ea,xa);rb&&T.create(n,H,Ea,xa);var a,b;Kc&&H.getBoundingClientRect&&(a=function(){W(H,{left:0,top:0});b=H.getBoundingClientRect();W(H,{left:-(b.left-Z(b.left))+la,top:-(b.top-Z(b.top))+la})},a(),X(ba,"resize",a),X(n,"destroy",function(){ua(ba,"resize",a)}))}function l(){function a(c){var d= +p.width||za.offsetWidth,e=p.height||za.offsetHeight,c=c?c.target:ba;if(d&&e&&(c===ba||c===S)){if(d!==V||e!==P)clearTimeout(b),b=setTimeout(function(){mb(d,e,!1)},100);V=d;P=e}}var b;X(ba,"resize",a);X(n,"destroy",function(){ua(ba,"resize",a)})}function o(){n&&aa(n,"endResize",null,function(){oa-=1})}function t(){for(var a=ha||p.inverted||p.type==="bar"||p.defaultSeriesType==="bar",b=s.series,c=b&&b.length;!a&&c--;)b[c].type==="bar"&&(a=!0);n.inverted=ha=a}function u(){var a=s.labels,b=s.credits,c; +i();ub=n.legend=new Hb;q(Ha,function(a){a.setScale()});Qa();q(Ha,function(a){a.setTickPositions(!0)});g();Qa();eb();pa&&q(Ha,function(a){a.render()});if(!n.seriesGroup)n.seriesGroup=T.g("series-group").attr({zIndex:3}).add();q(R,function(a){a.translate();a.setTooltipPoints();a.render()});a.items&&q(a.items,function(){var b=G(a.style,this.style),c=Z(b.left)+B,d=Z(b.top)+U+12;delete b.left;delete b.top;T.text(this.html,c,d).attr({zIndex:2}).css(b).add()});if(b.enabled&&!n.credits)c=b.href,n.credits= +T.text(b.text,0,0).on("click",function(){if(c)location.href=c}).attr({align:b.position.align,zIndex:8}).css(b.style).add().align(b.position);n.hasRendered=!0}function v(){if(!Tb&&ba==ba.top&&S.readyState!=="complete"||rb&&!ba.canvg)rb?Lc.push(v,s.global.canvasToolsURL):S.attachEvent("onreadystatechange",function(){S.detachEvent("onreadystatechange",v);S.readyState==="complete"&&v()});else{m();aa(n,"init");if(Highcharts.RangeSelector&&s.rangeSelector.enabled)n.rangeSelector=new Highcharts.RangeSelector(n); +kb();lb();t();j();q(s.series||[],function(a){f(a)});if(Highcharts.Scroller&&(s.navigator.enabled||s.scrollbar.enabled))n.scroller=new Highcharts.Scroller(n);n.render=u;n.tracker=Cb=new e(s.tooltip);u();T.draw();b&&b.apply(n,[n]);q(n.callbacks,function(a){a.apply(n,[n])});hb&&(za.appendChild(H),Nb(hb));aa(n,"load")}}var s,Y=a.series;a.series=null;s=I(ja,a);s.series=a.series=Y;var p=s.chart,Y=p.margin,Y=xb(Y)?Y:[Y,Y,Y,Y],qa=r(p.marginTop,Y[0]),M=r(p.marginRight,Y[1]),w=r(p.marginBottom,Y[2]),N=r(p.marginLeft, +Y[3]),F=p.spacingTop,ga=p.spacingRight,y=p.spacingBottom,ib=p.spacingLeft,Ua,Za,K,U,J,C,B,ia,za,hb,H,ea,V,P,Ea,xa,Na,Ja,ta,sa,fa,vb,n=this,db=(Y=p.events)&&!!Y.click,Ca,Ya,Sa,Ia,na,Va,jb,Ba,Aa,Cb,Qb,ub,Wa,Ma,tb,pa=p.showAxes,oa=0,Ha=[],pb,R=[],ha,T,ab,nb,cb,eb,Qa,kb,lb,mb,ob,wb,Hb=function(){function a(b,c){var d=b.legendItem,e=b.legendLine,g=b.legendSymbol,h=p.color,j=c?f.itemStyle.color:h,h=c?b.color:h;d&&d.css({fill:j});e&&e.attr({stroke:h});g&&g.attr({stroke:h,fill:h})}function b(a){var c=a.legendItem, +d=a.legendLine,e=a._legendItemPos,f=e[0],e=e[1],g=a.legendSymbol,a=a.checkbox;c&&c.attr({x:v?f:Wa-f,y:e});d&&d.translate(v?f:Wa-f,e-4);g&&(c=f+g.xOff,g.attr({x:v?c:Wa-c,y:e+g.yOff}));if(a)a.x=f,a.y=e}function c(){q(i,function(a){var b=a.checkbox,c=x.alignAttr;b&&W(b,{left:c.translateX+a.legendItemWidth+b.x-40+la,top:c.translateY+b.y-11+la})})}function d(b){var c,e,i,k,n=b.legendItem;k=b.series||b;var s=k.options,q=s&&s.borderWidth||0;if(!n){k=/^(bar|pie|area|column)$/.test(k.type);b.legendItem=n= +T.text(f.labelFormatter.call(b),0,0,f.useHTML).css(b.visible?l:p).on("mouseover",function(){b.setState(fb);n.css(m)}).on("mouseout",function(){n.css(b.visible?l:p);b.setState()}).on("click",function(){var a=function(){b.setVisible()};b.firePointEvent?b.firePointEvent("legendItemClick",null,a):aa(b,"legendItemClick",null,a)}).attr({align:v?"left":"right",zIndex:2}).add(x);if(!k&&s&&s.lineWidth){var z={"stroke-width":s.lineWidth,zIndex:2};if(s.dashStyle)z.dashstyle=s.dashStyle;b.legendLine=T.path([ya, +(-h-j)*(v?1:-1),0,ka,-j*(v?1:-1),0]).attr(z).add(x)}if(k)i=T.rect(c=-h-j,e=-11,h,12,2).attr({zIndex:3}).add(x),v||(c+=h);else if(s&&s.marker&&s.marker.enabled)i=s.marker.radius,i=T.symbol(b.symbol,c=-h/2-j-i,e=-4-i,2*i,2*i).attr(b.pointAttr[ra]).attr({zIndex:3}).add(x),v||(c+=h/2);if(i)i.xOff=c+q%2/2,i.yOff=e+q%2/2;b.legendSymbol=i;a(b,b.visible);if(s&&s.showCheckbox)b.checkbox=da("input",{type:"checkbox",checked:b.selected,defaultChecked:b.selected},f.itemCheckboxStyle,H),X(b.checkbox,"click",function(a){aa(b, +"checkboxClick",{checked:a.target.checked},function(){b.select()})})}c=n.getBBox();e=b.legendItemWidth=f.itemWidth||h+j+c.width+o;na=c.height;if(g&&M-r+e>(ib||Ea-2*o-r))M=r,qa+=u+na+t;!g&&qa+f.y+na>xa-F-y&&(qa=ga,M+=Y,Y=0);Y=O(Y,e);B=O(B,qa+t);b._legendItemPos=[M,qa];g?M+=e:qa+=u+na+t;N=ib||O(M-r+(g?0:e),N)}function e(){M=r;qa=ga;B=N=0;x||(x=T.g("legend").attr({zIndex:7}).add());i=[];q(D,function(a){var b=a.options;b.showInLegend&&(i=i.concat(a.legendItems||(b.legendType==="point"?a.data:a)))});Xc(i, +function(a,b){return(a.options.legendIndex||0)-(b.options.legendIndex||0)});Fb&&i.reverse();q(i,d);Wa=ib||N;Ma=B-s+na;if(w||A){Wa+=2*o;Ma+=2*o;if(Ia){if(Wa>0&&Ma>0)Ia[Ia.isNew?"attr":"animate"](Ia.crisp(null,null,null,Wa,Ma)),Ia.isNew=!1}else Ia=T.rect(0,0,Wa,Ma,f.borderRadius,w||0).attr({stroke:f.borderColor,"stroke-width":w||0,fill:A||Ka}).add(x).shadow(f.shadow),Ia.isNew=!0;Ia[i.length?"show":"hide"]()}q(i,b);for(var a=["left","right","top","bottom"],g,h=4;h--;)g=a[h],k[g]&&k[g]!=="auto"&&(f[h< +2?"align":"verticalAlign"]=g,f[h<2?"x":"y"]=Z(k[g])*(h%2?-1:1));i.length&&x.align(G(f,{width:Wa,height:Ma}),!0,Ua);oa||c()}var f=n.options.legend;if(f.enabled){var g=f.layout==="horizontal",h=f.symbolWidth,j=f.symbolPadding,i,k=f.style,l=f.itemStyle,m=f.itemHoverStyle,p=I(l,f.itemHiddenStyle),o=f.padding||Z(k.padding),v=!f.rtl,u=f.itemMarginTop||0,t=f.itemMarginBottom||0,s=18,Y=0,r=4+o+h+j,ga=o+u+s-5,M,qa,B,na=0,Ia,w=f.borderWidth,A=f.backgroundColor,x,N,ib=f.width,D=n.series,Fb=f.reversed;e();X(n, +"endResize",c);return{colorizeItem:a,destroyItem:function(a){var b=a.checkbox;q(["legendItem","legendLine","legendSymbol"],function(b){a[b]&&a[b].destroy()});b&&Nb(a.checkbox)},renderLegend:e,destroy:function(){Ia&&(Ia=Ia.destroy());x&&(x=x.destroy())}}}};Ya=function(a,b){return a>=0&&a<=Aa&&b>=0&&b<=Ba};wb=function(){var a=n.resetZoomButton;aa(n,"selection",{resetSelection:!0},ob);if(a)n.resetZoomButton=a.destroy()};ob=function(a){var b;n.resetZoomEnabled!==!1&&!n.resetZoomButton&&k();!a||a.resetSelection? +q(Ha,function(a){a.options.zoomEnabled!==!1&&(a.setExtremes(null,null,!1),b=!0)}):q(a.xAxis.concat(a.yAxis),function(a){var c=a.axis;if(n.tracker[c.isXAxis?"zoomX":"zoomY"])c.setExtremes(a.min,a.max,!1),b=!0});b&&h(r(p.animation,n.pointCount<100))};n.pan=function(a){var b=n.xAxis[0],c=n.mouseDownX,d=b.pointRange/2,e=b.getExtremes(),f=b.translate(c-a,!0)+d,c=b.translate(c+Aa-a,!0)-d;(d=n.hoverPoints)&&q(d,function(a){a.setState()});f>wa(e.dataMin,e.min)&&c=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};K= +Ja(Hb,1,ob,1E3,cb,6E4,db,36E5,P,864E5,Ca,6048E5,pa,2592E6,fa,31556952E3);Xb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,j,k=function(a){for(g=a.length;g--;)a[g]===ya&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(k(b),k(c));a.isArea&&(h=b.splice(b.length-6,6),j=c.splice(c.length-6,6));d===1&&(c=[].concat(c).splice(0,f).concat(c));a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
',pointFormat:'{series.name}: {point.y}
', +shadow:!0,shared:rb,snap:Fa?25:10,style:{color:"#333333",fontSize:"12px",padding:"5px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"10px"}}};var hc={dateTimeLabelFormats:Ja(Hb,"%H:%M:%S.%L",ob,"%H:%M:%S",cb,"%H:%M",db,"%H:%M",P,"%e. %b",Ca,"%e. %b",pa,"%b '%y",fa,"%Y"),endOnTick:!1,gridLineColor:"#C0C0C0",labels:w,lineColor:"#C0D0E0",lineWidth:1, +max:null,min:null,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#6D869F",fontWeight:"bold"}},type:"linear"},tc=I(hc,{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{align:"right",x:-8, +y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Y-values"},stackLabels:{enabled:!1,formatter:function(){return this.total},style:w.style}}),ad={labels:{align:"right",x:-8,y:null},title:{rotation:270}},$c={labels:{align:"left",x:8,y:null},title:{rotation:90}},Hc={labels:{align:"center",x:0,y:14,overflow:"justify"},title:{rotation:0}},Zc=I(Hc,{labels:{y:-5,overflow:"justify"}}),J=ja.plotOptions,w=J.line;J.spline=I(w);J.scatter=I(w,{lineWidth:0,states:{hover:{lineWidth:0}}, +tooltip:{headerFormat:'{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
"}});J.area=I(w,{threshold:0});J.areaspline=I(J.area);J.column=I(w,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{y:null,verticalAlign:null}, +threshold:0});J.bar=I(J.column,{dataLabels:{align:"left",x:5,y:null,verticalAlign:"middle"}});J.pie=I(w,{borderColor:"#FFFFFF",borderWidth:1,center:["50%","50%"],colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name},y:5},legendType:"point",marker:null,size:"75%",showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}}});Gc();var oa=function(a){var b=[],c;(function(a){(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))? +b=[Z(c[1]),Z(c[2]),Z(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))&&(b=[Z(c[1],16),Z(c[2],16),Z(c[3],16),1])})(a);return{get:function(c){return b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a},brighten:function(a){if(Yb(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=Z(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},setOpacity:function(a){b[3]=a;return this}}};Qa.prototype={init:function(a,b){this.element= +b==="span"?da(b):S.createElementNS("http://www.w3.org/2000/svg",b);this.renderer=a;this.attrSetters={}},animate:function(a,b,c){b=r(b,Vb,!0);Rb(this);if(b){b=I(b);if(c)b.complete=c;ic(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName,j=this.renderer,k,i=this.attrSetters,m=this.shadows,l,o=this;Gb(a)&&A(b)&&(c=a,a={},a[c]=b);if(Gb(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),o=$(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&& +(o=parseFloat(o));else for(c in a)if(k=!1,d=a[c],e=i[c]&&i[c](d,c),e!==!1){e!==D&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0"),this.d=d;else if(c==="x"&&h==="text"){for(e=0;el&&(W(b,{width:l+la,display:"block",whiteSpace:"normal"}),i=l),l=a.fontMetrics(b.style.fontSize).b,v=o<0&&-i,s=t<0&&-m,u=o*t<0,v+=t*l*(u?1-h:h),s-=o*l*(k?u?h:1-h:1),j&&(v-=i*h*(o<0?-1:1),k&&(s-=m*h*(t<0?-1:1)),W(b,{textAlign:g})),this.xCorr= +v,this.yCorr=s;W(b,{left:e+v+la,top:f+s+la});this.cTT=Y}}else this.alignOnAdd=!0},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.inverted,d=this.rotation,e=[];c&&(a+=this.attr("width"),b+=this.attr("height"));(a||b)&&e.push("translate("+a+","+b+")");c?e.push("rotate(90) scale(-1,1)"):d&&e.push("rotate("+d+" "+this.x+" "+this.y+")");e.length&&$(this.element,"transform",e.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a, +b,c){a?(this.alignOptions=a,this.alignByTranslate=b,c||this.renderer.alignedObjects.push(this)):(a=this.alignOptions,b=this.alignByTranslate);var c=r(c,this.renderer),d=a.align,e=a.verticalAlign,f=(c.x||0)+(a.x||0),g=(c.y||0)+(a.y||0),h={};/^(right|center)$/.test(d)&&(f+=(c.width-(a.width||0))/{right:1,center:2}[d]);h[b?"translateX":"x"]=x(f);/^(bottom|middle)$/.test(e)&&(g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1));h[b?"translateY":"y"]=x(g);this[this.placed?"animate":"attr"](h);this.placed= +!0;this.alignAttr=h;return this},getBBox:function(a){var b,c,d=this.rotation;c=this.element;var e=d*Nc;if(c.namespaceURI==="http://www.w3.org/2000/svg"){try{b=c.getBBox?G({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(f){}if(!b||b.width<0)b={width:0,height:0};a=b.width;c=b.height;if(d)b.width=Ga(c*sa(e))+Ga(a*Na(e)),b.height=Ga(c*Na(e))+Ga(a*sa(e))}else b=this.htmlGetBBox(a);return b},show:function(){return this.attr({visibility:$a})},hide:function(){return this.attr({visibility:Xa})}, +add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=$(f,"zIndex"),h;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=Z(g);if(c.handleZ)for(c=0;cg||!A(g)&&A(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;aa(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element|| +{},c=a.shadows,d=a.box,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=null;Rb(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f/g,'').replace(/<(i|em)>/g,'').replace(/
/g,"").split(//g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=$(b,"x"),h=a.styles,j=h&&Z(h.width),k=h&&h.lineHeight,i,h=d.length;h--;)b.removeChild(d[h]);j&&!a.added&&this.box.appendChild(b);c[c.length-1]===""&& +c.pop();q(c,function(c,d){var h,t=0,u,c=c.replace(//g,"|||");h=c.split("|||");q(h,function(c){if(c!==""||h.length===1){var m={},q=S.createElementNS("http://www.w3.org/2000/svg","tspan");e.test(c)&&$(q,"style",c.match(e)[1].replace(/(;| |^)color([ :])/,"$1fill$2"));f.test(c)&&($(q,"onclick",'location.href="'+c.match(f)[1]+'"'),W(q,{cursor:"pointer"}));c=(c.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");q.appendChild(S.createTextNode(c)); +t?m.dx=3:m.x=g;if(!t){if(d){!Tb&&a.renderer.forExport&&W(q,{display:"block"});u=ba.getComputedStyle&&Z(ba.getComputedStyle(i,null).getPropertyValue("line-height"));if(!u||isNaN(u))u=k||i.offsetHeight||18;$(q,"dy",u)}i=q}$(q,m);b.appendChild(q);t++;if(j)for(var c=c.replace(/-/g,"- ").split(" "),p,r=[];c.length||r.length;)p=a.getBBox().width,m=p>j,!m||c.length===1?(c=r,r=[],c.length&&(q=S.createElementNS("http://www.w3.org/2000/svg","tspan"),$(q,{dy:k||16,x:g}),b.appendChild(q),p>j&&(j=p))):(q.removeChild(q.firstChild), +r.unshift(c.pop())),c.length&&q.appendChild(S.createTextNode(c.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g){var h=this.label(a,b,c),j=0,k,i,m,l,o,a={x1:0,y1:0,x2:0,y2:1},e=I(Ja("stroke-width",1,"stroke","#999","fill",Ja("linearGradient",a,"stops",[[0,"#FFF"],[1,"#DDD"]]),"r",3,"padding",3,"style",Ja("color","black")),e);m=e.style;delete e.style;f=I(e,Ja("stroke","#68A","fill",Ja("linearGradient",a,"stops",[[0,"#FFF"],[1,"#ACF"]])),f);l=f.style;delete f.style;g=I(e,Ja("stroke", +"#68A","fill",Ja("linearGradient",a,"stops",[[0,"#9BD"],[1,"#CDF"]])),g);o=g.style;delete g.style;X(h.element,"mouseenter",function(){h.attr(f).css(l)});X(h.element,"mouseleave",function(){k=[e,f,g][j];i=[m,l,o][j];h.attr(k).css(i)});h.setState=function(a){(j=a)?a===2&&h.attr(g).css(o):h.attr(e).css(m)};return h.on("click",function(){d.call(h)}).attr(e).css(G({cursor:"default"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=x(a[1])+b%2/2);a[2]===a[5]&&(a[2]=a[5]=x(a[2])+b%2/2);return a},path:function(a){return this.createElement("path").attr({d:a, +fill:Ka})},circle:function(a,b,c){a=xb(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(xb(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;return this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){if(xb(a))b=a.y,c=a.width,d=a.height,e=a.r,f=a.strokeWidth,a=a.x;e=this.createElement("rect").attr({rx:e,ry:e,fill:Ka});return e.attr(e.crisp(f,a,b,O(c,0),O(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects, +e=d.length;this.width=a;this.height=b;for(this.boxWrapper[r(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return A(a)?b.attr({"class":gb+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:Ka};arguments.length>1&&G(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a, +b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(x(b),x(c),d,e,f),j=/^url\((.*?)\)$/,k;if(h)g=this.path(h),G(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&G(g,f);else if(j.test(a)){var i=function(a,b){a.attr({width:b[0],height:b[1]}).translate(-x(b[0]/2),-x(b[1]/2))};k=a.match(j)[1];a=Pc[k];g=this.image(k).attr({x:b,y:c});a?i(g,a):(g.attr({width:0,height:0}),da("img",{onload:function(){i(g,Pc[k]=[this.width,this.height])},src:k}))}return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return[ya,a+c/2, +b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return[ya,a,b,ka,a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return[ya,a+c/2,b,ka,a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return[ya,a,b,ka,a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return[ya,a+c/2,b,ka,a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-1.0E-6,d=e.innerR,h=Na(f),j=sa(f),k=Na(g),g=sa(g),e=e.end-f');if(b)c=b===sb||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=da(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);Wb&&d.gVis===Xa&&W(c,{visibility:Xa});d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();aa(this,"add");return this},toggleChildren:function(a,b){for(var c=a.childNodes,d=c.length;d--;)W(c[d], +{visibility:b}),c[d].nodeName==="DIV"&&this.toggleChildren(c[d],b)},updateTransform:Qa.prototype.htmlUpdateTransform,attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,j=this.renderer,k=this.symbolName,i,m=this.shadows,l,o=this.attrSetters,t=this;Gb(a)&&A(b)&&(c=a,a={},a[c]=b);if(Gb(a))c=a,t=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d=a[c],l=!1,e=o[c]&&o[c](d,c),e!==!1&&d!==null){e!==D&&(d=e);if(k&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))i|| +(this.symbolAttr(a),i=!0),l=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");e=d.length;for(l=[];e--;)l[e]=Yb(d[e])?x(d[e]*10)-5:d[e]==="Z"?"x":d[e];d=l.join(" ")||"x";f.path=d;if(m)for(e=m.length;e--;)m[e].path=d;l=!0}else if(c==="zIndex"||c==="visibility"){if(Wb&&c==="visibility"&&h==="DIV")f.gVis=d,this.toggleChildren(f,d),d===$a&&(d=null);d&&(g[c]=d);l=!0}else if(c==="width"||c==="height")d=O(0,d),this[c]=d,this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,l=!0;else if(c==="x"||c==="y")this[c]= +d,g[{x:"left",y:"top"}[c]]=d;else if(c==="class")f.className=d;else if(c==="stroke")d=j.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,Yb(d)&&(d+=la);else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||da(j.prepVML([""]),null,null,f))[c]=d||"solid",this.dashstyle=d,l=!0;else if(c==="fill")h==="SPAN"?g.color=d:(f.filled=d!==Ka?!0:!1,d=j.color(d,f,c),c="fillcolor");else if(c==="translateX"||c==="translateY"|| +c==="rotation")this[c]=d,this.updateTransform(),l=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,l=!0;if(m&&c==="visibility")for(e=m.length;e--;)m[e].style[c]=d;l||(Wb?f[c]=d:$(f,c,d))}return t},clip:function(a){var b=this,c=a.members;c.push(b);b.destroyClip=function(){Lb(c,b)};return b.css(a.getCSS(b.inverted))},css:Qa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Nb(a)},destroy:function(){this.destroyClip&&this.destroyClip();return Qa.prototype.destroy.apply(this)},empty:function(){for(var a= +this.element.childNodes,b=a.length,c;b--;)c=a[b],c.parentNode.removeChild(c)},on:function(a,b){this.element["on"+a]=function(){var a=ba.event;a.target=a.srcElement;b(a)};return this},shadow:function(a,b){var c=[],d,e=this.element,f=this.renderer,g,h=e.style,j,k=e.path;k&&typeof k.value!=="string"&&(k="x");if(a){for(d=1;d<=3;d++)j=[''],g=da(f.prepVML(j),null,{left:Z(h.left)+ +1,top:Z(h.top)+1}),j=[''],da(f.prepVML(j),null,null,g),b?b.element.appendChild(g):e.parentNode.insertBefore(g,e),c.push(g);this.shadows=c}return this}},w=ea(Qa,w),w={Element:w,isIE8:lb.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(sb);e=d.element;e.style.position=vc;a.appendChild(d.element);this.box=e;this.boxWrapper=d;this.setSize(b,c,!1);if(!S.namespaces.hcv)S.namespaces.add("hcv","urn:schemas-microsoft-com:vml"), +S.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "},clipRect:function(a,b,c,d){var e=this.createElement();return G(e,{members:[],left:a,top:b,width:c,height:d,getCSS:function(a){var b=this.top,c=this.left,d=c+this.width,e=b+this.height,b={clip:"rect("+x(a?c:b)+"px,"+x(a?e:d)+"px,"+x(a?d:e)+"px,"+x(a?b:c)+"px)"};!a&&Wb&&G(b,{width:d+la,height:e+la});return b},updateClipping:function(){q(e.members,function(a){a.css(e.getCSS(a.inverted))})}})}, +color:function(a,b,c){var d,e=/^rgba/;if(a&&a.linearGradient){var f,g,h=a.linearGradient,j=h.x1||h[0]||0,k=h.y1||h[1]||0,i=h.x2||h[2]||0,h=h.y2||h[3]||0,m,l,o,t;q(a.stops,function(a,b){e.test(a[1])?(d=oa(a[1]),f=d.get("rgb"),g=d.get("a")):(f=a[1],g=1);b?(o=f,t=g):(m=f,l=g)});if(c==="fill")a=90-va.atan((h-k)/(i-j))*180/kb,a=[''],da(this.prepVML(a),null,null,b);else return f}else if(e.test(a)&& +b.tagName!=="IMG")return d=oa(a),a=["<",c,' opacity="',d.get("a"),'"/>'],da(this.prepVML(a),null,null,b),d.get("rgb");else{b=b.getElementsByTagName(c);if(b.length)b[0].opacity=1;return a}},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<", +"1&&f.css({left:b,top:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(xb(a))b=a.y,c= +a.width,d=a.height,f=a.strokeWidth,a=a.x;var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,O(c,0),O(d,0)))},invertChild:function(a,b){var c=b.style;W(a,{flip:"x",left:Z(c.width)-10,top:Z(c.height)-10,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,c=e.r||c||d,d=Na(f),h=sa(f),j=Na(g),k=sa(g),e=e.innerR,i=0.08/c,m=e&&0.25/e||0;if(g-f===0)return["x"];else 2*kb-g+fa+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=a.data;a.data=null;c=I(c[this.type],c.series,a);c.data=a.data=d;this.tooltipOptions=I(b.tooltip,c.tooltip);return c},getColor:function(){var a=this.chart.options.colors,b=this.chart.counters;this.color=this.options.color||a[b.color++]||"#0000ff";b.wrapColor(a.length)},getSymbol:function(){var a=this.options.marker,b=this.chart,c=b.options.symbols, +b=b.counters;this.symbol=a.symbol||c[b.symbol++];if(/^url/.test(this.symbol))a.radius=0;b.wrapSymbol(c.length)},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,h=this.chart,j=this.xData,k=this.yData,i=f&&f.shift||0,m=this.options.data;Ob(d,h);if(f&&c)f.shift=i+1;if(g){if(c)g.shift=i+1;g.isArea=!0}b=r(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);j.push(d.x);k.push(this.valueCount===4?[d.open,d.high,d.low,d.close]:d.y);m.push(a);c&&(e[0]&&e[0].remove? +e[0].remove(!1):(e.shift(),j.shift(),k.shift(),m.shift()));this.getAttribs();this.isDirtyData=this.isDirty=!0;b&&h.redraw()},setData:function(a,b){var c=this.points,d=this.options,e=this.initialColor,f=this.chart,g=null;this.xIncrement=null;this.pointRange=this.xAxis&&this.xAxis.categories&&1||d.pointRange;if(A(e))f.counters.color=e;var h=[],j=[],k=a?a.length:[],i=this.valueCount===4;if(k>(d.turboThreshold||1E3)){for(e=0;g===null&&ei||this.forceCrop))if(a=j.getExtremes(),j=a.min,i=a.max,b[d-1]i)b= +[],c=[];else if(b[0]i){for(a=0;a=j){e=O(0,a-1);break}for(;ai){f=a+1;break}b=b.slice(e,f);c=c.slice(e,f);g=!0}for(a=b.length-1;a>0;a--)if(d=b[a]-b[a-1],d>0&&(h===D||d0||k)g.graphic=c.renderer.symbol(j,d-h,e-h,2*h,2*h).attr(a).add(this.group)},convertAttribs:function(a,b,c, +d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=r(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=J[a.type].marker?a.options.marker:a.options,c=b.states,d=c[fb],e,f=a.color,g={stroke:f,fill:f},h=a.points,j=[],k,i=a.pointAttrToOptions,m;a.options.marker?(d.radius=d.radius||b.radius+2,d.lineWidth=d.lineWidth||b.lineWidth+1):d.color=d.color||oa(d.color||f).brighten(d.brightness).get();j[ra]=a.convertAttribs(b,g);q([fb,"select"],function(b){j[b]= +a.convertAttribs(c[b],j[ra])});a.pointAttr=j;for(f=h.length;f--;){g=h[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===!1)b.radius=0;e=!1;if(g.options)for(m in i)A(b[i[m]])&&(e=!0);if(e){k=[];c=b.states||{};e=c[fb]=c[fb]||{};if(!a.options.marker)e.color=oa(e.color||g.options.color).brighten(e.brightness||d.brightness).get();k[ra]=a.convertAttribs(b,j[ra]);k[fb]=a.convertAttribs(c[fb],j[fb],k[ra]);k.select=a.convertAttribs(c.select,j.select,k[ra])}else k=j;g.pointAttr=k}},destroy:function(){var a= +this,b=a.chart,c=a.clipRect,d=/AppleWebKit\/533/.test(lb),e,f,g=a.data||[],h,j,k;aa(a,"destroy");ua(a);q(["xAxis","yAxis"],function(b){if(k=a[b])Lb(k.series,a),k.isDirty=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(f=g.length;f--;)(h=g[f])&&h.destroy&&h.destroy();a.points=null;if(c&&c!==b.clipRect)a.clipRect=c.destroy();q(["area","graph","dataLabelsGroup","group","tracker"],function(b){a[b]&&(e=d&&b==="group"?"hide":"destroy",a[b][e]())});if(b.hoverSeries===a)b.hoverSeries=null;Lb(b.series, +a);for(j in a)delete a[j]},drawDataLabels:function(){var a=this,b=a.options,c=b.dataLabels;if(c.enabled||a._hasPointLabels){var d,e,f=a.points,g,h,j,k=a.dataLabelsGroup,i=a.chart,m=a.xAxis,m=m?m.left:i.plotLeft,l=a.yAxis,l=l?l.top:i.plotTop,o=i.renderer,t=i.inverted,u=a.type,v=b.stacking,s=u==="column"||u==="bar",Y=c.verticalAlign===null,p=c.y===null,qa=o.fontMetrics(c.style.fontSize),M=qa.h,w=qa.b,N,F;s&&(qa={top:w,middle:w-M/2,bottom:-M+w},v?(Y&&(c=I(c,{verticalAlign:"middle"})),p&&(c=I(c,{y:qa[c.verticalAlign]}))): +Y?c=I(c,{verticalAlign:"top"}):p&&(c=I(c,{y:qa[c.verticalAlign]})));k?k.translate(m,l):k=a.dataLabelsGroup=o.g("data-labels").attr({visibility:a.visible?$a:Xa,zIndex:6}).translate(m,l).add();h=c;q(f,function(f){N=f.dataLabel;c=h;(g=f.options)&&g.dataLabels&&(c=I(c,g.dataLabels));if(F=c.enabled){var m=f.barX&&f.barX+f.barW/2||r(f.plotX,-999),l=r(f.plotY,-999),p=c.y===null?f.y>=b.threshold?-M+w:w:c.y;d=(t?i.plotWidth-l:m)+c.x;e=x((t?i.plotHeight-m:l)+p)}if(N&&a.isCartesian&&(!i.isInsidePlot(d,e)||!F))f.dataLabel= +N.destroy();else if(F){m=c.align;j=c.formatter.call(f.getLabelConfig(),c);u==="column"&&(d+={left:-1,right:1}[m]*f.barW/2||0);!v&&t&&f.y<0&&(m="right",d-=10);c.style.color=r(c.color,c.style.color,a.color,"black");if(N)N.attr({text:j}).animate({x:d,y:e});else if(A(j))N=f.dataLabel=o[c.rotation?"text":"label"](j,d,e,null,null,null,c.useHTML,!0).attr({align:m,fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":c.borderWidth,r:c.borderRadius,rotation:c.rotation,padding:c.padding,zIndex:1}).css(c.style).add(k).shadow(c.shadow); +if(s&&b.stacking&&N)m=f.barX,l=f.barY,p=f.barW,f=f.barH,N.align(c,null,{x:t?i.plotWidth-l-f:m,y:t?i.plotHeight-m-p:l,width:t?f:p,height:t?p:f})}})}},drawGraph:function(){var a=this,b=a.options,c=a.graph,d=[],e,f=a.area,g=a.group,h=b.lineColor||a.color,j=b.lineWidth,k=b.dashStyle,i,m=a.chart.renderer,l=a.yAxis.getThreshold(b.threshold),o=/^area/.test(a.type),t=[],u=[];q(a.segments,function(c){i=[];q(c,function(d,e){a.getPointSpline?i.push.apply(i,a.getPointSpline(c,d,e)):(i.push(e?ka:ya),e&&b.step&& +i.push(d.plotX,c[e-1].plotY),i.push(d.plotX,d.plotY))});c.length>1?d=d.concat(i):t.push(c[0]);if(o){var e=[],f,g=i.length;for(f=0;f=0;f--)fa&&j>e?(j=O(a,e),i=2*e-j):jg&&i>e?(i=O(g,e),j=2*e-i):iw?g-w:s-(f<=s?w:0));G(b,{barX:h,barY:j,barW:u,barH:i});b.shapeType="rect";f={x:h,y:j,width:u,height:i,r:c.borderRadius,strokeWidth:e};e%2&&(f.y-=1,f.height+=1);b.shapeArgs=f;b.trackerArgs=Ga(i)<3&&I(b.shapeArgs,{height:6,y:j-3})})},getSymbol:function(){},drawGraph:function(){}, +drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e;q(a.points,function(f){var g=f.plotY;if(g!==D&&!isNaN(g)&&f.y!==null)d=f.graphic,e=f.shapeArgs,d?(Rb(d),d.animate(c.Element.prototype.crisp.apply({},[e.strokeWidth,e.x,e.y,e.width,e.height]))):f.graphic=d=c[f.shapeType](e).attr(f.pointAttr[f.selected?"select":ra]).add(a.group).shadow(b.shadow)})},drawTracker:function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options,h=g.cursor,j=h&&{cursor:h},k=a.drawTrackerGroup(), +i;q(a.points,function(h){e=h.tracker;d=h.trackerArgs||h.shapeArgs;delete d.strokeWidth;if(h.y!==null)e?e.attr(d):h.tracker=c[h.shapeType](d).attr({isTracker:f,fill:Qc,visibility:a.visible?$a:Xa}).on(Fa?"touchstart":"mouseover",function(c){i=c.relatedTarget||c.fromElement;if(b.hoverSeries!==a&&$(i,"isTracker")!==f)a.onMouseOver();h.onMouseOver()}).on("mouseout",function(b){if(!g.stickyTracking&&(i=b.relatedTarget||b.toElement,$(i,"isTracker")!==f))a.onMouseOut()}).css(j).add(h.group||k)})},animate:function(a){var b= +this,c=b.points,d=b.options;if(!a)q(c,function(a){var c=a.graphic,a=a.shapeArgs,g=b.yAxis,h=d.threshold;c&&(c.attr({height:0,y:A(h)?g.getThreshold(h):g.translate(g.getExtremes().min,0,1,0,1)}),c.animate({height:a.height,y:a.y},d.animation))}),b.animate=null},remove:function(){var a=this,b=a.chart;b.hasRendered&&q(b.series,function(b){if(b.type===a.type)b.isDirty=!0});ia.prototype.remove.apply(a,arguments)}});ma.column=jc;w=ea(jc,{type:"bar",init:function(){this.inverted=!0;jc.prototype.init.apply(this, +arguments)}});ma.bar=w;w=ea(ia,{type:"scatter",sorted:!1,translate:function(){var a=this;ia.prototype.translate.apply(a);q(a.points,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){for(var a=this,b=a.options.cursor,b=b&&{cursor:b},c=a.points,d=c.length,e;d--;)if(e=c[d].graphic)e.element._i=d;a._hasTracking?a._hasTracking=!0:a.group.attr({isTracker:!0}).on(Fa?"touchstart":"mouseover",function(b){a.onMouseOver();if(b.target._i!== +D)c[b.target._i].onMouseOver()}).on("mouseout",function(){if(!a.options.stickyTracking)a.onMouseOut()}).css(b)}});ma.scatter=w;w=ea(ab,{init:function(){ab.prototype.init.apply(this,arguments);var a=this,b;G(a,{visible:a.visible!==!1,name:r(a.name,"Slice")});b=function(){a.slice()};X(a,"select",b);X(a,"unselect",b);return a},setVisible:function(a){var b=this.series.chart,c=this.tracker,d=this.dataLabel,e=this.connector,f=this.shadowGroup,g;g=(this.visible=a=a===D?!this.visible:a)?"show":"hide";this.group[g](); +if(c)c[g]();if(d)d[g]();if(e)e[g]();if(f)f[g]();this.legendItem&&b.legend.colorizeItem(this,a)},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;Ob(c,d);r(b,!0);a=this.sliced=A(a)?a:!this.sliced;a={translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop};this.group.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}});w=ea(ia,{type:"pie",isCartesian:!1,pointClass:w,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor= +this.chart.counters.color},animate:function(){var a=this;q(a.points,function(b){var c=b.graphic,b=b.shapeArgs,d=-kb/2;c&&(c.attr({r:0,start:d,end:d}),c.animate({r:b.r,start:b.start,end:b.end},a.options.animation))});a.animate=null},setData:function(){ia.prototype.setData.apply(this,arguments);this.processData();this.generatePoints()},translate:function(){this.generatePoints();var a=0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f=c.center.concat([c.size,c.innerSize||0]),g=this.chart, +h=g.plotWidth,j=g.plotHeight,k,i,m,l=this.points,o=2*kb,t,u=wa(h,j),v,s,r,p=c.dataLabels.distance,f=Kb(f,function(a,b){return(v=/%$/.test(a))?[h,j,u,u][b]*Z(a)/100:a});this.getX=function(a,b){m=va.asin((a-f[1])/(f[2]/2+p));return f[0]+(b?-1:1)*Na(m)*(f[2]/2+p)};this.center=f;q(l,function(b){a+=b.y});q(l,function(c){t=a?c.y/a:0;k=x(b*o*1E3)/1E3;b+=t;i=x(b*o*1E3)/1E3;c.shapeType="arc";c.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:k,end:i};m=(i+k)/2;c.slicedTranslation=Kb([Na(m)*d+g.plotLeft, +sa(m)*d+g.plotTop],x);s=Na(m)*f[2]/2;r=sa(m)*f[2]/2;c.tooltipPos=[f[0]+s*0.7,f[1]+r*0.7];c.labelPos=[f[0]+s+Na(m)*p,f[1]+r+sa(m)*p,f[0]+s+Na(m)*e,f[1]+r+sa(m)*e,f[0]+s,f[1]+r,p<0?"center":m0,o=[[],[]],t,u,v,s,w=2,p;if(d.enabled){ia.prototype.drawDataLabels.apply(this);q(a,function(a){a.dataLabel&&o[a.labelPos[7]v){h=[].concat(A);h.sort(s);for(p=N;p--;)h[p].rank=p;for(p=N;p--;)A[p].rank>=v&&A.splice(p,1);N=A.length}for(p=0;pu&&x[F+1]!==null||t=c[1]||r===j;)if(k=c.shift(),i=u(i,l,o,q),i!==D&&(g.push(k),h.push(i)),i=[],l=[],o=[],q=[],r===j)break;if(r===j)break;k=m?b[r]:null;if(d==="ohlc"){k=this.cropStart+r;var s=e&&e[k]||this.pointClass.prototype.applyOptions.apply({},[f[k]]);k=s.open;var x=s.high,p=s.low,s=s.close;if(typeof k==="number")i.push(k);else if(k===null)i.hasNulls=!0;if(typeof x==="number")l.push(x);else if(x===null)l.hasNulls=!0;if(typeof p==="number")o.push(p); +else if(p===null)o.hasNulls=!0;if(typeof s==="number")q.push(s);else if(s===null)q.hasNulls=!0}else if(typeof k==="number")i.push(k);else if(k===null)i.hasNulls=!0}return[g,h]};C.processData=function(){var a=this.options,b=a.dataGrouping,c=b&&b.enabled,d=this.groupedData,e;this.forceCrop=c;if(cd.apply(this,arguments)!==!1&&c){q(d||[],function(a,b){a&&(d[b]=a.destroy?a.destroy():null)});var f;f=this.chart;var c=this.processedXData,g=this.processedYData,h=f.plotSizeX,j=this.xAxis,k=r(j.groupPixelWidth, +b.groupPixelWidth),i=c.length,m=f.series,l=this.pointRange;if(!j.groupPixelWidth){for(f=m.length;f--;)m[f].xAxis===j&&m[f].options.dataGrouping&&(k=O(k,m[f].options.dataGrouping.groupPixelWidth));j.groupPixelWidth=k}if(i>h/k||b.forced){e=!0;this.points=null;f=j.getExtremes();i=f.min;m=f.max;f=j.getGroupIntervalFactor&&j.getGroupIntervalFactor(i,m,c)||1;h=k*(m-i)/h*f;j=(j.getNonLinearTimeTicks||$b)(zc(h,b.units||Uc),i,m,null,c,this.closestPointRange);g=C.groupData.apply(this,[c,g,j,b.approximation]); +c=g[0];g=g[1];if(b.smoothed){f=c.length-1;for(c[f]=m;f--&&f>0;)c[f]+=h/2;c[0]=i}this.currentDataGrouping=j.info;if(a.pointRange===null)this.pointRange=j.info.totalRange;this.closestPointRange=j.info.totalRange;this.processedXData=c;this.processedYData=g}else this.currentDataGrouping=null,this.pointRange=l;this.hasGroupedData=e}};C.generatePoints=function(){dd.apply(this);this.groupedData=this.hasGroupedData?this.points:null};C.tooltipHeaderFormatter=function(a){var b=this.tooltipOptions,c=this.options.dataGrouping, +d=b.xDateFormat,e,f=this.xAxis,g,h;if(f&&f.options.type==="datetime"&&c){g=this.currentDataGrouping;c=c.dateTimeLabelFormats;if(g)f=c[g.unitName],g.count===1?d=f[0]:(d=f[1],e=f[2]);else if(!d)for(h in K)if(K[h]>=f.closestPointRange){d=c[h][0];break}d=Bb(d,a);e&&(d+=Bb(e,a+g.totalRange-1));a=b.headerFormat.replace("{point.key}",d)}else a=fd.apply(this,[a]);return a};C.destroy=function(){for(var a=this.groupedData||[],b=a.length;b--;)a[b]&&a[b].destroy();ed.apply(this)};J.line.dataGrouping=J.spline.dataGrouping= +J.area.dataGrouping=J.areaspline.dataGrouping=w;J.column.dataGrouping=I(w,{approximation:"sum",groupPixelWidth:10});J.ohlc=I(J.column,{lineWidth:1,dataGrouping:{approximation:"ohlc",enabled:!0,groupPixelWidth:5},tooltip:{pointFormat:'{series.name}
Open: {point.open}
High: {point.high}
Low: {point.low}
Close: {point.close}
'},states:{hover:{lineWidth:3}},threshold:null});var w=ea(ab,{applyOptions:function(a){var b=this.series, +c=0;if(typeof a==="object"&&typeof a.length!=="number")G(this,a),this.options=a;else if(a.length){if(a.length===5){if(typeof a[0]==="string")this.name=a[0];else if(typeof a[0]==="number")this.x=a[0];c++}this.open=a[c++];this.high=a[c++];this.low=a[c++];this.close=a[c++]}this.y=this.high;if(this.x===D&&b)this.x=b.autoIncrement();return this}}),yc=ea(ma.column,{type:"ohlc",valueCount:4,pointClass:w,pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"},translate:function(){var a=this.yAxis; +ma.column.prototype.translate.apply(this);q(this.points,function(b){if(b.open!==null)b.plotOpen=a.translate(b.open,0,1,0,1);if(b.close!==null)b.plotClose=a.translate(b.close,0,1,0,1)})},drawPoints:function(){var a=this,b=a.chart,c,d,e,f,g,h,j,k;q(a.points,function(i){if(i.plotY!==D)j=i.graphic,c=i.pointAttr[i.selected?"selected":""],f=c["stroke-width"]%2/2,k=x(i.plotX)+f,g=x(i.barW/2),h=["M",k,x(i.yBottom),"L",k,x(i.plotY)],i.open!==null&&(d=x(i.plotOpen)+f,h.push("M",k,d,"L",k-g,d)),i.close!==null&& +(e=x(i.plotClose)+f,h.push("M",k,e,"L",k+g,e)),j?j.animate({d:h}):i.graphic=b.renderer.path(h).attr(c).add(a.group)})},animate:null});ma.ohlc=yc;J.candlestick=I(J.column,{dataGrouping:{approximation:"ohlc",enabled:!0},lineColor:"black",lineWidth:1,states:{hover:{lineWidth:2}},tooltip:J.ohlc.tooltip,threshold:null,upColor:"white"});w=ea(yc,{type:"candlestick",pointAttrToOptions:{fill:"color",stroke:"lineColor","stroke-width":"lineWidth"},getAttribs:function(){yc.prototype.getAttribs.apply(this,arguments); +var a=this.options,b=a.states,a=a.upColor,c=I(this.pointAttr);c[""].fill=a;c.hover.fill=b.hover.upColor||a;c.select.fill=b.select.upColor||a;q(this.points,function(a){if(a.open12?$a:Xa}));ia=!0}}function e(b){var b=a.tracker.normalizeMouseEvent(b),c=b.chartX,d=b.chartY,b=Fa?10:7;if(d>P&&dl+y&&cV&&cV+ba-B?y+wa(10,C):co&&(c=o-C),c!==y&&a.xAxis[0].setExtremes(F.translate(c,!0),F.translate(c+C,!0),!0,!1))}function f(b){b=a.tracker.normalizeMouseEvent(b);b=b.chartX;bV+ba-B&&(b=V+ba-B);w?(N=!0,d(0,0,b-l,M)):p?(N=!0,d(0,0,M,b-l)):A&&(N=!0,bo+D-C&&(b=o+D-C),d(0,0,b-D,b-D+C))}function g(){N&&a.xAxis[0].setExtremes(F.translate(y,!0),F.translate(G,!0),!0, +!1);w=p=A=N=D=null;K.cursor=S}function h(){var b=da.xAxis,c=b.getExtremes(),e=c.min,f=c.max,g=c.dataMin,c=c.dataMax,h=f-e,j,i,k,l,m;j=t.xData;var n=!!b.setExtremes;i=f>=j[j.length-1];j=e<=g;if(!u)t.options.pointStart=da.xData[0],t.setData(da.options.data,!1),m=!0;j&&(l=g,k=l+h);i&&(k=c,j||(l=O(k-h,t.xData[0])));n&&(j||i)?b.setExtremes(l,k,!0,!1):(m&&a.redraw(!1),d(O(e,g),wa(f,c)))}var j=a.renderer,k=a.options,i=k.navigator,m=i.enabled,l,o,t,u,v=k.scrollbar,s=v.enabled,w,p,A,M,D,N,F,ga,y,G,C,K=document.body.style, +S,U=i.handles,J=m?i.height:0,$=i.outlineWidth,B=s?v.height:0,W=J+B,ea=v.barBorderRadius,P,H=$/2,aa,V,ba,ia,xa=i.baseSeries,da=a.series[xa]||typeof xa==="string"&&a.get(xa)||a.series[0],la,ma,oa,ja=[],fa,n,sa,ta,pa=[],ra=[];a.resetZoomEnabled=!1;(function(){var b=a.xAxis.length,c=a.yAxis.length,d=a.setSize;a.extraBottomMargin=W+i.margin;P=i.top||a.chartHeight-J-B-k.chart.spacingBottom;if(m){var j=da.options,l=j.data,n=i.series;u=n.data;j.data=n.data=null;F=new a.Axis(I({ordinal:da.xAxis.options.ordinal}, +i.xAxis,{isX:!0,type:"datetime",index:b,height:J,top:P,offset:0,offsetLeft:B,offsetRight:-B,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1}));ga=new a.Axis(I(i.yAxis,{alignTicks:!1,height:J,top:P,offset:0,index:c,zoomEnabled:!1}));b=I(da.options,n,{threshold:null,clip:!1,enableMouseTracking:!1,group:"nav",padXAxis:!1,xAxis:b,yAxis:c,name:"Navigator",showInLegend:!1,isInternal:!0,visible:!0});j.data=l;n.data=u;b.data=u||l;t=a.initSeries(b);X(da,"updatedData",h)}else F={translate:function(b, +c){var d=a.xAxis[0].getExtremes(),e=a.plotWidth-2*B,f=d.dataMin,d=d.dataMax-f;return c?b*d/e+f:e*(b-f)/d}};a.setSize=function(b,c,e){F.options.top=ga.options.top=P=i.top||c-J-B-k.chart.spacingBottom;d.call(a,b,c,e)};X(a.container,lc,e);X(a.container,Vc,f);X(document,Wc,g)})();return{render:d,destroy:function(){ua(a.container,lc,e);ua(a.container,Vc,f);ua(document,Wc,g);m&&ua(da,"updatedData",h);q([F,ga,la,ma,oa,n,sa,ta,fa],function(a){a&&a.destroy&&a.destroy()});F=ga=la=ma=oa=n=sa=ta=fa=null;q([pa, +ja,ra],function(a){Ab(a)})},series:t,xAxis:F,yAxis:ga}};G(ja,{rangeSelector:{buttonTheme:{width:28,height:16,padding:1,r:0,zIndex:10}}});ja.lang=I(ja.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From:",rangeSelectorTo:"To:"});Highcharts.RangeSelector=function(a){function b(b,c,d){var e=a.xAxis[0],f=e&&e.getExtremes(),g=a.scroller&&a.scroller.xAxis,h=(g=g&&g.getExtremes&&g.getExtremes())&&g.dataMax,j=f&&f.dataMin,i=f&&f.dataMax,g=wa(j,r(g&&g.dataMin,j)),h=O(i,r(h,i)),k,l=e&&wa(f.max,h),f=new Date(l), +i=c.type,j=c.count,m,o,p={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(!(g===null||h===null||b===u))p[i]?(m=p[i]*j,k=O(l-m,g)):i==="month"?(f.setMonth(f.getMonth()-j),k=O(f.getTime(),g),m=2592E6*j):i==="ytd"?(f=new Date(0),i=new Date(h),o=i.getFullYear(),f.setFullYear(o),String(o)!==Bb("%Y",f)&&f.setFullYear(o-1),k=o=O(g||0,f.getTime()),i=i.getTime(),l=wa(h||i,i)):i==="year"?(f.setFullYear(f.getFullYear()-j),k=O(g,f.getTime()),m=31536E6*j):i==="all"&&e&&(k=g,l=h),s[b]&& +s[b].setState(2),e?setTimeout(function(){e.setExtremes(k,l,r(d,1),0,{rangeSelectorButton:c});u=b},1):(g=a.options.xAxis,g[0]=I(g[0],{range:m,min:o}),u=b)}function c(){i&&i.blur();m&&m.blur()}function d(a,b){var c=a.hasFocus?p.inputEditDateFormat||"%Y-%m-%d":p.inputDateFormat||"%b %e, %Y";if(b)a.HCTime=b;a.value=Bb(c,a.HCTime)}function e(b){var c=b==="min",e;l[b]=da("span",{innerHTML:j[c?"rangeSelectorFrom":"rangeSelectorTo"]},p.labelStyle,k);e=da("input",{name:b,className:gb+"range-selector",type:"text"}, +G({width:"80px",height:"16px",border:"1px solid silver",marginLeft:"5px",marginRight:c?"5px":"0",textAlign:"center"},p.inputStyle),k);e.onfocus=e.onblur=function(a){a=a||window.event;e.hasFocus=a.type==="focus";d(e)};e.onchange=function(){var b=e.value,d=Date.parse(b),f=a.xAxis[0].getExtremes();isNaN(d)&&(d=b.split("-"),d=Date.UTC(Z(d[0]),Z(d[1])-1,Z(d[2])));if(!isNaN(d)&&(c&&d>=f.dataMin&&d<=m.HCTime||!c&&d<=f.dataMax&&d>=i.HCTime))a.xAxis[0].setExtremes(c?d:f.min,c?f.max:d)};return e}var f=a.renderer, +g,h=a.container,j=ja.lang,k,i,m,l={},o,t,u,v,s=[],x,p,w=[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}];a.resetZoomEnabled=!1;(function(){a.extraTopMargin=25;p=a.options.rangeSelector;x=p.buttons||w;var d=p.selected;X(h,lc,c);d!==D&&x[d]&&b(d,x[d],!1);X(a,"load",function(){X(a.xAxis[0],"afterSetExtremes",function(){this.isDirty&&(s[u]&&s[u].setState(0),u=null)})})})(); +return{render:function(c,l){var r=a.options.chart.style,w=p.buttonTheme,A=p.inputEnabled!==!1,y=w&&w.states,D=a.plotLeft,C;g||(v=f.text(j.rangeSelectorZoom,D,a.plotTop-10).css(p.labelStyle).add(),C=D+v.getBBox().width+5,q(x,function(c,d){s[d]=f.button(c.text,C,a.plotTop-25,function(){b(d,c);this.isActive=!0},w,y&&y.hover,y&&y.select).css({textAlign:"center"}).add();C+=s[d].width+(p.buttonSpacing||0);u===d&&s[d].setState(2)}),A&&(t=k=da("div",null,{position:"relative",height:0,fontFamily:r.fontFamily, +fontSize:r.fontSize,zIndex:1}),h.parentNode.insertBefore(k,h),o=k=da("div",null,G({position:"absolute",top:a.plotTop-25+"px",right:a.chartWidth-a.plotLeft-a.plotWidth+"px"},p.inputBoxStyle),k),i=e("min"),m=e("max")));A&&(d(i,c),d(m,l));g=!0},destroy:function(){ua(h,lc,c);q([s],function(a){Ab(a)});v&&(v=v.destroy());if(i)i.onfocus=i.onblur=i.onchange=null;if(m)m.onfocus=m.onblur=m.onchange=null;q([i,m,l.min,l.max,o,t],function(a){Nb(a)});i=m=l=k=o=t=null}}};ec.prototype.callbacks.push(function(a){function b(){f= +a.xAxis[0].getExtremes();g.render(O(f.min,f.dataMin),wa(f.max,f.dataMax))}function c(){f=a.xAxis[0].getExtremes();h.render(f.min,f.max)}function d(a){g.render(a.min,a.max)}function e(a){h.render(a.min,a.max)}var f,g=a.scroller,h=a.rangeSelector;g&&(X(a.xAxis[0],"afterSetExtremes",d),X(a,"resize",b),b());h&&(X(a.xAxis[0],"afterSetExtremes",e),X(a,"resize",c),c());X(a,"destroy",function(){g&&(ua(a,"resize",b),ua(a.xAxis[0],"afterSetExtremes",d));h&&(ua(a,"resize",c),ua(a.xAxis[0],"afterSetExtremes", +e))})});Highcharts.StockChart=function(a,b){var c=a.series,d,e={marker:{enabled:!1,states:{hover:{enabled:!0,radius:5}}},shadow:!1,states:{hover:{lineWidth:2}},dataGrouping:{enabled:!0}};a.xAxis=Kb(zb(a.xAxis||{}),function(a){return I({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},showLastLabel:!0},a,{type:"datetime",categories:null})});a.yAxis=Kb(zb(a.yAxis||{}),function(a){d=a.opposite;return I({labels:{align:d?"right":"left",x:d?-2:2,y:-2},showLastLabel:!1,title:{text:null}},a)});a.series= +null;a=I({chart:{panning:!0},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:e,spline:e,area:e,areaspline:e,column:{shadow:!1,borderWidth:0,dataGrouping:{enabled:!0}}}},a,{chart:{inverted:!1}});a.series=c;return new ec(a,b)};var gd=C.init,hd=C.processData,id=ab.prototype.tooltipFormatter;C.init=function(){gd.apply(this,arguments);var a=this.options.compare;if(a)this.modifyValue=function(b, +c){var d=this.compareValue,b=a==="value"?b-d:b=100*(b/d)-100;if(c)c.change=b;return b}};C.processData=function(){hd.apply(this,arguments);if(this.options.compare)for(var a=0,b=this.processedXData,c=this.processedYData,d=c.length,e=this.xAxis.getExtremes().min;a=e){this.compareValue=c[a];break}};ab.prototype.tooltipFormatter=function(a){a=a.replace("{point.change}",(this.change>0?"+":"")+Zb(this.change,this.series.tooltipOptions.changeDecimals||2));return id.apply(this, +[a])};(function(){var a=C.init,b=C.getSegments;C.init=function(){var b,d;a.apply(this,arguments);b=this.chart;(d=this.xAxis)&&d.options.ordinal&&X(this,"updatedData",function(){delete d.ordinalIndex});if(d&&d.options.ordinal&&!d.hasOrdinalExtension){d.hasOrdinalExtension=!0;d.beforeSetTickPositions=function(){var a,b=[],c=!1,e,k=this.getExtremes(),i=k.min,k=k.max,m;if(this.options.ordinal){q(this.series,function(c,d){if(c.visible!==!1&&(b=b.concat(c.processedXData),a=b.length,d&&a)){b.sort(function(a, +b){return a-b});for(d=a-1;d--;)b[d]===b[d+1]&&b.splice(d,1)}});a=b.length;if(a>2){e=b[1]-b[0];for(m=a-1;m--&&!c;)b[m+1]-b[m]!==e&&(c=!0)}c?(this.ordinalPositions=b,c=d.val2lin(i,!0),e=d.val2lin(k,!0),this.ordinalSlope=k=(k-i)/(e-c),this.ordinalOffset=i-c*k):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=D}};d.val2lin=function(a,b){var c=this.ordinalPositions;if(c){var d=c.length,e,i;for(e=d;e--;)if(c[e]===a){i=e;break}for(e=d-1;e--;)if(a>c[e]||e===0){c=(a-c[e])/(c[e+1]-c[e]);i=e+c;break}return b? +i:this.ordinalSlope*(i||0)+this.ordinalOffset}else return a};d.lin2val=function(a,b){var c=this.ordinalPositions;if(c){var d=this.ordinalSlope,e=this.ordinalOffset,i=c.length-1,m,l;if(b)a<0?a=c[0]:a>i?a=c[i]:(i=La(a),l=a-i);else for(;i--;)if(m=d*i+e,a>=m){d=d*(i+1)+e;l=(a-m)/(d-m);break}return l!==D&&c[i]!==D?c[i]+(l?l*(c[i+1]-c[i]):0):a}else return a};d.getExtendedPositions=function(){var a=d.series[0].currentDataGrouping,e=d.ordinalIndex,h=a?a.count+a.unitName:"raw",j=d.getExtremes(),k,i;if(!e)e= +d.ordinalIndex={};if(!e[h])k={series:[],getExtremes:function(){return{min:j.dataMin,max:j.dataMax}},options:{ordinal:!0}},q(d.series,function(d){i={xAxis:k,xData:d.xData,chart:b};i.options={dataGrouping:a?{enabled:!0,forced:!0,approximation:"open",units:[[a.unitName,[a.count]]]}:{enabled:!1}};d.processData.apply(i);k.series.push(i)}),d.beforeSetTickPositions.apply(k),e[h]=k.ordinalPositions;return e[h]};d.getGroupIntervalFactor=function(a,b,c){for(var d=0,e=c.length,i=[];dc;k[o]i*5||w)q=$b(a,k[l],k[o],e),p=p.concat(q),l=o+1;if(w)break}a=q.info;if(m&&a.unitRange<=K[db]){o=p.length-1;for(l=1;lc?a-1:a;for(C=void 0;m--;)l=o[m],c=C-l,C&&c1)o&&q(o,function(a){a.setState()}),j<0?(o=u,u=d.ordinalPositions?d:u):o=d.ordinalPositions?d:u,v=u.ordinalPositions,i>v[v.length-1]&&v.push(i),o=r.apply(o,[s.apply(o,[m,!0])+j,!0]),j=r.apply(u,[s.apply(u,[l,!0])+j,!0]),o>wa(k.dataMin,m)&&ja.xAxis.closestPointRange*e&&d.splice(g+1,0,b.splice(h+1,b.length-h))})}})();G(Highcharts,{Chart:ec,dateFormat:Bb,pathAnim:Xb,getOptions:function(){return ja},hasBidiBug:bd,numberFormat:Zb,Point:ab,Color:oa,Renderer:Sb,SVGRenderer:Eb,VMLRenderer:mb,CanVGRenderer:xc, +seriesTypes:ma,setOptions:function(a){hc=I(hc,a.xAxis);tc=I(tc,a.yAxis);a.xAxis=a.yAxis=D;ja=I(ja,a);Gc();return ja},Series:ia,addEvent:X,removeEvent:ua,createElement:da,discardElement:Nb,css:W,each:q,extend:G,map:Kb,merge:I,pick:r,splat:zb,extendClass:ea,placeBox:Fc,product:"Highstock",version:"1.1.5"})})(); diff --git a/stocks/etc/www/js/jquery-1.7.2.min.js b/stocks/etc/www/js/jquery-1.7.2.min.js new file mode 100644 index 0000000..16ad06c --- /dev/null +++ b/stocks/etc/www/js/jquery-1.7.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="

"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/stocks/etc/www/js/jquery-ui-1.8.20.custom.min.js b/stocks/etc/www/js/jquery-ui-1.8.20.custom.min.js new file mode 100644 index 0000000..71ed621 --- /dev/null +++ b/stocks/etc/www/js/jquery-ui-1.8.20.custom.min.js @@ -0,0 +1,25 @@ +/*! jQuery UI - v1.8.20 - 2012-04-30 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.20",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}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_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(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.slider.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("
").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.20"})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.datepicker.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,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:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,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:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('
'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.20"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_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 d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(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=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="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)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).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){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.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"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/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;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},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 d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
'+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
'+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
'+this._get(a,"weekHeader")+"
'+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
"+(j?""+(g[0]>0&&N==g[1]-1?'
':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{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,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.20",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={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]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.20",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00'); + if (tp_inst._defaults.timezoneIso8609) + timezoneList = $.map(timezoneList, function(val) { + return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); + }); + tp_inst._defaults.timezoneList = timezoneList; + } + + tp_inst.hour = tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (o.altField) + tp_inst.$altInput = $(o.altField) + .css({ cursor: 'pointer' }) + .focus(function(){ $input.trigger("focus"); }); + + if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0) + { + tp_inst._defaults.minDate=new Date(); + } + if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0) + { + tp_inst._defaults.maxDate=new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + return tp_inst; + }, + + //######################################################################## + // add our sliders to the calendar + //######################################################################## + _addTimePicker: function(dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? + this.$input.val() + ' ' + this.$altInput.val() : + this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + //######################################################################## + // parse the time string from input value or _setTime + //######################################################################## + _parseTime: function(timeString, withDate) { + var regstr = this._defaults.timeFormat.toString() + .replace(/h{1,2}/ig, '(\\d?\\d)') + .replace(/m{1,2}/ig, '(\\d?\\d)') + .replace(/s{1,2}/ig, '(\\d?\\d)') + .replace(/l{1}/ig, '(\\d?\\d?\\d)') + .replace(/t{1,2}/ig, this._getPatternAmpm()) + .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?') + .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$', + order = this._getFormatPositions(), + ampm = '', + treg; + + if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]); + + if (withDate || !this._defaults.timeOnly) { + // the time should come after x number of characters and a space. + // x = at least the length of text specified by the date format + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + // escape special regex characters in the seperator + var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); + regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr; + } + + treg = timeString.match(new RegExp(regstr, 'i')); + + if (treg) { + if (order.t !== -1) { + if (treg[order.t] === undefined || treg[order.t].length === 0) { + ampm = ''; + this.ampm = ''; + } else { + ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM'; + this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0]; + } + } + + if (order.h !== -1) { + if (ampm == 'AM' && treg[order.h] == '12') + this.hour = 0; // 12am = 0 hour + else if (ampm == 'PM' && treg[order.h] != '12') + this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12 + else this.hour = Number(treg[order.h]); + } + + if (order.m !== -1) this.minute = Number(treg[order.m]); + if (order.s !== -1) this.second = Number(treg[order.s]); + if (order.l !== -1) this.millisec = Number(treg[order.l]); + if (order.z !== -1 && treg[order.z] !== undefined) { + var tz = treg[order.z].toUpperCase(); + switch (tz.length) { + case 1: // Z + tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000'; + break; + case 5: // +hhmm + if (this._defaults.timezoneIso8609) + tz = tz.substring(1) == '0000' + ? 'Z' + : tz.substring(0, 3) + ':' + tz.substring(3); + break; + case 6: // +hh:mm + if (!this._defaults.timezoneIso8609) + tz = tz == 'Z' || tz.substring(1) == '00:00' + ? '+0000' + : tz.replace(/:/, ''); + else if (tz.substring(1) == '00:00') + tz = 'Z'; + break; + } + this.timezone = tz; + } + + return true; + + } + return false; + }, + + //######################################################################## + // pattern for standard and localized AM/PM markers + //######################################################################## + _getPatternAmpm: function() { + var markers = [], + o = this._defaults; + if (o.amNames) + $.merge(markers, o.amNames); + if (o.pmNames) + $.merge(markers, o.pmNames); + markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&'); }); + return '(' + markers.join('|') + ')?'; + }, + + //######################################################################## + // figure out position of time elements.. cause js cant do named captures + //######################################################################## + _getFormatPositions: function() { + var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g), + orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 }; + + if (finds) + for (var i = 0; i < finds.length; i++) + if (orders[finds[i].toString().charAt(0)] == -1) + orders[finds[i].toString().charAt(0)] = i + 1; + + return orders; + }, + + //######################################################################## + // generate and inject html for timepicker into ui datepicker + //######################################################################## + _injectTimePicker: function() { + var $dp = this.inst.dpDiv, + o = this._defaults, + tp_inst = this, + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10), + minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10), + secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10), + millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10), + dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, ''); + + // Prevent displaying twice + //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) { + if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
' + + '
' + o.timeText + '
' + + '
' + + '
' + o.hourText + '
', + hourGridSize = 0, + minuteGridSize = 0, + secondGridSize = 0, + millisecGridSize = 0, + size = null; + + // Hours + html += '
'; + if (o.showHour && o.hourGrid > 0) { + html += '
'; + + for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) { + hourGridSize++; + var tmph = (o.ampm && h > 12) ? h-12 : h; + if (tmph < 10) tmph = '0' + tmph; + if (o.ampm) { + if (h == 0) tmph = 12 +'a'; + else if (h < 12) tmph += 'a'; + else tmph += 'p'; + } + html += ''; + } + + html += '
' + tmph + '
'; + } + html += '
'; + + // Minutes + html += '
' + o.minuteText + '
'+ + '
'; + + if (o.showMinute && o.minuteGrid > 0) { + html += '
'; + + for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) { + minuteGridSize++; + html += ''; + } + + html += '
' + ((m < 10) ? '0' : '') + m + '
'; + } + html += '
'; + + // Seconds + html += '
' + o.secondText + '
'+ + '
'; + + if (o.showSecond && o.secondGrid > 0) { + html += '
'; + + for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) { + secondGridSize++; + html += ''; + } + + html += '
' + ((s < 10) ? '0' : '') + s + '
'; + } + html += '
'; + + // Milliseconds + html += '
' + o.millisecText + '
'+ + '
'; + + if (o.showMillisec && o.millisecGrid > 0) { + html += '
'; + + for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) { + millisecGridSize++; + html += ''; + } + + html += '
' + ((l < 10) ? '0' : '') + l + '
'; + } + html += '
'; + + // Timezone + html += '
' + o.timezoneText + '
'; + html += '
'; + + html += '
'; + $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend( + '
' + + '
' + o.timeOnlyTitle + '
' + + '
'); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({ + orientation: "horizontal", + value: this.hour, + min: o.hourMin, + max: hourMax, + step: o.stepHour, + slide: function(event, ui) { + tp_inst.hour_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + + // Updated by Peter Medeiros: + // - Pass in Event and UI instance into slide function + this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({ + orientation: "horizontal", + value: this.minute, + min: o.minuteMin, + max: minMax, + step: o.stepMinute, + slide: function(event, ui) { + tp_inst.minute_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({ + orientation: "horizontal", + value: this.second, + min: o.secondMin, + max: secMax, + step: o.stepSecond, + slide: function(event, ui) { + tp_inst.second_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({ + orientation: "horizontal", + value: this.millisec, + min: o.millisecMin, + max: millisecMax, + step: o.stepMillisec, + slide: function(event, ui) { + tp_inst.millisec_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function(val, idx) { + return $("