diff options
| author | root <root@lalalizard.com> | 2012-11-26 12:05:40 -0500 |
|---|---|---|
| committer | root <root@lalalizard.com> | 2012-11-26 12:05:40 -0500 |
| commit | ef51b60c6481254d88c5fc3c34f4127b7f881a58 (patch) | |
| tree | 42a9596a7d53951d2a10f60fea4c2854fc9348af /frontend | |
| parent | ddc5b25b4a47ef8175aced9c06fc1767d004e826 (diff) | |
Frontend static/ folder
Diffstat (limited to 'frontend')
988 files changed, 51510 insertions, 0 deletions
diff --git a/frontend/static/avatar/.htaccess b/frontend/static/avatar/.htaccess new file mode 100644 index 0000000..2f17318 --- /dev/null +++ b/frontend/static/avatar/.htaccess @@ -0,0 +1 @@ +DirectoryIndex /cgi-bin/room.cgi?room=avatar diff --git a/frontend/static/avatar/1.gif b/frontend/static/avatar/1.gif Binary files differnew file mode 100644 index 0000000..7ee95c1 --- /dev/null +++ b/frontend/static/avatar/1.gif diff --git a/frontend/static/avatar/10.gif b/frontend/static/avatar/10.gif Binary files differnew file mode 100644 index 0000000..546d9a3 --- /dev/null +++ b/frontend/static/avatar/10.gif diff --git a/frontend/static/avatar/11.gif b/frontend/static/avatar/11.gif Binary files differnew file mode 100644 index 0000000..625039a --- /dev/null +++ b/frontend/static/avatar/11.gif diff --git a/frontend/static/avatar/12.gif b/frontend/static/avatar/12.gif Binary files differnew file mode 100644 index 0000000..d1cea36 --- /dev/null +++ b/frontend/static/avatar/12.gif diff --git a/frontend/static/avatar/13.gif b/frontend/static/avatar/13.gif Binary files differnew file mode 100644 index 0000000..b03e509 --- /dev/null +++ b/frontend/static/avatar/13.gif diff --git a/frontend/static/avatar/14.gif b/frontend/static/avatar/14.gif Binary files differnew file mode 100644 index 0000000..20f66de --- /dev/null +++ b/frontend/static/avatar/14.gif diff --git a/frontend/static/avatar/15.gif b/frontend/static/avatar/15.gif Binary files differnew file mode 100644 index 0000000..95e2379 --- /dev/null +++ b/frontend/static/avatar/15.gif diff --git a/frontend/static/avatar/16.gif b/frontend/static/avatar/16.gif Binary files differnew file mode 100644 index 0000000..1e36155 --- /dev/null +++ b/frontend/static/avatar/16.gif diff --git a/frontend/static/avatar/17.gif b/frontend/static/avatar/17.gif Binary files differnew file mode 100644 index 0000000..17dfc54 --- /dev/null +++ b/frontend/static/avatar/17.gif diff --git a/frontend/static/avatar/18.gif b/frontend/static/avatar/18.gif Binary files differnew file mode 100644 index 0000000..1cb4f0b --- /dev/null +++ b/frontend/static/avatar/18.gif diff --git a/frontend/static/avatar/19.gif b/frontend/static/avatar/19.gif Binary files differnew file mode 100644 index 0000000..9f2db15 --- /dev/null +++ b/frontend/static/avatar/19.gif diff --git a/frontend/static/avatar/2.gif b/frontend/static/avatar/2.gif Binary files differnew file mode 100644 index 0000000..d2f79ab --- /dev/null +++ b/frontend/static/avatar/2.gif diff --git a/frontend/static/avatar/20.gif b/frontend/static/avatar/20.gif Binary files differnew file mode 100644 index 0000000..0776db5 --- /dev/null +++ b/frontend/static/avatar/20.gif diff --git a/frontend/static/avatar/21.gif b/frontend/static/avatar/21.gif Binary files differnew file mode 100644 index 0000000..5b3cafa --- /dev/null +++ b/frontend/static/avatar/21.gif diff --git a/frontend/static/avatar/22.gif b/frontend/static/avatar/22.gif Binary files differnew file mode 100644 index 0000000..46c0490 --- /dev/null +++ b/frontend/static/avatar/22.gif diff --git a/frontend/static/avatar/23.gif b/frontend/static/avatar/23.gif Binary files differnew file mode 100644 index 0000000..57f6f15 --- /dev/null +++ b/frontend/static/avatar/23.gif diff --git a/frontend/static/avatar/24.gif b/frontend/static/avatar/24.gif Binary files differnew file mode 100644 index 0000000..9cedfc1 --- /dev/null +++ b/frontend/static/avatar/24.gif diff --git a/frontend/static/avatar/25.gif b/frontend/static/avatar/25.gif Binary files differnew file mode 100644 index 0000000..2953854 --- /dev/null +++ b/frontend/static/avatar/25.gif diff --git a/frontend/static/avatar/26.gif b/frontend/static/avatar/26.gif Binary files differnew file mode 100644 index 0000000..fcff54c --- /dev/null +++ b/frontend/static/avatar/26.gif diff --git a/frontend/static/avatar/27.gif b/frontend/static/avatar/27.gif Binary files differnew file mode 100644 index 0000000..8464434 --- /dev/null +++ b/frontend/static/avatar/27.gif diff --git a/frontend/static/avatar/28.gif b/frontend/static/avatar/28.gif Binary files differnew file mode 100644 index 0000000..0f9d366 --- /dev/null +++ b/frontend/static/avatar/28.gif diff --git a/frontend/static/avatar/29.gif b/frontend/static/avatar/29.gif Binary files differnew file mode 100644 index 0000000..92437f0 --- /dev/null +++ b/frontend/static/avatar/29.gif diff --git a/frontend/static/avatar/3.gif b/frontend/static/avatar/3.gif Binary files differnew file mode 100644 index 0000000..c418f68 --- /dev/null +++ b/frontend/static/avatar/3.gif diff --git a/frontend/static/avatar/30.gif b/frontend/static/avatar/30.gif Binary files differnew file mode 100644 index 0000000..0cf99c3 --- /dev/null +++ b/frontend/static/avatar/30.gif diff --git a/frontend/static/avatar/31.gif b/frontend/static/avatar/31.gif Binary files differnew file mode 100644 index 0000000..d4468ef --- /dev/null +++ b/frontend/static/avatar/31.gif diff --git a/frontend/static/avatar/32.gif b/frontend/static/avatar/32.gif Binary files differnew file mode 100644 index 0000000..764e78e --- /dev/null +++ b/frontend/static/avatar/32.gif diff --git a/frontend/static/avatar/33.gif b/frontend/static/avatar/33.gif Binary files differnew file mode 100644 index 0000000..9553e99 --- /dev/null +++ b/frontend/static/avatar/33.gif diff --git a/frontend/static/avatar/34.gif b/frontend/static/avatar/34.gif Binary files differnew file mode 100644 index 0000000..b1cdf60 --- /dev/null +++ b/frontend/static/avatar/34.gif diff --git a/frontend/static/avatar/35.gif b/frontend/static/avatar/35.gif Binary files differnew file mode 100644 index 0000000..313e544 --- /dev/null +++ b/frontend/static/avatar/35.gif diff --git a/frontend/static/avatar/36.gif b/frontend/static/avatar/36.gif Binary files differnew file mode 100644 index 0000000..7723b8b --- /dev/null +++ b/frontend/static/avatar/36.gif diff --git a/frontend/static/avatar/37.gif b/frontend/static/avatar/37.gif Binary files differnew file mode 100644 index 0000000..2537465 --- /dev/null +++ b/frontend/static/avatar/37.gif diff --git a/frontend/static/avatar/38.gif b/frontend/static/avatar/38.gif Binary files differnew file mode 100644 index 0000000..473dace --- /dev/null +++ b/frontend/static/avatar/38.gif diff --git a/frontend/static/avatar/39.gif b/frontend/static/avatar/39.gif Binary files differnew file mode 100644 index 0000000..4a04fb4 --- /dev/null +++ b/frontend/static/avatar/39.gif diff --git a/frontend/static/avatar/4.gif b/frontend/static/avatar/4.gif Binary files differnew file mode 100644 index 0000000..ad1bf28 --- /dev/null +++ b/frontend/static/avatar/4.gif diff --git a/frontend/static/avatar/40.gif b/frontend/static/avatar/40.gif Binary files differnew file mode 100644 index 0000000..07c4c01 --- /dev/null +++ b/frontend/static/avatar/40.gif diff --git a/frontend/static/avatar/41.gif b/frontend/static/avatar/41.gif Binary files differnew file mode 100644 index 0000000..d8b37a6 --- /dev/null +++ b/frontend/static/avatar/41.gif diff --git a/frontend/static/avatar/42.gif b/frontend/static/avatar/42.gif Binary files differnew file mode 100644 index 0000000..b102ba6 --- /dev/null +++ b/frontend/static/avatar/42.gif diff --git a/frontend/static/avatar/43.gif b/frontend/static/avatar/43.gif Binary files differnew file mode 100644 index 0000000..dc990c7 --- /dev/null +++ b/frontend/static/avatar/43.gif diff --git a/frontend/static/avatar/44.gif b/frontend/static/avatar/44.gif Binary files differnew file mode 100644 index 0000000..bf4ef70 --- /dev/null +++ b/frontend/static/avatar/44.gif diff --git a/frontend/static/avatar/45.gif b/frontend/static/avatar/45.gif Binary files differnew file mode 100644 index 0000000..ee56332 --- /dev/null +++ b/frontend/static/avatar/45.gif diff --git a/frontend/static/avatar/46.gif b/frontend/static/avatar/46.gif Binary files differnew file mode 100644 index 0000000..0ebfc94 --- /dev/null +++ b/frontend/static/avatar/46.gif diff --git a/frontend/static/avatar/47.gif b/frontend/static/avatar/47.gif Binary files differnew file mode 100644 index 0000000..0996a5c --- /dev/null +++ b/frontend/static/avatar/47.gif diff --git a/frontend/static/avatar/48.gif b/frontend/static/avatar/48.gif Binary files differnew file mode 100644 index 0000000..5b0cf68 --- /dev/null +++ b/frontend/static/avatar/48.gif diff --git a/frontend/static/avatar/49.gif b/frontend/static/avatar/49.gif Binary files differnew file mode 100644 index 0000000..7210952 --- /dev/null +++ b/frontend/static/avatar/49.gif diff --git a/frontend/static/avatar/5.gif b/frontend/static/avatar/5.gif Binary files differnew file mode 100644 index 0000000..340bb71 --- /dev/null +++ b/frontend/static/avatar/5.gif diff --git a/frontend/static/avatar/50.gif b/frontend/static/avatar/50.gif Binary files differnew file mode 100644 index 0000000..83431cd --- /dev/null +++ b/frontend/static/avatar/50.gif diff --git a/frontend/static/avatar/51.gif b/frontend/static/avatar/51.gif Binary files differnew file mode 100644 index 0000000..2e502fb --- /dev/null +++ b/frontend/static/avatar/51.gif diff --git a/frontend/static/avatar/52.gif b/frontend/static/avatar/52.gif Binary files differnew file mode 100644 index 0000000..815d0f1 --- /dev/null +++ b/frontend/static/avatar/52.gif diff --git a/frontend/static/avatar/53.gif b/frontend/static/avatar/53.gif Binary files differnew file mode 100644 index 0000000..a98fc6b --- /dev/null +++ b/frontend/static/avatar/53.gif diff --git a/frontend/static/avatar/54.gif b/frontend/static/avatar/54.gif Binary files differnew file mode 100644 index 0000000..c774510 --- /dev/null +++ b/frontend/static/avatar/54.gif diff --git a/frontend/static/avatar/55.gif b/frontend/static/avatar/55.gif Binary files differnew file mode 100644 index 0000000..c55d5e6 --- /dev/null +++ b/frontend/static/avatar/55.gif diff --git a/frontend/static/avatar/56.gif b/frontend/static/avatar/56.gif Binary files differnew file mode 100644 index 0000000..5d4ca9f --- /dev/null +++ b/frontend/static/avatar/56.gif diff --git a/frontend/static/avatar/57.gif b/frontend/static/avatar/57.gif Binary files differnew file mode 100644 index 0000000..e27ee31 --- /dev/null +++ b/frontend/static/avatar/57.gif diff --git a/frontend/static/avatar/58.gif b/frontend/static/avatar/58.gif Binary files differnew file mode 100644 index 0000000..14a2398 --- /dev/null +++ b/frontend/static/avatar/58.gif diff --git a/frontend/static/avatar/59.gif b/frontend/static/avatar/59.gif Binary files differnew file mode 100644 index 0000000..b1be329 --- /dev/null +++ b/frontend/static/avatar/59.gif diff --git a/frontend/static/avatar/6.gif b/frontend/static/avatar/6.gif Binary files differnew file mode 100644 index 0000000..442549d --- /dev/null +++ b/frontend/static/avatar/6.gif diff --git a/frontend/static/avatar/60.gif b/frontend/static/avatar/60.gif Binary files differnew file mode 100644 index 0000000..8957756 --- /dev/null +++ b/frontend/static/avatar/60.gif diff --git a/frontend/static/avatar/61.gif b/frontend/static/avatar/61.gif Binary files differnew file mode 100644 index 0000000..0b1c51b --- /dev/null +++ b/frontend/static/avatar/61.gif diff --git a/frontend/static/avatar/62.gif b/frontend/static/avatar/62.gif Binary files differnew file mode 100644 index 0000000..36e3147 --- /dev/null +++ b/frontend/static/avatar/62.gif diff --git a/frontend/static/avatar/63.gif b/frontend/static/avatar/63.gif Binary files differnew file mode 100644 index 0000000..a455996 --- /dev/null +++ b/frontend/static/avatar/63.gif diff --git a/frontend/static/avatar/64.gif b/frontend/static/avatar/64.gif Binary files differnew file mode 100644 index 0000000..d35a25e --- /dev/null +++ b/frontend/static/avatar/64.gif diff --git a/frontend/static/avatar/65.gif b/frontend/static/avatar/65.gif Binary files differnew file mode 100644 index 0000000..d2fb851 --- /dev/null +++ b/frontend/static/avatar/65.gif diff --git a/frontend/static/avatar/66.gif b/frontend/static/avatar/66.gif Binary files differnew file mode 100644 index 0000000..f5121d0 --- /dev/null +++ b/frontend/static/avatar/66.gif diff --git a/frontend/static/avatar/67.gif b/frontend/static/avatar/67.gif Binary files differnew file mode 100644 index 0000000..94f3454 --- /dev/null +++ b/frontend/static/avatar/67.gif diff --git a/frontend/static/avatar/68.gif b/frontend/static/avatar/68.gif Binary files differnew file mode 100644 index 0000000..551a7af --- /dev/null +++ b/frontend/static/avatar/68.gif diff --git a/frontend/static/avatar/69.gif b/frontend/static/avatar/69.gif Binary files differnew file mode 100644 index 0000000..abb12f7 --- /dev/null +++ b/frontend/static/avatar/69.gif diff --git a/frontend/static/avatar/7.gif b/frontend/static/avatar/7.gif Binary files differnew file mode 100644 index 0000000..580cad4 --- /dev/null +++ b/frontend/static/avatar/7.gif diff --git a/frontend/static/avatar/70.gif b/frontend/static/avatar/70.gif Binary files differnew file mode 100644 index 0000000..1771e20 --- /dev/null +++ b/frontend/static/avatar/70.gif diff --git a/frontend/static/avatar/71.gif b/frontend/static/avatar/71.gif Binary files differnew file mode 100644 index 0000000..d08d382 --- /dev/null +++ b/frontend/static/avatar/71.gif diff --git a/frontend/static/avatar/72.gif b/frontend/static/avatar/72.gif Binary files differnew file mode 100644 index 0000000..cfe304f --- /dev/null +++ b/frontend/static/avatar/72.gif diff --git a/frontend/static/avatar/8.gif b/frontend/static/avatar/8.gif Binary files differnew file mode 100644 index 0000000..1c96e52 --- /dev/null +++ b/frontend/static/avatar/8.gif diff --git a/frontend/static/avatar/9.gif b/frontend/static/avatar/9.gif Binary files differnew file mode 100644 index 0000000..b70f7d9 --- /dev/null +++ b/frontend/static/avatar/9.gif diff --git a/frontend/static/avatar/Predator.jpg b/frontend/static/avatar/Predator.jpg Binary files differnew file mode 100644 index 0000000..2b485ac --- /dev/null +++ b/frontend/static/avatar/Predator.jpg diff --git a/frontend/static/avatar/arcane2.gif b/frontend/static/avatar/arcane2.gif Binary files differnew file mode 100644 index 0000000..d2f79ab --- /dev/null +++ b/frontend/static/avatar/arcane2.gif diff --git a/frontend/static/bgz/1294086971317-dumpfm-GucciSoFlosy-idgiinout.gif b/frontend/static/bgz/1294086971317-dumpfm-GucciSoFlosy-idgiinout.gif Binary files differnew file mode 100644 index 0000000..7beeb6a --- /dev/null +++ b/frontend/static/bgz/1294086971317-dumpfm-GucciSoFlosy-idgiinout.gif diff --git a/frontend/static/bgz/1300743917959-dumpfm-pepper-argus_glitter.gif b/frontend/static/bgz/1300743917959-dumpfm-pepper-argus_glitter.gif Binary files differnew file mode 100644 index 0000000..9e0123b --- /dev/null +++ b/frontend/static/bgz/1300743917959-dumpfm-pepper-argus_glitter.gif diff --git a/frontend/static/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif b/frontend/static/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif Binary files differnew file mode 100644 index 0000000..3dd1c0a --- /dev/null +++ b/frontend/static/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif diff --git a/frontend/static/bgz/2181Series.gif b/frontend/static/bgz/2181Series.gif Binary files differnew file mode 100644 index 0000000..dd8bafe --- /dev/null +++ b/frontend/static/bgz/2181Series.gif diff --git a/frontend/static/bgz/8-planet-jupiter-map.jpg b/frontend/static/bgz/8-planet-jupiter-map.jpg Binary files differnew file mode 100644 index 0000000..9205499 --- /dev/null +++ b/frontend/static/bgz/8-planet-jupiter-map.jpg diff --git a/frontend/static/bgz/DarktowerL_gendler.jpg b/frontend/static/bgz/DarktowerL_gendler.jpg Binary files differnew file mode 100644 index 0000000..3e415aa --- /dev/null +++ b/frontend/static/bgz/DarktowerL_gendler.jpg diff --git a/frontend/static/bgz/Tropic_Of_Cancer_-_The_Sorrow_Of_Two_Blooms.jpg b/frontend/static/bgz/Tropic_Of_Cancer_-_The_Sorrow_Of_Two_Blooms.jpg Binary files differnew file mode 100644 index 0000000..378a1c1 --- /dev/null +++ b/frontend/static/bgz/Tropic_Of_Cancer_-_The_Sorrow_Of_Two_Blooms.jpg diff --git a/frontend/static/bgz/argus.gif b/frontend/static/bgz/argus.gif Binary files differnew file mode 100644 index 0000000..b94a60a --- /dev/null +++ b/frontend/static/bgz/argus.gif diff --git a/frontend/static/bgz/birdcage_grid.jpg b/frontend/static/bgz/birdcage_grid.jpg Binary files differnew file mode 100644 index 0000000..551eff3 --- /dev/null +++ b/frontend/static/bgz/birdcage_grid.jpg diff --git a/frontend/static/bgz/cageumbrellaz.jpg b/frontend/static/bgz/cageumbrellaz.jpg Binary files differnew file mode 100644 index 0000000..e89452a --- /dev/null +++ b/frontend/static/bgz/cageumbrellaz.jpg diff --git a/frontend/static/bgz/cloudz1.png b/frontend/static/bgz/cloudz1.png Binary files differnew file mode 100644 index 0000000..fc83e06 --- /dev/null +++ b/frontend/static/bgz/cloudz1.png diff --git a/frontend/static/bgz/cloudz2.png b/frontend/static/bgz/cloudz2.png Binary files differnew file mode 100644 index 0000000..d563639 --- /dev/null +++ b/frontend/static/bgz/cloudz2.png diff --git a/frontend/static/bgz/crystalz.png b/frontend/static/bgz/crystalz.png Binary files differnew file mode 100644 index 0000000..925de31 --- /dev/null +++ b/frontend/static/bgz/crystalz.png diff --git a/frontend/static/bgz/darktower.jpg b/frontend/static/bgz/darktower.jpg Binary files differnew file mode 100644 index 0000000..5f45a99 --- /dev/null +++ b/frontend/static/bgz/darktower.jpg diff --git a/frontend/static/bgz/diornights.jpg b/frontend/static/bgz/diornights.jpg Binary files differnew file mode 100644 index 0000000..d7e5bef --- /dev/null +++ b/frontend/static/bgz/diornights.jpg diff --git a/frontend/static/bgz/fingerlings-butterflies.png b/frontend/static/bgz/fingerlings-butterflies.png Binary files differnew file mode 100644 index 0000000..6fd117f --- /dev/null +++ b/frontend/static/bgz/fingerlings-butterflies.png diff --git a/frontend/static/bgz/fingerlings.gif b/frontend/static/bgz/fingerlings.gif Binary files differnew file mode 100644 index 0000000..02c15cb --- /dev/null +++ b/frontend/static/bgz/fingerlings.gif diff --git a/frontend/static/bgz/fingerlings2.png b/frontend/static/bgz/fingerlings2.png Binary files differnew file mode 100644 index 0000000..247497d --- /dev/null +++ b/frontend/static/bgz/fingerlings2.png diff --git a/frontend/static/bgz/fingerlings3.jpg b/frontend/static/bgz/fingerlings3.jpg Binary files differnew file mode 100644 index 0000000..2c2659b --- /dev/null +++ b/frontend/static/bgz/fingerlings3.jpg diff --git a/frontend/static/bgz/geodesic-brick.png b/frontend/static/bgz/geodesic-brick.png Binary files differnew file mode 100644 index 0000000..df1e605 --- /dev/null +++ b/frontend/static/bgz/geodesic-brick.png diff --git a/frontend/static/bgz/geodesic.png b/frontend/static/bgz/geodesic.png Binary files differnew file mode 100644 index 0000000..eaff1f6 --- /dev/null +++ b/frontend/static/bgz/geodesic.png diff --git a/frontend/static/bgz/gridzer01.gif b/frontend/static/bgz/gridzer01.gif Binary files differnew file mode 100644 index 0000000..0820b7f --- /dev/null +++ b/frontend/static/bgz/gridzer01.gif diff --git a/frontend/static/bgz/gridzy1.jpg b/frontend/static/bgz/gridzy1.jpg Binary files differnew file mode 100644 index 0000000..42236c9 --- /dev/null +++ b/frontend/static/bgz/gridzy1.jpg diff --git a/frontend/static/bgz/gridzy10.jpg b/frontend/static/bgz/gridzy10.jpg Binary files differnew file mode 100644 index 0000000..24275e4 --- /dev/null +++ b/frontend/static/bgz/gridzy10.jpg diff --git a/frontend/static/bgz/gridzy2.jpg b/frontend/static/bgz/gridzy2.jpg Binary files differnew file mode 100644 index 0000000..212fa8b --- /dev/null +++ b/frontend/static/bgz/gridzy2.jpg diff --git a/frontend/static/bgz/gridzy3.jpg b/frontend/static/bgz/gridzy3.jpg Binary files differnew file mode 100644 index 0000000..7b7885d --- /dev/null +++ b/frontend/static/bgz/gridzy3.jpg diff --git a/frontend/static/bgz/gridzy4.jpg b/frontend/static/bgz/gridzy4.jpg Binary files differnew file mode 100644 index 0000000..e74b92c --- /dev/null +++ b/frontend/static/bgz/gridzy4.jpg diff --git a/frontend/static/bgz/gridzy5.jpg b/frontend/static/bgz/gridzy5.jpg Binary files differnew file mode 100644 index 0000000..16ff052 --- /dev/null +++ b/frontend/static/bgz/gridzy5.jpg diff --git a/frontend/static/bgz/gridzy6.jpg b/frontend/static/bgz/gridzy6.jpg Binary files differnew file mode 100644 index 0000000..fb88337 --- /dev/null +++ b/frontend/static/bgz/gridzy6.jpg diff --git a/frontend/static/bgz/gridzy7.jpg b/frontend/static/bgz/gridzy7.jpg Binary files differnew file mode 100644 index 0000000..6ff5c6e --- /dev/null +++ b/frontend/static/bgz/gridzy7.jpg diff --git a/frontend/static/bgz/gridzy8.jpg b/frontend/static/bgz/gridzy8.jpg Binary files differnew file mode 100644 index 0000000..fcdf9c2 --- /dev/null +++ b/frontend/static/bgz/gridzy8.jpg diff --git a/frontend/static/bgz/gridzy9.jpg b/frontend/static/bgz/gridzy9.jpg Binary files differnew file mode 100644 index 0000000..9f9fc27 --- /dev/null +++ b/frontend/static/bgz/gridzy9.jpg diff --git a/frontend/static/bgz/index.html b/frontend/static/bgz/index.html new file mode 100644 index 0000000..d0264c5 --- /dev/null +++ b/frontend/static/bgz/index.html @@ -0,0 +1,13 @@ +<html> +<head> +<meta http-equiv="Refresh" + content="0; URL=http://scannerjammer.com:17769/"> +</head> +<body> +<br> +Sending you through to + <a href="http://scannerjammer.com:17769/">Scanner Jammer</a>..! +<br> +</body> +</html> + diff --git a/frontend/static/bgz/jupiter-aurora.jpg b/frontend/static/bgz/jupiter-aurora.jpg Binary files differnew file mode 100644 index 0000000..03eba32 --- /dev/null +++ b/frontend/static/bgz/jupiter-aurora.jpg diff --git a/frontend/static/bgz/jupiteraurora.jpg b/frontend/static/bgz/jupiteraurora.jpg Binary files differnew file mode 100644 index 0000000..28ab86c --- /dev/null +++ b/frontend/static/bgz/jupiteraurora.jpg diff --git a/frontend/static/bgz/lavender.jpg b/frontend/static/bgz/lavender.jpg Binary files differnew file mode 100644 index 0000000..4795f5b --- /dev/null +++ b/frontend/static/bgz/lavender.jpg diff --git a/frontend/static/bgz/morrocorace.png b/frontend/static/bgz/morrocorace.png Binary files differnew file mode 100644 index 0000000..0c4c715 --- /dev/null +++ b/frontend/static/bgz/morrocorace.png diff --git a/frontend/static/bgz/mountainz.png b/frontend/static/bgz/mountainz.png Binary files differnew file mode 100644 index 0000000..82743b7 --- /dev/null +++ b/frontend/static/bgz/mountainz.png diff --git a/frontend/static/bgz/mountainz2.png b/frontend/static/bgz/mountainz2.png Binary files differnew file mode 100644 index 0000000..17d62da --- /dev/null +++ b/frontend/static/bgz/mountainz2.png diff --git a/frontend/static/bgz/mountainz3.png b/frontend/static/bgz/mountainz3.png Binary files differnew file mode 100644 index 0000000..6eccf9a --- /dev/null +++ b/frontend/static/bgz/mountainz3.png diff --git a/frontend/static/bgz/ocian1.gif b/frontend/static/bgz/ocian1.gif Binary files differnew file mode 100644 index 0000000..db46984 --- /dev/null +++ b/frontend/static/bgz/ocian1.gif diff --git a/frontend/static/bgz/ocian2.gif b/frontend/static/bgz/ocian2.gif Binary files differnew file mode 100644 index 0000000..5637a75 --- /dev/null +++ b/frontend/static/bgz/ocian2.gif diff --git a/frontend/static/bgz/ocian3.gif b/frontend/static/bgz/ocian3.gif Binary files differnew file mode 100644 index 0000000..70b88a0 --- /dev/null +++ b/frontend/static/bgz/ocian3.gif diff --git a/frontend/static/bgz/ocian4.gif b/frontend/static/bgz/ocian4.gif Binary files differnew file mode 100644 index 0000000..a423adc --- /dev/null +++ b/frontend/static/bgz/ocian4.gif diff --git a/frontend/static/bgz/ocian4.jpg b/frontend/static/bgz/ocian4.jpg Binary files differnew file mode 100644 index 0000000..9243384 --- /dev/null +++ b/frontend/static/bgz/ocian4.jpg diff --git a/frontend/static/bgz/orlynails.jpg b/frontend/static/bgz/orlynails.jpg Binary files differnew file mode 100644 index 0000000..ac8ddc8 --- /dev/null +++ b/frontend/static/bgz/orlynails.jpg diff --git a/frontend/static/bgz/scannerjammer_cyberspace.jpg b/frontend/static/bgz/scannerjammer_cyberspace.jpg Binary files differnew file mode 100644 index 0000000..a2aec26 --- /dev/null +++ b/frontend/static/bgz/scannerjammer_cyberspace.jpg diff --git a/frontend/static/bgz/sewergreatsbg.jpg b/frontend/static/bgz/sewergreatsbg.jpg Binary files differnew file mode 100644 index 0000000..e3cd0cc --- /dev/null +++ b/frontend/static/bgz/sewergreatsbg.jpg diff --git a/frontend/static/bgz/sewergreatscorner.jpg b/frontend/static/bgz/sewergreatscorner.jpg Binary files differnew file mode 100644 index 0000000..1cb0757 --- /dev/null +++ b/frontend/static/bgz/sewergreatscorner.jpg diff --git a/frontend/static/bgz/sewergreatsvol1.jpg b/frontend/static/bgz/sewergreatsvol1.jpg Binary files differnew file mode 100644 index 0000000..62f1cf2 --- /dev/null +++ b/frontend/static/bgz/sewergreatsvol1.jpg diff --git a/frontend/static/bgz/starfield.jpg b/frontend/static/bgz/starfield.jpg Binary files differnew file mode 100644 index 0000000..1dd119a --- /dev/null +++ b/frontend/static/bgz/starfield.jpg diff --git a/frontend/static/bgz/triangledeluxe.jpg b/frontend/static/bgz/triangledeluxe.jpg Binary files differnew file mode 100644 index 0000000..fc25478 --- /dev/null +++ b/frontend/static/bgz/triangledeluxe.jpg diff --git a/frontend/static/bgz/visual6502.jpg b/frontend/static/bgz/visual6502.jpg Binary files differnew file mode 100644 index 0000000..819cb61 --- /dev/null +++ b/frontend/static/bgz/visual6502.jpg diff --git a/frontend/static/bgz/waterfall.gif b/frontend/static/bgz/waterfall.gif Binary files differnew file mode 100644 index 0000000..49ba75d --- /dev/null +++ b/frontend/static/bgz/waterfall.gif diff --git a/frontend/static/bgz/waterfall2.gif b/frontend/static/bgz/waterfall2.gif Binary files differnew file mode 100644 index 0000000..63c93c4 --- /dev/null +++ b/frontend/static/bgz/waterfall2.gif diff --git a/frontend/static/bgz/whitesquare.gif b/frontend/static/bgz/whitesquare.gif Binary files differnew file mode 100644 index 0000000..4616123 --- /dev/null +++ b/frontend/static/bgz/whitesquare.gif diff --git a/frontend/static/css/dump.css b/frontend/static/css/dump.css new file mode 100644 index 0000000..d0327e7 --- /dev/null +++ b/frontend/static/css/dump.css @@ -0,0 +1,70 @@ +#logo h1 + { + color: #468; + } +#chat a.u + { + color: #f08; + font-weight: bold; + text-shadow: #000 0 0 2px; + } +#chatbg + { + background-color: #000; + opacity: 0.7; + } +#lastlogbg + { + background-color: #000; + opacity: 0.8; + } +#playlistbg + { + background-color: #000; + opacity: 0.8; + } +#chat span a + { + color: #03f; + opacity: 1; + } +#queue li + { + } +#queue li.selected + { + background-color: #000; + } +#queue li span.yt + { + } +#queue li.selected span.yt + { + } +#queue li a + { + color: #f24; + letter-spacing: -1px; + } +#queue li.selected a + { + color: #f08; + } +#queue li span.like + { + color: #bbb; + } +#queue li.selected span.like + { + color: #888; + } +#queue li.liked span.like + { + color: #999; + font-weight: bold; + } +#queue li.selected.liked span.like + { + color: #fff; + font-weight: bold; + } diff --git a/frontend/static/css/sasscss b/frontend/static/css/sasscss new file mode 120000 index 0000000..3d25004 --- /dev/null +++ b/frontend/static/css/sasscss @@ -0,0 +1 @@ +../sass/stylesheets/
\ No newline at end of file diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_0_aaaaaa_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_0_aaaaaa_40x100.png Binary files differnew file mode 100644 index 0000000..5b5dab2 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_0_aaaaaa_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_0_eeeeee_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_0_eeeeee_40x100.png Binary files differnew file mode 100644 index 0000000..e44f861 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_0_eeeeee_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_100_381c63_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_100_381c63_40x100.png Binary files differnew file mode 100644 index 0000000..2bce760 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_100_381c63_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_35_dddddd_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_35_dddddd_40x100.png Binary files differnew file mode 100644 index 0000000..4dd3c68 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_35_dddddd_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_50_ededed_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_50_ededed_40x100.png Binary files differnew file mode 100644 index 0000000..4b631ff --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_50_ededed_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_55_c0402a_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_55_c0402a_40x100.png Binary files differnew file mode 100644 index 0000000..b8c9bb1 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_55_c0402a_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_55_fdf9d8_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_55_fdf9d8_40x100.png Binary files differnew file mode 100644 index 0000000..de4be91 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_55_fdf9d8_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_60_edebef_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_60_edebef_40x100.png Binary files differnew file mode 100644 index 0000000..3460078 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_60_edebef_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-bg_flat_75_8566a9_40x100.png b/frontend/static/css/ui-purple2/images/ui-bg_flat_75_8566a9_40x100.png Binary files differnew file mode 100644 index 0000000..4f0ab16 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-bg_flat_75_8566a9_40x100.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_6d33bb_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_6d33bb_256x240.png Binary files differnew file mode 100644 index 0000000..d11f501 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_6d33bb_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_7d5bbe_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_7d5bbe_256x240.png Binary files differnew file mode 100644 index 0000000..2758cf3 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_7d5bbe_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_817693_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_817693_256x240.png Binary files differnew file mode 100644 index 0000000..27a7ba0 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_817693_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_9e70e1_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_9e70e1_256x240.png Binary files differnew file mode 100644 index 0000000..7187858 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_9e70e1_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_aa8fd1_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_aa8fd1_256x240.png Binary files differnew file mode 100644 index 0000000..41a1b27 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_aa8fd1_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_edecee_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_edecee_256x240.png Binary files differnew file mode 100644 index 0000000..01bb36b --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_edecee_256x240.png diff --git a/frontend/static/css/ui-purple2/images/ui-icons_fbc856_256x240.png b/frontend/static/css/ui-purple2/images/ui-icons_fbc856_256x240.png Binary files differnew file mode 100644 index 0000000..9d1b027 --- /dev/null +++ b/frontend/static/css/ui-purple2/images/ui-icons_fbc856_256x240.png diff --git a/frontend/static/css/ui-purple2/jquery-ui-1.8.13.custom.css b/frontend/static/css/ui-purple2/jquery-ui-1.8.13.custom.css new file mode 100644 index 0000000..647be01 --- /dev/null +++ b/frontend/static/css/ui-purple2/jquery-ui-1.8.13.custom.css @@ -0,0 +1,362 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.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.13 + * + * Copyright 2011, 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,%20Helvetica,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=dddddd&bgTextureHeader=01_flat.png&bgImgOpacityHeader=35&borderColorHeader=ccccd1&fcHeader=444444&iconColorHeader=aa8fd1&bgColorContent=ededed&bgTextureContent=01_flat.png&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=888686&iconColorContent=edecee&bgColorDefault=edebef&bgTextureDefault=01_flat.png&bgImgOpacityDefault=60&borderColorDefault=f3eed8&fcDefault=7e5cb7&iconColorDefault=9e70e1&bgColorHover=381c63&bgTextureHover=01_flat.png&bgImgOpacityHover=100&borderColorHover=e0e0e0&fcHover=e7e2e9&iconColorHover=7d5bbe&bgColorActive=8566a9&bgTextureActive=01_flat.png&bgImgOpacityActive=75&borderColorActive=f7df3b&fcActive=ffffff&iconColorActive=817693&bgColorHighlight=fdf9d8&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=b080fa&fcHighlight=9c5e5e&iconColorHighlight=6d33bb&bgColorError=c0402a&bgTextureError=01_flat.png&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow=0px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Helvetica, 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, Helvetica, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ededed url(images/ui-bg_flat_50_ededed_40x100.png) 50% 50% repeat-x; color: #888686; } +.ui-widget-content a { color: #888686; } +.ui-widget-header { border: 1px solid #ccccd1; background: #dddddd url(images/ui-bg_flat_35_dddddd_40x100.png) 50% 50% repeat-x; color: #444444; font-weight: bold; } +.ui-widget-header a { color: #444444; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #f3eed8; background: #edebef url(images/ui-bg_flat_60_edebef_40x100.png) 50% 50% repeat-x; font-weight: bold; color: #7e5cb7; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #7e5cb7; 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 #e0e0e0; background: #381c63 url(images/ui-bg_flat_100_381c63_40x100.png) 50% 50% repeat-x; font-weight: bold; color: #e7e2e9; } +.ui-state-hover a, .ui-state-hover a:hover { color: #e7e2e9; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #f7df3b; background: #8566a9 url(images/ui-bg_flat_75_8566a9_40x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; 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 #b080fa; background: #fdf9d8 url(images/ui-bg_flat_55_fdf9d8_40x100.png) 50% 50% repeat-x; color: #9c5e5e; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #9c5e5e; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #c0402a; background: #c0402a url(images/ui-bg_flat_55_c0402a_40x100.png) 50% 50% repeat-x; 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_edecee_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_edecee_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_aa8fd1_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_9e70e1_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_7d5bbe_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_817693_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_6d33bb_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_fbc856_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-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; } +.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; } + +/* Overlays */ +.ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); } +.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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%; } + +/* 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/frontend/static/css/used_to_be_called_chat.css b/frontend/static/css/used_to_be_called_chat.css new file mode 100644 index 0000000..8cbe833 --- /dev/null +++ b/frontend/static/css/used_to_be_called_chat.css @@ -0,0 +1,621 @@ +* + { + padding:0; + margin: 0; + } +body + { + background: #000; + font-family: trebuchet ms, helvetica, arial, sans-serif; + } +a + { + text-decoration: none; + } +a:hover + { + text-decoration: underline; + } +#bg + { + position: fixed; + top: 0; + left: 0; + opacity: 1; + z-index: -3; + display: none; + } + +#curtain + { + background: #080810; + opacity: 0.3; + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 10; + } +#login + { + background: #000; + display: block; + width: 50%; + top: 20%; + left: 50%; + margin-left: -25%; + padding: 30px; + padding-bottom: 60px; + z-index: 20; + position: fixed; + text-align: center; + } +#login img + { + margin-bottom: 20px; + } +#login label + { + min-width: 20%; + display: inline-block; + text-align: right; + padding-right: 10px; + font-size: 18px; + color: #fff; + } +#login #button-shim + { + width: 30%; + display: inline-block; + text-align: left; + padding: 10px 10px 10px 0; + margin-right: 20px; + } +#login-username, #login-password + { + width: 30%; + margin-right: 10px; + font-size: 24px; + border: 2px solid #806; + padding: 10px; + } +#login a + { + color: #68f; + text-decoration: underline; + } +#sitez + { + position: absolute; + top: 30px; + right: 30px; + color: #888; + z-index: 21; + color: #aaa; + } +#sitez a, #sitez #logout + { + cursor: pointer; + color: #aaa; + text-decoration: underline; + } +#sitez select option + { + color: #666; + text-decoration: none; + padding-right: 3px; + } +button + { + font-size: 24px; + background: #030303; + color: #fff; + padding: 2px; + } +nav + { + z-index: 10; + margin: 0 auto; + } +nav button + { + background-color: #080808; + font-size: 14px; + min-width: 40px; + min-height: 20px; + padding: 5px 5px; + position: relative; + top: -3px; + } +nav button#like.liked + { + background-color: #804; + color: #fff8ee; + } +nav button#like + { + background-color: #312; + color: #fed; + } +nav #vidlink + { + margin: 14px 0 0 10px; + padding: 2px; + display: inline-block; + font-size: 14px; + color: #8b8; + position: relative; + cursor: pointer; + top: -2px; + background-color: #000; + } +nav button#scan + { + margin-left: 10px; + } +button#scan.blinkOn + { + color: #fff; + background-color: #f8f; + } +button#scan.blinkOff + { + color: #ff0; + background-color: #80f; + } +button#pause + { + color: #38f; + font-weight: bold; + min-width: 50px; + } +#login #button-shim button + { + padding: 2px 5px; + } +#login #noemail + { + color: #ddd; + } +#lunacy + { + z-index: 40; + background: #ddd; + color: #000; + display: block; + width: 700px; + position: fixed; + top: 20%; + left: 50%; + margin-left: -390px; + opacity: 0.7; + padding: 40px; + text-align: center; + font-size: 48px; + } +#plea + { + z-index: 30; + background: #ddd; + color: #000; + display: block; + width: 400px; + position: fixed; + top: 20%; + left: 50%; + margin-left: -240px; + opacity: 0.7; + padding: 40px; + text-align: center; + font-size: 48px; + } +#loading + { + z-index: 20; + background: transparent; + color: #06033c; + text-shadow: #060363 0 0 50px; + display: block; + position: fixed; + width: 100%; + padding: 20px; + top: 30%; + left: 10%; + font-size: 170px; + font-weight: bold; + text-align: left; + white-space: no-wrap; + letter-spacing: -3px; + } +#logo + { + position: fixed; + top: 10px; + z-index: 20; + left: 10px; + } +#logobg + { + position: fixed; top: 10px; left: 0; width: 100%; height: 64px; + background-color: #000; opacity: 0.8; z-index: 19; + } +#logo a + { + float: left; + display: inline-block; + } +#logo a img + { + display: inline-block; + } +#logo h1 + { + padding: 15px 0 0 25px; + font-size: 34px; + color: #fff; + font-weight: normal; + font-style: italic; + font-family: georgia, garamond, serif; + color: #8ff; + display: inline-block; + } +#logo #likebutton + { + display: inline-block; + width: 90px; + height: 21px; + margin-left: 20px; + margin-top: -5px; + } +#likereport + { + position: fixed; + width: 100px; + padding: 20px; + z-index: 19; + overflow-y: hidden; + } +#likereport a + { + background-color: #222; + display: block; + text-decoration: none; + padding: 5px; + opacity: 0.95; + } +#instructions + { + position: fixed; + width: 450px; + z-index: -1; + } +#instructions span + { + display: inline-block; + background-color: #000; + color: #008fe6; + font-size: 14px; + line-height: 14px; + padding: 3px; + opacity: 0.8; + } +#form + { + position: fixed; + bottom: 10px; + left: 0px; + padding: 15px 10px 10px 10px; + background-color: #000; + white-space: nowrap; + } +#form #chat-message + { + border: 0; + outline: 0; + font-size: 18px; + padding: 5px; + margin-right: 5px; + } +#form #chat-send + { + margin: 0; + outline: 0; + padding: 2px 6px; + position: relative; + top: 1px; + color: #fff; + font-size: 20px; + } +#form #chat-send:hover + { + background-color: #543; + } +#formbg + { + background-color: #000; + opacity: 0.7; + } +#player + { + position: fixed; + padding: 10px; + left: 20px; + top: 10px; + background-color: #000; + display: none; + } +#player #ytplayer + { + position: static; + width: 533px; + height: 400px; + display: block; + background-color: #888; + pointer-events: none; + } +#playlistbg + { + position: fixed; + background-color: #222; + opacity: 0.4; + z-index: 11; + } +#playlist + { + position: fixed; + left: 450px; + top: 10px; + width: 320px; + background-color: #transparent; + opacity: 1; + border-bottom: 10px solid #000; + z-index: 12; + } +#playlist #queue + { + overflow-y: scroll; + overflow-x: hidden; + position: absolute; + bottom: 0; + width: 100%; + height: 85%; + } +#playlist img + { + position: absolute; + top: -5px; + left: 10px; + } +li + { + list-style-type: none; + } +#queue li + { + font-size: 16px; + list-style-type: none; + margin: 0; + border-bottom: 1px solid #333; + padding: 10px 5px 10px 10px; + opacity: 0.8; + } +#queue li span.like + { + color: #bbe; + font-size: 15px; + padding: 2px 10px 0 5px; + display: inline-block; + float: right; + cursor: pointer; + } +#queue li.liked span.like + { + color: #fff; + font-weight: bold; + } +#queue li span.yt + { + padding-left: 2px; + cursor: pointer; + color: #fff; + display: inline-block; + max-width: 65%; + } +#queue li span.yt.error + { + color: #888; + } +#queue li a + { + float: right; + color: #ff0066; + padding: 2px 10px 0 5px; + display: inline-block; + font-weight: bold; + font-size: 15px; + } +#queue li.selected + { + opacity: 1.0; + color: #008fe6; + background-color: #04022d; + } +#queue li.selected span.like + { + color: #a3d3ff; + } +#queue li.selected.liked span.like + { + color: #fff; + } +#queue li.selected a + { + color: #d8131f; + } +#queue li.selected span.yt + { + color: #f0efe6; + } +#chatbg + { + position: fixed; + bottom: 100px; + left: 20px; + padding: 10px; + width: 600px; + background-color: #000; + padding: 0 10px 5px 10px; + opacity: 0.3; + z-index: 9; + } +#chat + { + padding: 0 10px 5px 10px; + position: fixed; + overflow-y: scroll; + font-size: 16px; + vertical-align: bottom; + background: transparent; + z-index: 10; + } +#chat a + { + opacity: 0.8; + color: #ccff66; + text-decoration: underline; + } +#chat a.u + { + font-weight: normal; + min-width: 60px; + padding-right: 10px; + display: inline-block; + color: #ff0066; + opacity: 0.9; + text-decoration: none; + } +#chat a.pic + { + opacity: 1; + } +#chat span + { + color: #f0fff0; + text-shadow: #000 0 0 2px; + } +#chat .ytlink + { + color: #aaccff; + cursor: pointer; + text-decoration: underline; + text-shadow: none; + text-shadow: #000 0 0 1px; + opacity: 1; + } +#chat .ytlink:hover + { + color: #dd66ff; + text-decoration: underline; + text-shadow: #000 0 0 1px; + } +#chat .ytlink.playing + { + color: #daf; + font-weight: bold; + text-decoration: none; + } +#chat .ytlink.playing::before + { + text-decoration: none; + content: "\25b6 "; + font-weight: bold; + } +#chat img + { + max-width: 350px; + max-height: 400px; + border: 0; + } +#lastlogbg + { + position: fixed; + background-color: #000; + opacity: 0.5; + padding: 10px; + z-index: 15; + } +#lastlogbox + { + position: fixed; + font-size: 14px; + padding: 10px; + z-index: 16; + } +#lastlogbox h4 + { + font-size: 12px; + font-weight: bold; + color: #eee; + padding-bottom: 5px; + } +#lastlogbox ul + { + border-top: 1px solid #000; + } +li.ll + { + list-style-type: none; + } +li.ll a + { + color: #d0e0fe; + padding: 5px 0; + border-bottom: 1px solid #000; + display: block; + text-shadow: #000 0 0 2px; + text-decoration: underline; + font-size: 16px; + font-weight: bold; + } +#msg + { + opacity: 0.8; + z-index: 20; + position: fixed; + right: 10px; + top: 10px; + width: 350px; + padding: 10px; + overflow-x: hidden; + overflow-y: scroll; + font-size: 13px; + background-color: #fff; + } +#flower + { + position: absolute; + top: 0; + right: 10%; + z-index: 20; + pointer-events: none; + display: none; + } +#plant + { + position: absolute; + bottom: 0; + z-index: 20; + pointer-events: none; + display: none; + } +#shim + { + width: 10px; + height: 500px; + } +#scanjam { padding: 10px 0 10px 0; } +#msg { display: none; } +#login,#sitez { display: none; } +#lunacy { display: none; } +#likereport, #logo, #logobg, #chat, #chatbg, #form, #formbg, #instructions, #playlist, #playlistbg, #lastlogbox, #lastlogbg { display: none; } diff --git a/frontend/static/faq/.htaccess b/frontend/static/faq/.htaccess new file mode 100644 index 0000000..717ec6f --- /dev/null +++ b/frontend/static/faq/.htaccess @@ -0,0 +1 @@ +DirectoryIndex index.html diff --git a/frontend/static/faq/index.html b/frontend/static/faq/index.html new file mode 100644 index 0000000..fd76e86 --- /dev/null +++ b/frontend/static/faq/index.html @@ -0,0 +1,286 @@ + +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER FAQ</title> +<style type="text/css"> +* + { + padding:0; + margin: 0; + } +body + { + font-family: trebuchet ms, helvetica, arial, sans-serif; +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(117,0,60)), + color-stop(1, rgb(225,191,255)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(117,0,60) 0%, + rgb(225,191,255) 100% +); + + background-attachment: fixed; + } +html + { + padding-bottom: 300px; + } +body, html + { + width: 100%; height: 100%; + } +#logo + { + position: absolute; + top: 20px; + z-index: 20; + left: 20px; + } +#logobg + { + position: absolute; top: 10px; left: 0; width: 100%; height: 64px; + background-color: #000; opacity: 0.8; z-index: 19; + width: 900px; + } +#logo a + { + float: left; + display: inline-block; + } +#logo a img + { + display: inline-block; + } +#logo h1 + { + padding: 5px 0 0 25px; + font-size: 34px; + font-weight: normal; + font-style: italic; + font-family: georgia, garamond, serif; + color: #f8b; + display: inline-block; + } +#likebutton + { + float: right; + display: inline-block; + width: 90px; + height: 21px; + } + +h3 + { + display: block; + padding-bottom: 5px; + } +#faq + { + position: absolute; + top: 70px; + left: 260px; + width: 600px; + padding: 20px 20px 20px 20px; + background-color: #fff; + } + +aside + { + float: right; + position: relative; + padding: 10px; + margin: 10px; + font-size: 12px; + background-color: #ffc8e8; + color: #222; + } +aside b + { + color: #000; + } +p + { + line-height: 22px; + margin-bottom: 15px; + color: #333; + } +p u + { + text-decoration: none; + color: #000; + } +p b + { + color: #000; + } +#blackflower + { + margin-left: 60px; + } +#bfmask + { + position: absolute; + z-index: 20; + } +#flower + { + display: block; + padding-bottom: 20px; + } +a + { + color: #a0d; + } +#sitez + { + position: absolute; + top: 25px; + left: 920px; + padding: 10px; + background-color: #fff; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + } +#contact + { + position: absolute; + top: 90px; + left: 920px; + padding: 10px; + background-color: #fff; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + } +</style> +</head> +<body> +<section id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h1 id="header">frequently asked questions</h1> +</section> +<section id="logobg"></section> + +<section id="sitez"> + <a href="/">Rooms</a> · + <a href="/top/">Top Videos Today</a> · + <a href="/directory/">Directory</a> +</section> + +<section id="contact"> +contact us: <a href="http://facebook.com/AAAFFF" target="_blank">facebook.com/AAAFFF</a><br/> +and follow <a href="http://twitter.com/scannerjammer" target="_blank">@scannerjammer</a> +</section> + +<section id="faq"> +<h3>why do I need to register and why do I need a username?</h3> +<p> +because this is an elite establishment. this is for SERIOUS internet browsers ONLY <b>......NOXQSZ.</b> +</p> +<p> +if you post "The Lonely Island" or any related videos in scannerjammer you will be held accountable. we care about the content of our site. +</p> +<p> +we want you to develop a reputation. all posts will be connected to your username. be forewarned. (no email or contact information is required upon registration) +</p> + +<h3>what is this?</h3> +<p> +this is a <b>crazy video chatroom</b> in which you can <b>post YOUTUBES, VIMEOS and SOUNDCLOUDS into the chat</b> as well as <b>GIFs and IMAGES.</b> the videos are added to a playlist that you can click through. +</p> + +<h3>how do I post a video?</h3> +<p> +to add media to the playlist, simply copy and paste the URL of the video or music that you want into the chat and hit SEND. +</p> + +<h3>what do I do (and how do I do it)?</h3> +<p> +the <u>SCAN</u> button enables you to scan through the videos like a scan button on a radio receiver. By hitting the <u>ESC</u> key, you can toggle through the full-screen modes. +</p> +<aside id="fullscreen"> + <b>keys in fulscreen mode:</b><br> + <b>ESC</b> exit fullscreen<br /> + <b>SPACEBAR</b> pause/play<br /> + <b>left/right</b> step<br /> + <b>L</b> like a video<br /> +</aside> +<p> +post the urls of images and gifs and they will show up on the chat as well as on your profile page. +</p> +<p> +by clicking <b>LIKE</b> on a video in the playlist, you add the video to a playlist of "likes" on your profile page.<br/> +<a href="/top/">See the top videos today.</a> +</p> +<p> +All profiles can be accessed by clicking on a username. also check out the <a href="/directory">Scannerjammer directory.</a> +</p> + +<section id="blackflower"> + <section id="bfmask"><img src="http://scannerjammer.com/img/blackplantmask.png" height="500" /></section> + <img src="http://scannerjammer.com/img/black-flower.gif" height="500" /> +</section> + +<h3>who made this?</h3> +<p> +it was made by Pepper DaStroyer (Andrew Fenlon) who is a crazed American Idol reject, Jules Welter (asdf.us), one of the operators of Rotten dot com, and Peter Le Bek (vokoda). +</p> + +<h3>are the creators of the website alive or dead?</h3> +<p> +all dead +</p> + +<h3>what does this site intend to accomplish?</h3> +<p> +this site was designed for people to talk with youtube videos in conjunction with words. our goal is to encourage people to post the best videos they can find and eventually make videos for the site. +</p> + +<h3>how do i get started using this?</h3> +<p> +post a youtube url into the chat and begin. also, you should say hello to whomever is in the room. +</p> + +<h3>can you post anything other than youtube?</h3> +<p> +yes. we can play any Vimeo or Soundcloud url. +</p> + +<h3>how can I help scannerjammer, I like this site!</h3> + <div id="likebutton"> + <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://scannerjammer.com:17769/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + </div> +<p> + click the like button. it's crucial ------------------> +</p> + +<h3>how do I improve my fav score?</h3> +<p> +post the best video you can find and cross your fingers +</p> + +<section id="flower"><img src="http://scannerjammer.com/img/flower-red.gif" height="400" /></section> +<h3>what does the flower mean?</h3> +<p> +the flower means you liked something +</p> +<section id="plant"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +<h3>what does the glittery plant mean?</h3> +<p> +the plant means someone liked a video you posted <3 +</p> +<br/> <br/> <br/> <br/> <br/> <br/> +<br/> <br/> <br/> <br/> <br/> <br/> +</section> +</body> +<script> +</script> +</html> + diff --git a/frontend/static/favicon.ico b/frontend/static/favicon.ico Binary files differnew file mode 100644 index 0000000..10176a4 --- /dev/null +++ b/frontend/static/favicon.ico diff --git a/frontend/static/img/.htaccess b/frontend/static/img/.htaccess new file mode 100644 index 0000000..fe50a80 --- /dev/null +++ b/frontend/static/img/.htaccess @@ -0,0 +1,2 @@ +DirectoryIndex /cgi-bin/img.cgi + diff --git a/frontend/static/img/1278131405573-dumpfm-glasspopcorn-sitmanpiano.gif b/frontend/static/img/1278131405573-dumpfm-glasspopcorn-sitmanpiano.gif Binary files differnew file mode 100644 index 0000000..a7b8f1e --- /dev/null +++ b/frontend/static/img/1278131405573-dumpfm-glasspopcorn-sitmanpiano.gif diff --git a/frontend/static/img/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif b/frontend/static/img/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif Binary files differnew file mode 100644 index 0000000..3dd1c0a --- /dev/null +++ b/frontend/static/img/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif diff --git a/frontend/static/img/1309267681552-dumpfm-frakbuddy-glasscross.gif b/frontend/static/img/1309267681552-dumpfm-frakbuddy-glasscross.gif Binary files differnew file mode 100644 index 0000000..dd9188b --- /dev/null +++ b/frontend/static/img/1309267681552-dumpfm-frakbuddy-glasscross.gif diff --git a/frontend/static/img/Tropic_Of_Cancer__The_Sorrow_Of_Two_Blooms_1308602037.jpg b/frontend/static/img/Tropic_Of_Cancer__The_Sorrow_Of_Two_Blooms_1308602037.jpg Binary files differnew file mode 100644 index 0000000..f79e46e --- /dev/null +++ b/frontend/static/img/Tropic_Of_Cancer__The_Sorrow_Of_Two_Blooms_1308602037.jpg diff --git a/frontend/static/img/avatar2.png b/frontend/static/img/avatar2.png Binary files differnew file mode 100644 index 0000000..29ddaae --- /dev/null +++ b/frontend/static/img/avatar2.png diff --git a/frontend/static/img/bgz-icon.jpg b/frontend/static/img/bgz-icon.jpg Binary files differnew file mode 100644 index 0000000..36a84e2 --- /dev/null +++ b/frontend/static/img/bgz-icon.jpg diff --git a/frontend/static/img/black-flower.gif b/frontend/static/img/black-flower.gif Binary files differnew file mode 100644 index 0000000..acb091e --- /dev/null +++ b/frontend/static/img/black-flower.gif diff --git a/frontend/static/img/blackplantmask.png b/frontend/static/img/blackplantmask.png Binary files differnew file mode 100644 index 0000000..f3818de --- /dev/null +++ b/frontend/static/img/blackplantmask.png diff --git a/frontend/static/img/cube.png b/frontend/static/img/cube.png Binary files differnew file mode 100644 index 0000000..759faea --- /dev/null +++ b/frontend/static/img/cube.png diff --git a/frontend/static/img/diornights.png b/frontend/static/img/diornights.png Binary files differnew file mode 100644 index 0000000..b6ae7d0 --- /dev/null +++ b/frontend/static/img/diornights.png diff --git a/frontend/static/img/disaro.jpg b/frontend/static/img/disaro.jpg Binary files differnew file mode 100644 index 0000000..2d14033 --- /dev/null +++ b/frontend/static/img/disaro.jpg diff --git a/frontend/static/img/flower-red.gif b/frontend/static/img/flower-red.gif Binary files differnew file mode 100644 index 0000000..c0daaa6 --- /dev/null +++ b/frontend/static/img/flower-red.gif diff --git a/frontend/static/img/flower20.png b/frontend/static/img/flower20.png Binary files differnew file mode 100644 index 0000000..04461c2 --- /dev/null +++ b/frontend/static/img/flower20.png diff --git a/frontend/static/img/glasspopcornheader.png b/frontend/static/img/glasspopcornheader.png Binary files differnew file mode 100644 index 0000000..6626277 --- /dev/null +++ b/frontend/static/img/glasspopcornheader.png diff --git a/frontend/static/img/glasspopradio.gif b/frontend/static/img/glasspopradio.gif Binary files differnew file mode 100644 index 0000000..376182c --- /dev/null +++ b/frontend/static/img/glasspopradio.gif diff --git a/frontend/static/img/glasspopthumb.gif b/frontend/static/img/glasspopthumb.gif Binary files differnew file mode 100644 index 0000000..344922b --- /dev/null +++ b/frontend/static/img/glasspopthumb.gif diff --git a/frontend/static/img/glitter/100-Percent-Sexy-Cowgirl.gif b/frontend/static/img/glitter/100-Percent-Sexy-Cowgirl.gif Binary files differnew file mode 100644 index 0000000..a1bbdbe --- /dev/null +++ b/frontend/static/img/glitter/100-Percent-Sexy-Cowgirl.gif diff --git a/frontend/static/img/glitter/1292462203316-dumpfm-yrmomvsmymom-sparkle.gif b/frontend/static/img/glitter/1292462203316-dumpfm-yrmomvsmymom-sparkle.gif Binary files differnew file mode 100644 index 0000000..c1336c4 --- /dev/null +++ b/frontend/static/img/glitter/1292462203316-dumpfm-yrmomvsmymom-sparkle.gif diff --git a/frontend/static/img/glitter/99-percent-tejana-and-1-percent-floridian.gif b/frontend/static/img/glitter/99-percent-tejana-and-1-percent-floridian.gif Binary files differnew file mode 100644 index 0000000..be7cfb6 --- /dev/null +++ b/frontend/static/img/glitter/99-percent-tejana-and-1-percent-floridian.gif diff --git a/frontend/static/img/glitter/Air-Plane.gif b/frontend/static/img/glitter/Air-Plane.gif Binary files differnew file mode 100644 index 0000000..c92af95 --- /dev/null +++ b/frontend/static/img/glitter/Air-Plane.gif diff --git a/frontend/static/img/glitter/Aloha-Girl.gif b/frontend/static/img/glitter/Aloha-Girl.gif Binary files differnew file mode 100644 index 0000000..c02c421 --- /dev/null +++ b/frontend/static/img/glitter/Aloha-Girl.gif diff --git a/frontend/static/img/glitter/American-Flag-Heart.gif b/frontend/static/img/glitter/American-Flag-Heart.gif Binary files differnew file mode 100644 index 0000000..d4dfe66 --- /dev/null +++ b/frontend/static/img/glitter/American-Flag-Heart.gif diff --git a/frontend/static/img/glitter/American-Sexy-Thing-1.gif b/frontend/static/img/glitter/American-Sexy-Thing-1.gif Binary files differnew file mode 100644 index 0000000..7a0b728 --- /dev/null +++ b/frontend/static/img/glitter/American-Sexy-Thing-1.gif diff --git a/frontend/static/img/glitter/American-Sexy-Thing.gif b/frontend/static/img/glitter/American-Sexy-Thing.gif Binary files differnew file mode 100644 index 0000000..7a0b728 --- /dev/null +++ b/frontend/static/img/glitter/American-Sexy-Thing.gif diff --git a/frontend/static/img/glitter/Arizona-Cardinals.gif b/frontend/static/img/glitter/Arizona-Cardinals.gif Binary files differnew file mode 100644 index 0000000..972309c --- /dev/null +++ b/frontend/static/img/glitter/Arizona-Cardinals.gif diff --git a/frontend/static/img/glitter/Arizona-Diamondbacks.gif b/frontend/static/img/glitter/Arizona-Diamondbacks.gif Binary files differnew file mode 100644 index 0000000..ddd3209 --- /dev/null +++ b/frontend/static/img/glitter/Arizona-Diamondbacks.gif diff --git a/frontend/static/img/glitter/Atlanta-Braves.gif b/frontend/static/img/glitter/Atlanta-Braves.gif Binary files differnew file mode 100644 index 0000000..805c3bb --- /dev/null +++ b/frontend/static/img/glitter/Atlanta-Braves.gif diff --git a/frontend/static/img/glitter/Atlanta-Falcons.gif b/frontend/static/img/glitter/Atlanta-Falcons.gif Binary files differnew file mode 100644 index 0000000..26e418b --- /dev/null +++ b/frontend/static/img/glitter/Atlanta-Falcons.gif diff --git a/frontend/static/img/glitter/Baltimore-Orioles.gif b/frontend/static/img/glitter/Baltimore-Orioles.gif Binary files differnew file mode 100644 index 0000000..d49f116 --- /dev/null +++ b/frontend/static/img/glitter/Baltimore-Orioles.gif diff --git a/frontend/static/img/glitter/Baltimore-Ravens.gif b/frontend/static/img/glitter/Baltimore-Ravens.gif Binary files differnew file mode 100644 index 0000000..5737c42 --- /dev/null +++ b/frontend/static/img/glitter/Baltimore-Ravens.gif diff --git a/frontend/static/img/glitter/Beat-Hell.gif b/frontend/static/img/glitter/Beat-Hell.gif Binary files differnew file mode 100644 index 0000000..dc5e1de --- /dev/null +++ b/frontend/static/img/glitter/Beat-Hell.gif diff --git a/frontend/static/img/glitter/Beautiful-Friendship.gif b/frontend/static/img/glitter/Beautiful-Friendship.gif Binary files differnew file mode 100644 index 0000000..301d20e --- /dev/null +++ b/frontend/static/img/glitter/Beautiful-Friendship.gif diff --git a/frontend/static/img/glitter/Belle-Glitter.gif b/frontend/static/img/glitter/Belle-Glitter.gif Binary files differnew file mode 100644 index 0000000..738f126 --- /dev/null +++ b/frontend/static/img/glitter/Belle-Glitter.gif diff --git a/frontend/static/img/glitter/Belly-Dancer.gif b/frontend/static/img/glitter/Belly-Dancer.gif Binary files differnew file mode 100644 index 0000000..e23e8e1 --- /dev/null +++ b/frontend/static/img/glitter/Belly-Dancer.gif diff --git a/frontend/static/img/glitter/Belly-Dnacer.gif b/frontend/static/img/glitter/Belly-Dnacer.gif Binary files differnew file mode 100644 index 0000000..7af934f --- /dev/null +++ b/frontend/static/img/glitter/Belly-Dnacer.gif diff --git a/frontend/static/img/glitter/Bible-Diet.gif b/frontend/static/img/glitter/Bible-Diet.gif Binary files differnew file mode 100644 index 0000000..548d28a --- /dev/null +++ b/frontend/static/img/glitter/Bible-Diet.gif diff --git a/frontend/static/img/glitter/Black-Kisses.gif b/frontend/static/img/glitter/Black-Kisses.gif Binary files differnew file mode 100644 index 0000000..cad7dd9 --- /dev/null +++ b/frontend/static/img/glitter/Black-Kisses.gif diff --git a/frontend/static/img/glitter/Black-Razzers.gif b/frontend/static/img/glitter/Black-Razzers.gif Binary files differnew file mode 100644 index 0000000..deeed80 --- /dev/null +++ b/frontend/static/img/glitter/Black-Razzers.gif diff --git a/frontend/static/img/glitter/Bloody-Vampire.gif b/frontend/static/img/glitter/Bloody-Vampire.gif Binary files differnew file mode 100644 index 0000000..cfc838a --- /dev/null +++ b/frontend/static/img/glitter/Bloody-Vampire.gif diff --git a/frontend/static/img/glitter/Blue-Butterfly-Heaven.gif b/frontend/static/img/glitter/Blue-Butterfly-Heaven.gif Binary files differnew file mode 100644 index 0000000..1f93967 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Butterfly-Heaven.gif diff --git a/frontend/static/img/glitter/Blue-Cape-Fairy.gif b/frontend/static/img/glitter/Blue-Cape-Fairy.gif Binary files differnew file mode 100644 index 0000000..89b80c5 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Cape-Fairy.gif diff --git a/frontend/static/img/glitter/Blue-Care-Bear.gif b/frontend/static/img/glitter/Blue-Care-Bear.gif Binary files differnew file mode 100644 index 0000000..6f46165 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Care-Bear.gif diff --git a/frontend/static/img/glitter/Blue-Dolphin.gif b/frontend/static/img/glitter/Blue-Dolphin.gif Binary files differnew file mode 100644 index 0000000..07435b7 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Dolphin.gif diff --git a/frontend/static/img/glitter/Blue-Flower-02.gif b/frontend/static/img/glitter/Blue-Flower-02.gif Binary files differnew file mode 100644 index 0000000..3ced0e1 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Flower-02.gif diff --git a/frontend/static/img/glitter/Blue-Flower-03.gif b/frontend/static/img/glitter/Blue-Flower-03.gif Binary files differnew file mode 100644 index 0000000..a80df24 --- /dev/null +++ b/frontend/static/img/glitter/Blue-Flower-03.gif diff --git a/frontend/static/img/glitter/Blue-Purple-Shoe.gif b/frontend/static/img/glitter/Blue-Purple-Shoe.gif Binary files differnew file mode 100644 index 0000000..7e1f7bf --- /dev/null +++ b/frontend/static/img/glitter/Blue-Purple-Shoe.gif diff --git a/frontend/static/img/glitter/Booty-Call.gif b/frontend/static/img/glitter/Booty-Call.gif Binary files differnew file mode 100644 index 0000000..a975ed1 --- /dev/null +++ b/frontend/static/img/glitter/Booty-Call.gif diff --git a/frontend/static/img/glitter/Broken-heart-Pink.gif b/frontend/static/img/glitter/Broken-heart-Pink.gif Binary files differnew file mode 100644 index 0000000..1dc565f --- /dev/null +++ b/frontend/static/img/glitter/Broken-heart-Pink.gif diff --git a/frontend/static/img/glitter/Buffalo-Bills.gif b/frontend/static/img/glitter/Buffalo-Bills.gif Binary files differnew file mode 100644 index 0000000..4a3ab95 --- /dev/null +++ b/frontend/static/img/glitter/Buffalo-Bills.gif diff --git a/frontend/static/img/glitter/Bulls.gif b/frontend/static/img/glitter/Bulls.gif Binary files differnew file mode 100644 index 0000000..906cb98 --- /dev/null +++ b/frontend/static/img/glitter/Bulls.gif diff --git a/frontend/static/img/glitter/Burger-King-Glitter.gif b/frontend/static/img/glitter/Burger-King-Glitter.gif Binary files differnew file mode 100644 index 0000000..d534de5 --- /dev/null +++ b/frontend/static/img/glitter/Burger-King-Glitter.gif diff --git a/frontend/static/img/glitter/Butterfly-Girl.gif b/frontend/static/img/glitter/Butterfly-Girl.gif Binary files differnew file mode 100644 index 0000000..774f1f4 --- /dev/null +++ b/frontend/static/img/glitter/Butterfly-Girl.gif diff --git a/frontend/static/img/glitter/California-Angels.gif b/frontend/static/img/glitter/California-Angels.gif Binary files differnew file mode 100644 index 0000000..87fe231 --- /dev/null +++ b/frontend/static/img/glitter/California-Angels.gif diff --git a/frontend/static/img/glitter/Cat-Fairy.gif b/frontend/static/img/glitter/Cat-Fairy.gif Binary files differnew file mode 100644 index 0000000..404b056 --- /dev/null +++ b/frontend/static/img/glitter/Cat-Fairy.gif diff --git a/frontend/static/img/glitter/Cell-Phone-Glitter.gif b/frontend/static/img/glitter/Cell-Phone-Glitter.gif Binary files differnew file mode 100644 index 0000000..92555f3 --- /dev/null +++ b/frontend/static/img/glitter/Cell-Phone-Glitter.gif diff --git a/frontend/static/img/glitter/Cheetah-Chick.gif b/frontend/static/img/glitter/Cheetah-Chick.gif Binary files differnew file mode 100644 index 0000000..c3a9e69 --- /dev/null +++ b/frontend/static/img/glitter/Cheetah-Chick.gif diff --git a/frontend/static/img/glitter/Cherries-Glittler.gif b/frontend/static/img/glitter/Cherries-Glittler.gif Binary files differnew file mode 100644 index 0000000..2ff1a11 --- /dev/null +++ b/frontend/static/img/glitter/Cherries-Glittler.gif diff --git a/frontend/static/img/glitter/Cherries.gif b/frontend/static/img/glitter/Cherries.gif Binary files differnew file mode 100644 index 0000000..bbfbb25 --- /dev/null +++ b/frontend/static/img/glitter/Cherries.gif diff --git a/frontend/static/img/glitter/Chicago-Bears.gif b/frontend/static/img/glitter/Chicago-Bears.gif Binary files differnew file mode 100644 index 0000000..ce39dc9 --- /dev/null +++ b/frontend/static/img/glitter/Chicago-Bears.gif diff --git a/frontend/static/img/glitter/Chicago-Cubs.gif b/frontend/static/img/glitter/Chicago-Cubs.gif Binary files differnew file mode 100644 index 0000000..e30735e --- /dev/null +++ b/frontend/static/img/glitter/Chicago-Cubs.gif diff --git a/frontend/static/img/glitter/Chicago-Whitesox.gif b/frontend/static/img/glitter/Chicago-Whitesox.gif Binary files differnew file mode 100644 index 0000000..5335751 --- /dev/null +++ b/frontend/static/img/glitter/Chicago-Whitesox.gif diff --git a/frontend/static/img/glitter/Cleveland-Indians.gif b/frontend/static/img/glitter/Cleveland-Indians.gif Binary files differnew file mode 100644 index 0000000..a7c65e9 --- /dev/null +++ b/frontend/static/img/glitter/Cleveland-Indians.gif diff --git a/frontend/static/img/glitter/Close-Girlfriends.gif b/frontend/static/img/glitter/Close-Girlfriends.gif Binary files differnew file mode 100644 index 0000000..c67d210 --- /dev/null +++ b/frontend/static/img/glitter/Close-Girlfriends.gif diff --git a/frontend/static/img/glitter/Colorado-Rockies.gif b/frontend/static/img/glitter/Colorado-Rockies.gif Binary files differnew file mode 100644 index 0000000..07a4b33 --- /dev/null +++ b/frontend/static/img/glitter/Colorado-Rockies.gif diff --git a/frontend/static/img/glitter/Colour-My-World.gif b/frontend/static/img/glitter/Colour-My-World.gif Binary files differnew file mode 100644 index 0000000..a5428cd --- /dev/null +++ b/frontend/static/img/glitter/Colour-My-World.gif diff --git a/frontend/static/img/glitter/Cone-Get-It.gif b/frontend/static/img/glitter/Cone-Get-It.gif Binary files differnew file mode 100644 index 0000000..ae31306 --- /dev/null +++ b/frontend/static/img/glitter/Cone-Get-It.gif diff --git a/frontend/static/img/glitter/Cuban-Babe.gif b/frontend/static/img/glitter/Cuban-Babe.gif Binary files differnew file mode 100644 index 0000000..b874b39 --- /dev/null +++ b/frontend/static/img/glitter/Cuban-Babe.gif diff --git a/frontend/static/img/glitter/Cupid-Just-Struck.gif b/frontend/static/img/glitter/Cupid-Just-Struck.gif Binary files differnew file mode 100644 index 0000000..028caac --- /dev/null +++ b/frontend/static/img/glitter/Cupid-Just-Struck.gif diff --git a/frontend/static/img/glitter/Dirty-Little-Secret.gif b/frontend/static/img/glitter/Dirty-Little-Secret.gif Binary files differnew file mode 100644 index 0000000..be2136f --- /dev/null +++ b/frontend/static/img/glitter/Dirty-Little-Secret.gif diff --git a/frontend/static/img/glitter/Dolphin-Animated.gif b/frontend/static/img/glitter/Dolphin-Animated.gif Binary files differnew file mode 100644 index 0000000..dc44b30 --- /dev/null +++ b/frontend/static/img/glitter/Dolphin-Animated.gif diff --git a/frontend/static/img/glitter/Droppin-In-To-Say-Hello.gif b/frontend/static/img/glitter/Droppin-In-To-Say-Hello.gif Binary files differnew file mode 100644 index 0000000..0e21ec3 --- /dev/null +++ b/frontend/static/img/glitter/Droppin-In-To-Say-Hello.gif diff --git a/frontend/static/img/glitter/Drppin-By-To-Say-hellow.gif b/frontend/static/img/glitter/Drppin-By-To-Say-hellow.gif Binary files differnew file mode 100644 index 0000000..0e21ec3 --- /dev/null +++ b/frontend/static/img/glitter/Drppin-By-To-Say-hellow.gif diff --git a/frontend/static/img/glitter/Eeyore-Angel.gif b/frontend/static/img/glitter/Eeyore-Angel.gif Binary files differnew file mode 100644 index 0000000..3a3343d --- /dev/null +++ b/frontend/static/img/glitter/Eeyore-Angel.gif diff --git a/frontend/static/img/glitter/Fairy-18.gif b/frontend/static/img/glitter/Fairy-18.gif Binary files differnew file mode 100644 index 0000000..6732cbb --- /dev/null +++ b/frontend/static/img/glitter/Fairy-18.gif diff --git a/frontend/static/img/glitter/Fairy-23.gif b/frontend/static/img/glitter/Fairy-23.gif Binary files differnew file mode 100644 index 0000000..0439ffb --- /dev/null +++ b/frontend/static/img/glitter/Fairy-23.gif diff --git a/frontend/static/img/glitter/Fairy-Caught-in-Jar.gif b/frontend/static/img/glitter/Fairy-Caught-in-Jar.gif Binary files differnew file mode 100644 index 0000000..39f55d6 --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Caught-in-Jar.gif diff --git a/frontend/static/img/glitter/Fairy-Chest.gif b/frontend/static/img/glitter/Fairy-Chest.gif Binary files differnew file mode 100644 index 0000000..8f89634 --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Chest.gif diff --git a/frontend/static/img/glitter/Fairy-Fantasy-5.gif b/frontend/static/img/glitter/Fairy-Fantasy-5.gif Binary files differnew file mode 100644 index 0000000..bc563aa --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Fantasy-5.gif diff --git a/frontend/static/img/glitter/Fairy-Waterfalls.gif b/frontend/static/img/glitter/Fairy-Waterfalls.gif Binary files differnew file mode 100644 index 0000000..8709f55 --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Waterfalls.gif diff --git a/frontend/static/img/glitter/Fairy-Wings-4.gif b/frontend/static/img/glitter/Fairy-Wings-4.gif Binary files differnew file mode 100644 index 0000000..fdf5d54 --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Wings-4.gif diff --git a/frontend/static/img/glitter/Fairy-Wings-5.gif b/frontend/static/img/glitter/Fairy-Wings-5.gif Binary files differnew file mode 100644 index 0000000..d64240c --- /dev/null +++ b/frontend/static/img/glitter/Fairy-Wings-5.gif diff --git a/frontend/static/img/glitter/Fantasy-Fairy-10.gif b/frontend/static/img/glitter/Fantasy-Fairy-10.gif Binary files differnew file mode 100644 index 0000000..c39829e --- /dev/null +++ b/frontend/static/img/glitter/Fantasy-Fairy-10.gif diff --git a/frontend/static/img/glitter/Fantasy-Fairy-4.gif b/frontend/static/img/glitter/Fantasy-Fairy-4.gif Binary files differnew file mode 100644 index 0000000..2f82dad --- /dev/null +++ b/frontend/static/img/glitter/Fantasy-Fairy-4.gif diff --git a/frontend/static/img/glitter/Fantasy-Fairy-5.gif b/frontend/static/img/glitter/Fantasy-Fairy-5.gif Binary files differnew file mode 100644 index 0000000..3b7b59e --- /dev/null +++ b/frontend/static/img/glitter/Fantasy-Fairy-5.gif diff --git a/frontend/static/img/glitter/Fantasy-Fairy-8.gif b/frontend/static/img/glitter/Fantasy-Fairy-8.gif Binary files differnew file mode 100644 index 0000000..84f217d --- /dev/null +++ b/frontend/static/img/glitter/Fantasy-Fairy-8.gif diff --git a/frontend/static/img/glitter/Fantasy-Fairy.gif b/frontend/static/img/glitter/Fantasy-Fairy.gif Binary files differnew file mode 100644 index 0000000..425e757 --- /dev/null +++ b/frontend/static/img/glitter/Fantasy-Fairy.gif diff --git a/frontend/static/img/glitter/Fendi-Yellow.gif b/frontend/static/img/glitter/Fendi-Yellow.gif Binary files differnew file mode 100644 index 0000000..cc22042 --- /dev/null +++ b/frontend/static/img/glitter/Fendi-Yellow.gif diff --git a/frontend/static/img/glitter/Florida-Marlins.gif b/frontend/static/img/glitter/Florida-Marlins.gif Binary files differnew file mode 100644 index 0000000..eba21b6 --- /dev/null +++ b/frontend/static/img/glitter/Florida-Marlins.gif diff --git a/frontend/static/img/glitter/Fur-Cowgirl.gif b/frontend/static/img/glitter/Fur-Cowgirl.gif Binary files differnew file mode 100644 index 0000000..1eb9acc --- /dev/null +++ b/frontend/static/img/glitter/Fur-Cowgirl.gif diff --git a/frontend/static/img/glitter/Getting-Ready.gif b/frontend/static/img/glitter/Getting-Ready.gif Binary files differnew file mode 100644 index 0000000..b358365 --- /dev/null +++ b/frontend/static/img/glitter/Getting-Ready.gif diff --git a/frontend/static/img/glitter/Ghetto-Booty.gif b/frontend/static/img/glitter/Ghetto-Booty.gif Binary files differnew file mode 100644 index 0000000..09458a4 --- /dev/null +++ b/frontend/static/img/glitter/Ghetto-Booty.gif diff --git a/frontend/static/img/glitter/Gorgeous-Fairy.gif b/frontend/static/img/glitter/Gorgeous-Fairy.gif Binary files differnew file mode 100644 index 0000000..9e7389f --- /dev/null +++ b/frontend/static/img/glitter/Gorgeous-Fairy.gif diff --git a/frontend/static/img/glitter/Gorgeous-Pink-Flowers.gif b/frontend/static/img/glitter/Gorgeous-Pink-Flowers.gif Binary files differnew file mode 100644 index 0000000..15da1f4 --- /dev/null +++ b/frontend/static/img/glitter/Gorgeous-Pink-Flowers.gif diff --git a/frontend/static/img/glitter/Green-Palm-Tree.gif b/frontend/static/img/glitter/Green-Palm-Tree.gif Binary files differnew file mode 100644 index 0000000..78d7cfd --- /dev/null +++ b/frontend/static/img/glitter/Green-Palm-Tree.gif diff --git a/frontend/static/img/glitter/Happy-Feb-14th-Arrow-Heart.gif b/frontend/static/img/glitter/Happy-Feb-14th-Arrow-Heart.gif Binary files differnew file mode 100644 index 0000000..2bbc3a2 --- /dev/null +++ b/frontend/static/img/glitter/Happy-Feb-14th-Arrow-Heart.gif diff --git a/frontend/static/img/glitter/Have-A-Beautiful-Day.gif b/frontend/static/img/glitter/Have-A-Beautiful-Day.gif Binary files differnew file mode 100644 index 0000000..17bee84 --- /dev/null +++ b/frontend/static/img/glitter/Have-A-Beautiful-Day.gif diff --git a/frontend/static/img/glitter/Have-Dreams.gif b/frontend/static/img/glitter/Have-Dreams.gif Binary files differnew file mode 100644 index 0000000..48122d9 --- /dev/null +++ b/frontend/static/img/glitter/Have-Dreams.gif diff --git a/frontend/static/img/glitter/He-Died-For-you.gif b/frontend/static/img/glitter/He-Died-For-you.gif Binary files differnew file mode 100644 index 0000000..4b3cdb0 --- /dev/null +++ b/frontend/static/img/glitter/He-Died-For-you.gif diff --git a/frontend/static/img/glitter/Heart-Underwear.gif b/frontend/static/img/glitter/Heart-Underwear.gif Binary files differnew file mode 100644 index 0000000..deeed80 --- /dev/null +++ b/frontend/static/img/glitter/Heart-Underwear.gif diff --git a/frontend/static/img/glitter/Hello-Blue-Roses.gif b/frontend/static/img/glitter/Hello-Blue-Roses.gif Binary files differnew file mode 100644 index 0000000..504a268 --- /dev/null +++ b/frontend/static/img/glitter/Hello-Blue-Roses.gif diff --git a/frontend/static/img/glitter/Hello-Rose.gif b/frontend/static/img/glitter/Hello-Rose.gif Binary files differnew file mode 100644 index 0000000..b6e8de2 --- /dev/null +++ b/frontend/static/img/glitter/Hello-Rose.gif diff --git a/frontend/static/img/glitter/Here-Big-Boy.gif b/frontend/static/img/glitter/Here-Big-Boy.gif Binary files differnew file mode 100644 index 0000000..9fcc7f3 --- /dev/null +++ b/frontend/static/img/glitter/Here-Big-Boy.gif diff --git a/frontend/static/img/glitter/Hi-Sexy-Red.gif b/frontend/static/img/glitter/Hi-Sexy-Red.gif Binary files differnew file mode 100644 index 0000000..e453dc0 --- /dev/null +++ b/frontend/static/img/glitter/Hi-Sexy-Red.gif diff --git a/frontend/static/img/glitter/Hollow-Heart-Red.gif b/frontend/static/img/glitter/Hollow-Heart-Red.gif Binary files differnew file mode 100644 index 0000000..422ecfd --- /dev/null +++ b/frontend/static/img/glitter/Hollow-Heart-Red.gif diff --git a/frontend/static/img/glitter/Honey.gif b/frontend/static/img/glitter/Honey.gif Binary files differnew file mode 100644 index 0000000..5d08f36 --- /dev/null +++ b/frontend/static/img/glitter/Honey.gif diff --git a/frontend/static/img/glitter/Hot-Jail-Babe.gif b/frontend/static/img/glitter/Hot-Jail-Babe.gif Binary files differnew file mode 100644 index 0000000..f2b3cd3 --- /dev/null +++ b/frontend/static/img/glitter/Hot-Jail-Babe.gif diff --git a/frontend/static/img/glitter/Hot-Long-Hair.gif b/frontend/static/img/glitter/Hot-Long-Hair.gif Binary files differnew file mode 100644 index 0000000..74e6ea6 --- /dev/null +++ b/frontend/static/img/glitter/Hot-Long-Hair.gif diff --git a/frontend/static/img/glitter/Hot-Pink-Bikini.gif b/frontend/static/img/glitter/Hot-Pink-Bikini.gif Binary files differnew file mode 100644 index 0000000..fb71829 --- /dev/null +++ b/frontend/static/img/glitter/Hot-Pink-Bikini.gif diff --git a/frontend/static/img/glitter/Hot-Pink-Lady.gif b/frontend/static/img/glitter/Hot-Pink-Lady.gif Binary files differnew file mode 100644 index 0000000..b02510e --- /dev/null +++ b/frontend/static/img/glitter/Hot-Pink-Lady.gif diff --git a/frontend/static/img/glitter/Hot-Stuff.gif b/frontend/static/img/glitter/Hot-Stuff.gif Binary files differnew file mode 100644 index 0000000..42360cc --- /dev/null +++ b/frontend/static/img/glitter/Hot-Stuff.gif diff --git a/frontend/static/img/glitter/Houston-Texans.gif b/frontend/static/img/glitter/Houston-Texans.gif Binary files differnew file mode 100644 index 0000000..3dfd6a0 --- /dev/null +++ b/frontend/static/img/glitter/Houston-Texans.gif diff --git a/frontend/static/img/glitter/Howdy-Hat.gif b/frontend/static/img/glitter/Howdy-Hat.gif Binary files differnew file mode 100644 index 0000000..7c56c55 --- /dev/null +++ b/frontend/static/img/glitter/Howdy-Hat.gif diff --git a/frontend/static/img/glitter/I-Love-Mickey.gif b/frontend/static/img/glitter/I-Love-Mickey.gif Binary files differnew file mode 100644 index 0000000..02de04b --- /dev/null +++ b/frontend/static/img/glitter/I-Love-Mickey.gif diff --git a/frontend/static/img/glitter/Im-such-a-Bad-Girl.gif b/frontend/static/img/glitter/Im-such-a-Bad-Girl.gif Binary files differnew file mode 100644 index 0000000..80b206e --- /dev/null +++ b/frontend/static/img/glitter/Im-such-a-Bad-Girl.gif diff --git a/frontend/static/img/glitter/Jazz.gif b/frontend/static/img/glitter/Jazz.gif Binary files differnew file mode 100644 index 0000000..38c0863 --- /dev/null +++ b/frontend/static/img/glitter/Jazz.gif diff --git a/frontend/static/img/glitter/Kansas-City-Chiefs.gif b/frontend/static/img/glitter/Kansas-City-Chiefs.gif Binary files differnew file mode 100644 index 0000000..877eda4 --- /dev/null +++ b/frontend/static/img/glitter/Kansas-City-Chiefs.gif diff --git a/frontend/static/img/glitter/Kinky-Care-Bear.gif b/frontend/static/img/glitter/Kinky-Care-Bear.gif Binary files differnew file mode 100644 index 0000000..0f1c031 --- /dev/null +++ b/frontend/static/img/glitter/Kinky-Care-Bear.gif diff --git a/frontend/static/img/glitter/Kite-Care-Bear.gif b/frontend/static/img/glitter/Kite-Care-Bear.gif Binary files differnew file mode 100644 index 0000000..57373ff --- /dev/null +++ b/frontend/static/img/glitter/Kite-Care-Bear.gif diff --git a/frontend/static/img/glitter/Kumba.gif b/frontend/static/img/glitter/Kumba.gif Binary files differnew file mode 100644 index 0000000..eb40697 --- /dev/null +++ b/frontend/static/img/glitter/Kumba.gif diff --git a/frontend/static/img/glitter/LETS-KISS.gif b/frontend/static/img/glitter/LETS-KISS.gif Binary files differnew file mode 100644 index 0000000..c779387 --- /dev/null +++ b/frontend/static/img/glitter/LETS-KISS.gif diff --git a/frontend/static/img/glitter/Leopard-Legs.gif b/frontend/static/img/glitter/Leopard-Legs.gif Binary files differnew file mode 100644 index 0000000..1e3dabd --- /dev/null +++ b/frontend/static/img/glitter/Leopard-Legs.gif diff --git a/frontend/static/img/glitter/Live-For-Jesus.gif b/frontend/static/img/glitter/Live-For-Jesus.gif Binary files differnew file mode 100644 index 0000000..9682997 --- /dev/null +++ b/frontend/static/img/glitter/Live-For-Jesus.gif diff --git a/frontend/static/img/glitter/Long-Legs.gif b/frontend/static/img/glitter/Long-Legs.gif Binary files differnew file mode 100644 index 0000000..9539eca --- /dev/null +++ b/frontend/static/img/glitter/Long-Legs.gif diff --git a/frontend/static/img/glitter/Los-Angeles-Dodgers.gif b/frontend/static/img/glitter/Los-Angeles-Dodgers.gif Binary files differnew file mode 100644 index 0000000..d12b060 --- /dev/null +++ b/frontend/static/img/glitter/Los-Angeles-Dodgers.gif diff --git a/frontend/static/img/glitter/Love-The-Lord.gif b/frontend/static/img/glitter/Love-The-Lord.gif Binary files differnew file mode 100644 index 0000000..c9fd5e3 --- /dev/null +++ b/frontend/static/img/glitter/Love-The-Lord.gif diff --git a/frontend/static/img/glitter/Marilyn-Silver-Sparkle-1.gif b/frontend/static/img/glitter/Marilyn-Silver-Sparkle-1.gif Binary files differnew file mode 100644 index 0000000..8d9a5f0 --- /dev/null +++ b/frontend/static/img/glitter/Marilyn-Silver-Sparkle-1.gif diff --git a/frontend/static/img/glitter/Marilyn-Silver-Sparkle.gif b/frontend/static/img/glitter/Marilyn-Silver-Sparkle.gif Binary files differnew file mode 100644 index 0000000..8d9a5f0 --- /dev/null +++ b/frontend/static/img/glitter/Marilyn-Silver-Sparkle.gif diff --git a/frontend/static/img/glitter/Mickey.gif b/frontend/static/img/glitter/Mickey.gif Binary files differnew file mode 100644 index 0000000..4b44721 --- /dev/null +++ b/frontend/static/img/glitter/Mickey.gif diff --git a/frontend/static/img/glitter/Minnesota-Wild.gif b/frontend/static/img/glitter/Minnesota-Wild.gif Binary files differnew file mode 100644 index 0000000..ed9d7ea --- /dev/null +++ b/frontend/static/img/glitter/Minnesota-Wild.gif diff --git a/frontend/static/img/glitter/Muscle-Legs.gif b/frontend/static/img/glitter/Muscle-Legs.gif Binary files differnew file mode 100644 index 0000000..5d0db15 --- /dev/null +++ b/frontend/static/img/glitter/Muscle-Legs.gif diff --git a/frontend/static/img/glitter/Mushroom-Fairy.gif b/frontend/static/img/glitter/Mushroom-Fairy.gif Binary files differnew file mode 100644 index 0000000..f036ffc --- /dev/null +++ b/frontend/static/img/glitter/Mushroom-Fairy.gif diff --git a/frontend/static/img/glitter/Music-Note-Glitter.gif b/frontend/static/img/glitter/Music-Note-Glitter.gif Binary files differnew file mode 100644 index 0000000..476b44f --- /dev/null +++ b/frontend/static/img/glitter/Music-Note-Glitter.gif diff --git a/frontend/static/img/glitter/Naught-Girl-Grey.gif b/frontend/static/img/glitter/Naught-Girl-Grey.gif Binary files differnew file mode 100644 index 0000000..fe44b8e --- /dev/null +++ b/frontend/static/img/glitter/Naught-Girl-Grey.gif diff --git a/frontend/static/img/glitter/Naughty-Pink.gif b/frontend/static/img/glitter/Naughty-Pink.gif Binary files differnew file mode 100644 index 0000000..7adaf1d --- /dev/null +++ b/frontend/static/img/glitter/Naughty-Pink.gif diff --git a/frontend/static/img/glitter/New-England-Patriots.gif b/frontend/static/img/glitter/New-England-Patriots.gif Binary files differnew file mode 100644 index 0000000..fe045b9 --- /dev/null +++ b/frontend/static/img/glitter/New-England-Patriots.gif diff --git a/frontend/static/img/glitter/New-York-Yankees.gif b/frontend/static/img/glitter/New-York-Yankees.gif Binary files differnew file mode 100644 index 0000000..ea41a2a --- /dev/null +++ b/frontend/static/img/glitter/New-York-Yankees.gif diff --git a/frontend/static/img/glitter/Nice-Brow.gif b/frontend/static/img/glitter/Nice-Brow.gif Binary files differnew file mode 100644 index 0000000..68ae53a --- /dev/null +++ b/frontend/static/img/glitter/Nice-Brow.gif diff --git a/frontend/static/img/glitter/Ninja-Turtle.gif b/frontend/static/img/glitter/Ninja-Turtle.gif Binary files differnew file mode 100644 index 0000000..9a53c4e --- /dev/null +++ b/frontend/static/img/glitter/Ninja-Turtle.gif diff --git a/frontend/static/img/glitter/Oh-My.gif b/frontend/static/img/glitter/Oh-My.gif Binary files differnew file mode 100644 index 0000000..d47ad8c --- /dev/null +++ b/frontend/static/img/glitter/Oh-My.gif diff --git a/frontend/static/img/glitter/Orange-Eyes.gif b/frontend/static/img/glitter/Orange-Eyes.gif Binary files differnew file mode 100644 index 0000000..fc46087 --- /dev/null +++ b/frontend/static/img/glitter/Orange-Eyes.gif diff --git a/frontend/static/img/glitter/Orange-Love.gif b/frontend/static/img/glitter/Orange-Love.gif Binary files differnew file mode 100644 index 0000000..57b74e8 --- /dev/null +++ b/frontend/static/img/glitter/Orange-Love.gif diff --git a/frontend/static/img/glitter/Overlooking-Fairy.gif b/frontend/static/img/glitter/Overlooking-Fairy.gif Binary files differnew file mode 100644 index 0000000..3638e48 --- /dev/null +++ b/frontend/static/img/glitter/Overlooking-Fairy.gif diff --git a/frontend/static/img/glitter/Palm-Tree.gif b/frontend/static/img/glitter/Palm-Tree.gif Binary files differnew file mode 100644 index 0000000..f7aa567 --- /dev/null +++ b/frontend/static/img/glitter/Palm-Tree.gif diff --git a/frontend/static/img/glitter/Parental-Advisor.gif b/frontend/static/img/glitter/Parental-Advisor.gif Binary files differnew file mode 100644 index 0000000..8348842 --- /dev/null +++ b/frontend/static/img/glitter/Parental-Advisor.gif diff --git a/frontend/static/img/glitter/Philadelphia-Eagles-1.gif b/frontend/static/img/glitter/Philadelphia-Eagles-1.gif Binary files differnew file mode 100644 index 0000000..a27c51a --- /dev/null +++ b/frontend/static/img/glitter/Philadelphia-Eagles-1.gif diff --git a/frontend/static/img/glitter/Philadelphia-Eagles.gif b/frontend/static/img/glitter/Philadelphia-Eagles.gif Binary files differnew file mode 100644 index 0000000..a27c51a --- /dev/null +++ b/frontend/static/img/glitter/Philadelphia-Eagles.gif diff --git a/frontend/static/img/glitter/Philadelphia-Phillies.gif b/frontend/static/img/glitter/Philadelphia-Phillies.gif Binary files differnew file mode 100644 index 0000000..7c4691e --- /dev/null +++ b/frontend/static/img/glitter/Philadelphia-Phillies.gif diff --git a/frontend/static/img/glitter/Phoenix-Coyotes.gif b/frontend/static/img/glitter/Phoenix-Coyotes.gif Binary files differnew file mode 100644 index 0000000..244c5a0 --- /dev/null +++ b/frontend/static/img/glitter/Phoenix-Coyotes.gif diff --git a/frontend/static/img/glitter/Pink-Bitches.gif b/frontend/static/img/glitter/Pink-Bitches.gif Binary files differnew file mode 100644 index 0000000..ad8b47c --- /dev/null +++ b/frontend/static/img/glitter/Pink-Bitches.gif diff --git a/frontend/static/img/glitter/Pink-Fantashy-Hearts.gif b/frontend/static/img/glitter/Pink-Fantashy-Hearts.gif Binary files differnew file mode 100644 index 0000000..46fc917 --- /dev/null +++ b/frontend/static/img/glitter/Pink-Fantashy-Hearts.gif diff --git a/frontend/static/img/glitter/Pink-Glitter-Star.gif b/frontend/static/img/glitter/Pink-Glitter-Star.gif Binary files differnew file mode 100644 index 0000000..158c95f --- /dev/null +++ b/frontend/static/img/glitter/Pink-Glitter-Star.gif diff --git a/frontend/static/img/glitter/Pink-Godess.gif b/frontend/static/img/glitter/Pink-Godess.gif Binary files differnew file mode 100644 index 0000000..e356dbb --- /dev/null +++ b/frontend/static/img/glitter/Pink-Godess.gif diff --git a/frontend/static/img/glitter/Pink-Heart-Dolphins.gif b/frontend/static/img/glitter/Pink-Heart-Dolphins.gif Binary files differnew file mode 100644 index 0000000..618fc82 --- /dev/null +++ b/frontend/static/img/glitter/Pink-Heart-Dolphins.gif diff --git a/frontend/static/img/glitter/Pink-Lips-High-Heals.gif b/frontend/static/img/glitter/Pink-Lips-High-Heals.gif Binary files differnew file mode 100644 index 0000000..0983265 --- /dev/null +++ b/frontend/static/img/glitter/Pink-Lips-High-Heals.gif diff --git a/frontend/static/img/glitter/Pink-Shoe.gif b/frontend/static/img/glitter/Pink-Shoe.gif Binary files differnew file mode 100644 index 0000000..efc890f --- /dev/null +++ b/frontend/static/img/glitter/Pink-Shoe.gif diff --git a/frontend/static/img/glitter/Pittsburgh-Penguins.gif b/frontend/static/img/glitter/Pittsburgh-Penguins.gif Binary files differnew file mode 100644 index 0000000..cae962d --- /dev/null +++ b/frontend/static/img/glitter/Pittsburgh-Penguins.gif diff --git a/frontend/static/img/glitter/Playboy-029.gif b/frontend/static/img/glitter/Playboy-029.gif Binary files differnew file mode 100644 index 0000000..9b55b44 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-029.gif diff --git a/frontend/static/img/glitter/Playboy-032.gif b/frontend/static/img/glitter/Playboy-032.gif Binary files differnew file mode 100644 index 0000000..1b71531 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-032.gif diff --git a/frontend/static/img/glitter/Playboy-036.gif b/frontend/static/img/glitter/Playboy-036.gif Binary files differnew file mode 100644 index 0000000..19dd4b0 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-036.gif diff --git a/frontend/static/img/glitter/Playboy-045.gif b/frontend/static/img/glitter/Playboy-045.gif Binary files differnew file mode 100644 index 0000000..5ef3485 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-045.gif diff --git a/frontend/static/img/glitter/Playboy-047.gif b/frontend/static/img/glitter/Playboy-047.gif Binary files differnew file mode 100644 index 0000000..a65c97b --- /dev/null +++ b/frontend/static/img/glitter/Playboy-047.gif diff --git a/frontend/static/img/glitter/Playboy-24.gif b/frontend/static/img/glitter/Playboy-24.gif Binary files differnew file mode 100644 index 0000000..6c051d7 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-24.gif diff --git a/frontend/static/img/glitter/Playboy-4.gif b/frontend/static/img/glitter/Playboy-4.gif Binary files differnew file mode 100644 index 0000000..deff339 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-4.gif diff --git a/frontend/static/img/glitter/Playboy-5.gif b/frontend/static/img/glitter/Playboy-5.gif Binary files differnew file mode 100644 index 0000000..1d75b40 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-5.gif diff --git a/frontend/static/img/glitter/Playboy-9.gif b/frontend/static/img/glitter/Playboy-9.gif Binary files differnew file mode 100644 index 0000000..989d51f --- /dev/null +++ b/frontend/static/img/glitter/Playboy-9.gif diff --git a/frontend/static/img/glitter/Playboy-Blue.gif b/frontend/static/img/glitter/Playboy-Blue.gif Binary files differnew file mode 100644 index 0000000..7a72b49 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Blue.gif diff --git a/frontend/static/img/glitter/Playboy-Bunny-Pink.gif b/frontend/static/img/glitter/Playboy-Bunny-Pink.gif Binary files differnew file mode 100644 index 0000000..51a7cbc --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Bunny-Pink.gif diff --git a/frontend/static/img/glitter/Playboy-Orange.gif b/frontend/static/img/glitter/Playboy-Orange.gif Binary files differnew file mode 100644 index 0000000..053b4ef --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Orange.gif diff --git a/frontend/static/img/glitter/Playboy-Pink.gif b/frontend/static/img/glitter/Playboy-Pink.gif Binary files differnew file mode 100644 index 0000000..a395a0e --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Pink.gif diff --git a/frontend/static/img/glitter/Playboy-Purple.gif b/frontend/static/img/glitter/Playboy-Purple.gif Binary files differnew file mode 100644 index 0000000..1d75b40 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Purple.gif diff --git a/frontend/static/img/glitter/Playboy-Silver.gif b/frontend/static/img/glitter/Playboy-Silver.gif Binary files differnew file mode 100644 index 0000000..9b55b44 --- /dev/null +++ b/frontend/static/img/glitter/Playboy-Silver.gif diff --git a/frontend/static/img/glitter/Potty-Head-Care-Bear.gif b/frontend/static/img/glitter/Potty-Head-Care-Bear.gif Binary files differnew file mode 100644 index 0000000..04d38b2 --- /dev/null +++ b/frontend/static/img/glitter/Potty-Head-Care-Bear.gif diff --git a/frontend/static/img/glitter/Powerpuff-Blossom.gif b/frontend/static/img/glitter/Powerpuff-Blossom.gif Binary files differnew file mode 100644 index 0000000..38b5a56 --- /dev/null +++ b/frontend/static/img/glitter/Powerpuff-Blossom.gif diff --git a/frontend/static/img/glitter/Princess-Fairy.gif b/frontend/static/img/glitter/Princess-Fairy.gif Binary files differnew file mode 100644 index 0000000..a433d81 --- /dev/null +++ b/frontend/static/img/glitter/Princess-Fairy.gif diff --git a/frontend/static/img/glitter/Purple-Flower-and-Butterfly.gif b/frontend/static/img/glitter/Purple-Flower-and-Butterfly.gif Binary files differnew file mode 100644 index 0000000..36ce940 --- /dev/null +++ b/frontend/static/img/glitter/Purple-Flower-and-Butterfly.gif diff --git a/frontend/static/img/glitter/Purple-Gal.gif b/frontend/static/img/glitter/Purple-Gal.gif Binary files differnew file mode 100644 index 0000000..b462d75 --- /dev/null +++ b/frontend/static/img/glitter/Purple-Gal.gif diff --git a/frontend/static/img/glitter/Purple-Glitter-Flower.gif b/frontend/static/img/glitter/Purple-Glitter-Flower.gif Binary files differnew file mode 100644 index 0000000..bac8400 --- /dev/null +++ b/frontend/static/img/glitter/Purple-Glitter-Flower.gif diff --git a/frontend/static/img/glitter/Red-Flower.gif b/frontend/static/img/glitter/Red-Flower.gif Binary files differnew file mode 100644 index 0000000..8bc8442 --- /dev/null +++ b/frontend/static/img/glitter/Red-Flower.gif diff --git a/frontend/static/img/glitter/Red-Hair-Glitter.gif b/frontend/static/img/glitter/Red-Hair-Glitter.gif Binary files differnew file mode 100644 index 0000000..60fbd97 --- /dev/null +++ b/frontend/static/img/glitter/Red-Hair-Glitter.gif diff --git a/frontend/static/img/glitter/Red-Haze-Fairy.gif b/frontend/static/img/glitter/Red-Haze-Fairy.gif Binary files differnew file mode 100644 index 0000000..83013da --- /dev/null +++ b/frontend/static/img/glitter/Red-Haze-Fairy.gif diff --git a/frontend/static/img/glitter/Red-Head-Goth.gif b/frontend/static/img/glitter/Red-Head-Goth.gif Binary files differnew file mode 100644 index 0000000..e6b6986 --- /dev/null +++ b/frontend/static/img/glitter/Red-Head-Goth.gif diff --git a/frontend/static/img/glitter/Red-Rose-Glitter.gif b/frontend/static/img/glitter/Red-Rose-Glitter.gif Binary files differnew file mode 100644 index 0000000..a434776 --- /dev/null +++ b/frontend/static/img/glitter/Red-Rose-Glitter.gif diff --git a/frontend/static/img/glitter/Red-Umbrella.gif b/frontend/static/img/glitter/Red-Umbrella.gif Binary files differnew file mode 100644 index 0000000..472a563 --- /dev/null +++ b/frontend/static/img/glitter/Red-Umbrella.gif diff --git a/frontend/static/img/glitter/Res-Fantasy-Sky.gif b/frontend/static/img/glitter/Res-Fantasy-Sky.gif Binary files differnew file mode 100644 index 0000000..c6dccef --- /dev/null +++ b/frontend/static/img/glitter/Res-Fantasy-Sky.gif diff --git a/frontend/static/img/glitter/Riding-Roses.gif b/frontend/static/img/glitter/Riding-Roses.gif Binary files differnew file mode 100644 index 0000000..b67223c --- /dev/null +++ b/frontend/static/img/glitter/Riding-Roses.gif diff --git a/frontend/static/img/glitter/Rose.gif b/frontend/static/img/glitter/Rose.gif Binary files differnew file mode 100644 index 0000000..8687edf --- /dev/null +++ b/frontend/static/img/glitter/Rose.gif diff --git a/frontend/static/img/glitter/Samurai-Chick.gif b/frontend/static/img/glitter/Samurai-Chick.gif Binary files differnew file mode 100644 index 0000000..981e847 --- /dev/null +++ b/frontend/static/img/glitter/Samurai-Chick.gif diff --git a/frontend/static/img/glitter/Set-Me-free.gif b/frontend/static/img/glitter/Set-Me-free.gif Binary files differnew file mode 100644 index 0000000..802343f --- /dev/null +++ b/frontend/static/img/glitter/Set-Me-free.gif diff --git a/frontend/static/img/glitter/Sexy-Bitch-Leoppard-1.gif b/frontend/static/img/glitter/Sexy-Bitch-Leoppard-1.gif Binary files differnew file mode 100644 index 0000000..4665066 --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Bitch-Leoppard-1.gif diff --git a/frontend/static/img/glitter/Sexy-Bitch-Leoppard.gif b/frontend/static/img/glitter/Sexy-Bitch-Leoppard.gif Binary files differnew file mode 100644 index 0000000..4665066 --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Bitch-Leoppard.gif diff --git a/frontend/static/img/glitter/Sexy-Black-White.gif b/frontend/static/img/glitter/Sexy-Black-White.gif Binary files differnew file mode 100644 index 0000000..b04cc5b --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Black-White.gif diff --git a/frontend/static/img/glitter/Sexy-Blue-Hearts.gif b/frontend/static/img/glitter/Sexy-Blue-Hearts.gif Binary files differnew file mode 100644 index 0000000..55d93cc --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Blue-Hearts.gif diff --git a/frontend/static/img/glitter/Sexy-Cape.gif b/frontend/static/img/glitter/Sexy-Cape.gif Binary files differnew file mode 100644 index 0000000..02c8e66 --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Cape.gif diff --git a/frontend/static/img/glitter/Sexy-Flower-Bed.gif b/frontend/static/img/glitter/Sexy-Flower-Bed.gif Binary files differnew file mode 100644 index 0000000..3489cda --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Flower-Bed.gif diff --git a/frontend/static/img/glitter/Sexy-Silver.gif b/frontend/static/img/glitter/Sexy-Silver.gif Binary files differnew file mode 100644 index 0000000..3a9e95c --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Silver.gif diff --git a/frontend/static/img/glitter/Sexy-Star.gif b/frontend/static/img/glitter/Sexy-Star.gif Binary files differnew file mode 100644 index 0000000..155cee5 --- /dev/null +++ b/frontend/static/img/glitter/Sexy-Star.gif diff --git a/frontend/static/img/glitter/Sexy-White-Hair.gif b/frontend/static/img/glitter/Sexy-White-Hair.gif Binary files differnew file mode 100644 index 0000000..71f8eae --- /dev/null +++ b/frontend/static/img/glitter/Sexy-White-Hair.gif diff --git a/frontend/static/img/glitter/Sharing-Fruit.gif b/frontend/static/img/glitter/Sharing-Fruit.gif Binary files differnew file mode 100644 index 0000000..63f6106 --- /dev/null +++ b/frontend/static/img/glitter/Sharing-Fruit.gif diff --git a/frontend/static/img/glitter/Show-It-To-Me.gif b/frontend/static/img/glitter/Show-It-To-Me.gif Binary files differnew file mode 100644 index 0000000..b4040ac --- /dev/null +++ b/frontend/static/img/glitter/Show-It-To-Me.gif diff --git a/frontend/static/img/glitter/Showing-Sexy-Luv.gif b/frontend/static/img/glitter/Showing-Sexy-Luv.gif Binary files differnew file mode 100644 index 0000000..b2a2ec7 --- /dev/null +++ b/frontend/static/img/glitter/Showing-Sexy-Luv.gif diff --git a/frontend/static/img/glitter/Silver-Cross.gif b/frontend/static/img/glitter/Silver-Cross.gif Binary files differnew file mode 100644 index 0000000..2392eba --- /dev/null +++ b/frontend/static/img/glitter/Silver-Cross.gif diff --git a/frontend/static/img/glitter/Silver-Flower-Face.gif b/frontend/static/img/glitter/Silver-Flower-Face.gif Binary files differnew file mode 100644 index 0000000..8f14566 --- /dev/null +++ b/frontend/static/img/glitter/Silver-Flower-Face.gif diff --git a/frontend/static/img/glitter/Simply-Pink.gif b/frontend/static/img/glitter/Simply-Pink.gif Binary files differnew file mode 100644 index 0000000..fb71829 --- /dev/null +++ b/frontend/static/img/glitter/Simply-Pink.gif diff --git a/frontend/static/img/glitter/Sleek-Red.gif b/frontend/static/img/glitter/Sleek-Red.gif Binary files differnew file mode 100644 index 0000000..868f645 --- /dev/null +++ b/frontend/static/img/glitter/Sleek-Red.gif diff --git a/frontend/static/img/glitter/Soft-Ice-Cream.gif b/frontend/static/img/glitter/Soft-Ice-Cream.gif Binary files differnew file mode 100644 index 0000000..f1766f2 --- /dev/null +++ b/frontend/static/img/glitter/Soft-Ice-Cream.gif diff --git a/frontend/static/img/glitter/Some-Like-It-hot.gif b/frontend/static/img/glitter/Some-Like-It-hot.gif Binary files differnew file mode 100644 index 0000000..0a703af --- /dev/null +++ b/frontend/static/img/glitter/Some-Like-It-hot.gif diff --git a/frontend/static/img/glitter/Spanish-Beauty.gif b/frontend/static/img/glitter/Spanish-Beauty.gif Binary files differnew file mode 100644 index 0000000..45d7249 --- /dev/null +++ b/frontend/static/img/glitter/Spanish-Beauty.gif diff --git a/frontend/static/img/glitter/Spank-Me-1.gif b/frontend/static/img/glitter/Spank-Me-1.gif Binary files differnew file mode 100644 index 0000000..197ba68 --- /dev/null +++ b/frontend/static/img/glitter/Spank-Me-1.gif diff --git a/frontend/static/img/glitter/Spank-Me.gif b/frontend/static/img/glitter/Spank-Me.gif Binary files differnew file mode 100644 index 0000000..197ba68 --- /dev/null +++ b/frontend/static/img/glitter/Spank-Me.gif diff --git a/frontend/static/img/glitter/St-Louis-Rams.gif b/frontend/static/img/glitter/St-Louis-Rams.gif Binary files differnew file mode 100644 index 0000000..0b4b827 --- /dev/null +++ b/frontend/static/img/glitter/St-Louis-Rams.gif diff --git a/frontend/static/img/glitter/Sucker.gif b/frontend/static/img/glitter/Sucker.gif Binary files differnew file mode 100644 index 0000000..bc00e1c --- /dev/null +++ b/frontend/static/img/glitter/Sucker.gif diff --git a/frontend/static/img/glitter/Tampa-Bay-Devilrays.gif b/frontend/static/img/glitter/Tampa-Bay-Devilrays.gif Binary files differnew file mode 100644 index 0000000..410fc4f --- /dev/null +++ b/frontend/static/img/glitter/Tampa-Bay-Devilrays.gif diff --git a/frontend/static/img/glitter/Tear-Drop-Fairy-1.gif b/frontend/static/img/glitter/Tear-Drop-Fairy-1.gif Binary files differnew file mode 100644 index 0000000..59672e4 --- /dev/null +++ b/frontend/static/img/glitter/Tear-Drop-Fairy-1.gif diff --git a/frontend/static/img/glitter/Tear-Drop-Fairy.gif b/frontend/static/img/glitter/Tear-Drop-Fairy.gif Binary files differnew file mode 100644 index 0000000..59672e4 --- /dev/null +++ b/frontend/static/img/glitter/Tear-Drop-Fairy.gif diff --git a/frontend/static/img/glitter/Teddy-Bear-Glitter.gif b/frontend/static/img/glitter/Teddy-Bear-Glitter.gif Binary files differnew file mode 100644 index 0000000..26a49c1 --- /dev/null +++ b/frontend/static/img/glitter/Teddy-Bear-Glitter.gif diff --git a/frontend/static/img/glitter/Texas-Rangers.gif b/frontend/static/img/glitter/Texas-Rangers.gif Binary files differnew file mode 100644 index 0000000..272bc07 --- /dev/null +++ b/frontend/static/img/glitter/Texas-Rangers.gif diff --git a/frontend/static/img/glitter/Thank-You-Friend.gif b/frontend/static/img/glitter/Thank-You-Friend.gif Binary files differnew file mode 100644 index 0000000..1e754ca --- /dev/null +++ b/frontend/static/img/glitter/Thank-You-Friend.gif diff --git a/frontend/static/img/glitter/Tinkerbell-Dreamy.gif b/frontend/static/img/glitter/Tinkerbell-Dreamy.gif Binary files differnew file mode 100644 index 0000000..407ddb8 --- /dev/null +++ b/frontend/static/img/glitter/Tinkerbell-Dreamy.gif diff --git a/frontend/static/img/glitter/Tinkerbell-Flying.gif b/frontend/static/img/glitter/Tinkerbell-Flying.gif Binary files differnew file mode 100644 index 0000000..92bbcf7 --- /dev/null +++ b/frontend/static/img/glitter/Tinkerbell-Flying.gif diff --git a/frontend/static/img/glitter/Tinkerbell-Green-Dress.gif b/frontend/static/img/glitter/Tinkerbell-Green-Dress.gif Binary files differnew file mode 100644 index 0000000..9fdfe14 --- /dev/null +++ b/frontend/static/img/glitter/Tinkerbell-Green-Dress.gif diff --git a/frontend/static/img/glitter/Tinkerbell.gif b/frontend/static/img/glitter/Tinkerbell.gif Binary files differnew file mode 100644 index 0000000..fe44edd --- /dev/null +++ b/frontend/static/img/glitter/Tinkerbell.gif diff --git a/frontend/static/img/glitter/Tired-Puppy.gif b/frontend/static/img/glitter/Tired-Puppy.gif Binary files differnew file mode 100644 index 0000000..d47a6d7 --- /dev/null +++ b/frontend/static/img/glitter/Tired-Puppy.gif diff --git a/frontend/static/img/glitter/Tweety-Bird-Dancing.gif b/frontend/static/img/glitter/Tweety-Bird-Dancing.gif Binary files differnew file mode 100644 index 0000000..b3989fc --- /dev/null +++ b/frontend/static/img/glitter/Tweety-Bird-Dancing.gif diff --git a/frontend/static/img/glitter/Two-Sexy-Gals.gif b/frontend/static/img/glitter/Two-Sexy-Gals.gif Binary files differnew file mode 100644 index 0000000..f14e388 --- /dev/null +++ b/frontend/static/img/glitter/Two-Sexy-Gals.gif diff --git a/frontend/static/img/glitter/Vibrate-Me-1.gif b/frontend/static/img/glitter/Vibrate-Me-1.gif Binary files differnew file mode 100644 index 0000000..bfd2da4 --- /dev/null +++ b/frontend/static/img/glitter/Vibrate-Me-1.gif diff --git a/frontend/static/img/glitter/Vibrate-Me.gif b/frontend/static/img/glitter/Vibrate-Me.gif Binary files differnew file mode 100644 index 0000000..bfd2da4 --- /dev/null +++ b/frontend/static/img/glitter/Vibrate-Me.gif diff --git a/frontend/static/img/glitter/Washington-Redskins.gif b/frontend/static/img/glitter/Washington-Redskins.gif Binary files differnew file mode 100644 index 0000000..3d88595 --- /dev/null +++ b/frontend/static/img/glitter/Washington-Redskins.gif diff --git a/frontend/static/img/glitter/Wings-2.gif b/frontend/static/img/glitter/Wings-2.gif Binary files differnew file mode 100644 index 0000000..184d22e --- /dev/null +++ b/frontend/static/img/glitter/Wings-2.gif diff --git a/frontend/static/img/glitter/Wings-5.gif b/frontend/static/img/glitter/Wings-5.gif Binary files differnew file mode 100644 index 0000000..e27582b --- /dev/null +++ b/frontend/static/img/glitter/Wings-5.gif diff --git a/frontend/static/img/glitter/Winnie-Glitter-2.gif b/frontend/static/img/glitter/Winnie-Glitter-2.gif Binary files differnew file mode 100644 index 0000000..aecb22a --- /dev/null +++ b/frontend/static/img/glitter/Winnie-Glitter-2.gif diff --git a/frontend/static/img/glitter/Winnie-Glitter.gif b/frontend/static/img/glitter/Winnie-Glitter.gif Binary files differnew file mode 100644 index 0000000..d5a0e03 --- /dev/null +++ b/frontend/static/img/glitter/Winnie-Glitter.gif diff --git a/frontend/static/img/glitter/XoXo-Hearts.gif b/frontend/static/img/glitter/XoXo-Hearts.gif Binary files differnew file mode 100644 index 0000000..ae504fa --- /dev/null +++ b/frontend/static/img/glitter/XoXo-Hearts.gif diff --git a/frontend/static/img/glitter/Yellow-Bird.gif b/frontend/static/img/glitter/Yellow-Bird.gif Binary files differnew file mode 100644 index 0000000..9f9973d --- /dev/null +++ b/frontend/static/img/glitter/Yellow-Bird.gif diff --git a/frontend/static/img/glitter/You-Want-It-Come-and-Get-It.gif b/frontend/static/img/glitter/You-Want-It-Come-and-Get-It.gif Binary files differnew file mode 100644 index 0000000..8b567ab --- /dev/null +++ b/frontend/static/img/glitter/You-Want-It-Come-and-Get-It.gif diff --git a/frontend/static/img/glitter/Young-Red-Witch.gif b/frontend/static/img/glitter/Young-Red-Witch.gif Binary files differnew file mode 100644 index 0000000..40ac67b --- /dev/null +++ b/frontend/static/img/glitter/Young-Red-Witch.gif diff --git a/frontend/static/img/glitter/aaliyah.gif b/frontend/static/img/glitter/aaliyah.gif Binary files differnew file mode 100644 index 0000000..5e7b4c7 --- /dev/null +++ b/frontend/static/img/glitter/aaliyah.gif diff --git a/frontend/static/img/glitter/ani-sparkle-fountain.gif b/frontend/static/img/glitter/ani-sparkle-fountain.gif Binary files differnew file mode 100644 index 0000000..0d835c8 --- /dev/null +++ b/frontend/static/img/glitter/ani-sparkle-fountain.gif diff --git a/frontend/static/img/glitter/awkward_pink_purple_glitter_wiggle.gif b/frontend/static/img/glitter/awkward_pink_purple_glitter_wiggle.gif Binary files differnew file mode 100644 index 0000000..cdc26f2 --- /dev/null +++ b/frontend/static/img/glitter/awkward_pink_purple_glitter_wiggle.gif diff --git a/frontend/static/img/glitter/babe-bikini-butt-ass-face.gif b/frontend/static/img/glitter/babe-bikini-butt-ass-face.gif Binary files differnew file mode 100644 index 0000000..c7538f4 --- /dev/null +++ b/frontend/static/img/glitter/babe-bikini-butt-ass-face.gif diff --git a/frontend/static/img/glitter/beautiful-unicorn-magical-sparkle.gif b/frontend/static/img/glitter/beautiful-unicorn-magical-sparkle.gif Binary files differnew file mode 100644 index 0000000..03f6264 --- /dev/null +++ b/frontend/static/img/glitter/beautiful-unicorn-magical-sparkle.gif diff --git a/frontend/static/img/glitter/beauty-red-rose-sparkle.gif b/frontend/static/img/glitter/beauty-red-rose-sparkle.gif Binary files differnew file mode 100644 index 0000000..ef81dbb --- /dev/null +++ b/frontend/static/img/glitter/beauty-red-rose-sparkle.gif diff --git a/frontend/static/img/glitter/blonde_gold_sparkle.gif b/frontend/static/img/glitter/blonde_gold_sparkle.gif Binary files differnew file mode 100644 index 0000000..a47b441 --- /dev/null +++ b/frontend/static/img/glitter/blonde_gold_sparkle.gif diff --git a/frontend/static/img/glitter/christian_symbol07.gif b/frontend/static/img/glitter/christian_symbol07.gif Binary files differnew file mode 100644 index 0000000..5e7f9a7 --- /dev/null +++ b/frontend/static/img/glitter/christian_symbol07.gif diff --git a/frontend/static/img/glitter/christmas-sexy11.gif b/frontend/static/img/glitter/christmas-sexy11.gif Binary files differnew file mode 100644 index 0000000..0837b7b --- /dev/null +++ b/frontend/static/img/glitter/christmas-sexy11.gif diff --git a/frontend/static/img/glitter/christmas-sexy6.gif b/frontend/static/img/glitter/christmas-sexy6.gif Binary files differnew file mode 100644 index 0000000..390b44f --- /dev/null +++ b/frontend/static/img/glitter/christmas-sexy6.gif diff --git a/frontend/static/img/glitter/cleopatra-elizabeth-liz-taylor-dress-babe.gif b/frontend/static/img/glitter/cleopatra-elizabeth-liz-taylor-dress-babe.gif Binary files differnew file mode 100644 index 0000000..6094279 --- /dev/null +++ b/frontend/static/img/glitter/cleopatra-elizabeth-liz-taylor-dress-babe.gif diff --git a/frontend/static/img/glitter/date13.gif b/frontend/static/img/glitter/date13.gif Binary files differnew file mode 100644 index 0000000..52186b2 --- /dev/null +++ b/frontend/static/img/glitter/date13.gif diff --git a/frontend/static/img/glitter/dreamer.gif b/frontend/static/img/glitter/dreamer.gif Binary files differnew file mode 100644 index 0000000..e14007b --- /dev/null +++ b/frontend/static/img/glitter/dreamer.gif diff --git a/frontend/static/img/glitter/egypt.gif b/frontend/static/img/glitter/egypt.gif Binary files differnew file mode 100644 index 0000000..343d411 --- /dev/null +++ b/frontend/static/img/glitter/egypt.gif diff --git a/frontend/static/img/glitter/egypt_320_256_9223372036854775000_0_1_0.gif b/frontend/static/img/glitter/egypt_320_256_9223372036854775000_0_1_0.gif Binary files differnew file mode 100644 index 0000000..3503bd1 --- /dev/null +++ b/frontend/static/img/glitter/egypt_320_256_9223372036854775000_0_1_0.gif diff --git a/frontend/static/img/glitter/egypt_320_320_256_9223372036854775000_0_1_0.gif b/frontend/static/img/glitter/egypt_320_320_256_9223372036854775000_0_1_0.gif Binary files differnew file mode 100644 index 0000000..ea2afb3 --- /dev/null +++ b/frontend/static/img/glitter/egypt_320_320_256_9223372036854775000_0_1_0.gif diff --git a/frontend/static/img/glitter/eye-glitter.gif b/frontend/static/img/glitter/eye-glitter.gif Binary files differnew file mode 100644 index 0000000..37de2ac --- /dev/null +++ b/frontend/static/img/glitter/eye-glitter.gif diff --git a/frontend/static/img/glitter/flirting-my-way-to-the-top.gif b/frontend/static/img/glitter/flirting-my-way-to-the-top.gif Binary files differnew file mode 100644 index 0000000..f9f2d92 --- /dev/null +++ b/frontend/static/img/glitter/flirting-my-way-to-the-top.gif diff --git a/frontend/static/img/glitter/flowers.gif b/frontend/static/img/glitter/flowers.gif Binary files differnew file mode 100644 index 0000000..63477a9 --- /dev/null +++ b/frontend/static/img/glitter/flowers.gif diff --git a/frontend/static/img/glitter/glitterfriend38.gif b/frontend/static/img/glitter/glitterfriend38.gif Binary files differnew file mode 100644 index 0000000..0c2610c --- /dev/null +++ b/frontend/static/img/glitter/glitterfriend38.gif diff --git a/frontend/static/img/glitter/goodbye7(combine).gif b/frontend/static/img/glitter/goodbye7(combine).gif Binary files differnew file mode 100644 index 0000000..77e14a0 --- /dev/null +++ b/frontend/static/img/glitter/goodbye7(combine).gif diff --git a/frontend/static/img/glitter/gtmc034.gif b/frontend/static/img/glitter/gtmc034.gif Binary files differnew file mode 100644 index 0000000..ebc65aa --- /dev/null +++ b/frontend/static/img/glitter/gtmc034.gif diff --git a/frontend/static/img/glitter/gtmc037.gif b/frontend/static/img/glitter/gtmc037.gif Binary files differnew file mode 100644 index 0000000..aab2b8b --- /dev/null +++ b/frontend/static/img/glitter/gtmc037.gif diff --git a/frontend/static/img/glitter/gtmc039.gif b/frontend/static/img/glitter/gtmc039.gif Binary files differnew file mode 100644 index 0000000..5d6ac6f --- /dev/null +++ b/frontend/static/img/glitter/gtmc039.gif diff --git a/frontend/static/img/glitter/gtmc041.gif b/frontend/static/img/glitter/gtmc041.gif Binary files differnew file mode 100644 index 0000000..2958878 --- /dev/null +++ b/frontend/static/img/glitter/gtmc041.gif diff --git a/frontend/static/img/glitter/gtmc048.gif b/frontend/static/img/glitter/gtmc048.gif Binary files differnew file mode 100644 index 0000000..fecb2de --- /dev/null +++ b/frontend/static/img/glitter/gtmc048.gif diff --git a/frontend/static/img/glitter/gtmc058.gif b/frontend/static/img/glitter/gtmc058.gif Binary files differnew file mode 100644 index 0000000..57b1d5c --- /dev/null +++ b/frontend/static/img/glitter/gtmc058.gif diff --git a/frontend/static/img/glitter/gtmc067.gif b/frontend/static/img/glitter/gtmc067.gif Binary files differnew file mode 100644 index 0000000..fb4e2c7 --- /dev/null +++ b/frontend/static/img/glitter/gtmc067.gif diff --git a/frontend/static/img/glitter/gtmc072.gif b/frontend/static/img/glitter/gtmc072.gif Binary files differnew file mode 100644 index 0000000..128fa1d --- /dev/null +++ b/frontend/static/img/glitter/gtmc072.gif diff --git a/frontend/static/img/glitter/gtmc079.gif b/frontend/static/img/glitter/gtmc079.gif Binary files differnew file mode 100644 index 0000000..19d1121 --- /dev/null +++ b/frontend/static/img/glitter/gtmc079.gif diff --git a/frontend/static/img/glitter/happy-new-year-524.gif b/frontend/static/img/glitter/happy-new-year-524.gif Binary files differnew file mode 100644 index 0000000..bfefee5 --- /dev/null +++ b/frontend/static/img/glitter/happy-new-year-524.gif diff --git a/frontend/static/img/glitter/happy-new-year-527.gif b/frontend/static/img/glitter/happy-new-year-527.gif Binary files differnew file mode 100644 index 0000000..47897ea --- /dev/null +++ b/frontend/static/img/glitter/happy-new-year-527.gif diff --git a/frontend/static/img/glitter/happy-new-year-computer.gif b/frontend/static/img/glitter/happy-new-year-computer.gif Binary files differnew file mode 100644 index 0000000..fb39bee --- /dev/null +++ b/frontend/static/img/glitter/happy-new-year-computer.gif diff --git a/frontend/static/img/glitter/happy-new-year.gif b/frontend/static/img/glitter/happy-new-year.gif Binary files differnew file mode 100644 index 0000000..bd05c05 --- /dev/null +++ b/frontend/static/img/glitter/happy-new-year.gif diff --git a/frontend/static/img/glitter/ice-cream-cone-dessert-sweet-smile.gif b/frontend/static/img/glitter/ice-cream-cone-dessert-sweet-smile.gif Binary files differnew file mode 100644 index 0000000..3a87e64 --- /dev/null +++ b/frontend/static/img/glitter/ice-cream-cone-dessert-sweet-smile.gif diff --git a/frontend/static/img/glitter/kisses-for-my-valentine-glitter.gif b/frontend/static/img/glitter/kisses-for-my-valentine-glitter.gif Binary files differnew file mode 100644 index 0000000..222c878 --- /dev/null +++ b/frontend/static/img/glitter/kisses-for-my-valentine-glitter.gif diff --git a/frontend/static/img/glitter/lindsay-lohan.gif b/frontend/static/img/glitter/lindsay-lohan.gif Binary files differnew file mode 100644 index 0000000..b5cfbf3 --- /dev/null +++ b/frontend/static/img/glitter/lindsay-lohan.gif diff --git a/frontend/static/img/glitter/myspace-flower-rose.gif b/frontend/static/img/glitter/myspace-flower-rose.gif Binary files differnew file mode 100644 index 0000000..d311c64 --- /dev/null +++ b/frontend/static/img/glitter/myspace-flower-rose.gif diff --git a/frontend/static/img/glitter/never-give-up.gif b/frontend/static/img/glitter/never-give-up.gif Binary files differnew file mode 100644 index 0000000..d6514ef --- /dev/null +++ b/frontend/static/img/glitter/never-give-up.gif diff --git a/frontend/static/img/glitter/new-year-29.gif b/frontend/static/img/glitter/new-year-29.gif Binary files differnew file mode 100644 index 0000000..8002d7a --- /dev/null +++ b/frontend/static/img/glitter/new-year-29.gif diff --git a/frontend/static/img/glitter/penis.gif b/frontend/static/img/glitter/penis.gif Binary files differnew file mode 100644 index 0000000..f2190f8 --- /dev/null +++ b/frontend/static/img/glitter/penis.gif diff --git a/frontend/static/img/glitter/pinkcowgirl.gif b/frontend/static/img/glitter/pinkcowgirl.gif Binary files differnew file mode 100644 index 0000000..47b34e1 --- /dev/null +++ b/frontend/static/img/glitter/pinkcowgirl.gif diff --git a/frontend/static/img/glitter/proud-mom-aunt.gif b/frontend/static/img/glitter/proud-mom-aunt.gif Binary files differnew file mode 100644 index 0000000..c21ea00 --- /dev/null +++ b/frontend/static/img/glitter/proud-mom-aunt.gif diff --git a/frontend/static/img/glitter/sexy-100.gif b/frontend/static/img/glitter/sexy-100.gif Binary files differnew file mode 100644 index 0000000..2dd5ff5 --- /dev/null +++ b/frontend/static/img/glitter/sexy-100.gif diff --git a/frontend/static/img/glitter/showin_some_love_reflecting_rosebud.gif b/frontend/static/img/glitter/showin_some_love_reflecting_rosebud.gif Binary files differnew file mode 100644 index 0000000..9d58e50 --- /dev/null +++ b/frontend/static/img/glitter/showin_some_love_reflecting_rosebud.gif diff --git a/frontend/static/img/glitter/sparkle-logo.gif b/frontend/static/img/glitter/sparkle-logo.gif Binary files differnew file mode 100644 index 0000000..b42bca4 --- /dev/null +++ b/frontend/static/img/glitter/sparkle-logo.gif diff --git a/frontend/static/img/glitter/staypunk-sparkle-cross.gif b/frontend/static/img/glitter/staypunk-sparkle-cross.gif Binary files differnew file mode 100644 index 0000000..36b1ac8 --- /dev/null +++ b/frontend/static/img/glitter/staypunk-sparkle-cross.gif diff --git a/frontend/static/img/glitter/thanksc.gif b/frontend/static/img/glitter/thanksc.gif Binary files differnew file mode 100644 index 0000000..3bdf13a --- /dev/null +++ b/frontend/static/img/glitter/thanksc.gif diff --git a/frontend/static/img/glitter/tiger_eye_sparkle.gif b/frontend/static/img/glitter/tiger_eye_sparkle.gif Binary files differnew file mode 100644 index 0000000..ecd5c43 --- /dev/null +++ b/frontend/static/img/glitter/tiger_eye_sparkle.gif diff --git a/frontend/static/img/glitter/woman-style-lipstick-makeup.gif b/frontend/static/img/glitter/woman-style-lipstick-makeup.gif Binary files differnew file mode 100644 index 0000000..0754a53 --- /dev/null +++ b/frontend/static/img/glitter/woman-style-lipstick-makeup.gif diff --git a/frontend/static/img/glitter_flower.gif b/frontend/static/img/glitter_flower.gif Binary files differnew file mode 100644 index 0000000..050cc11 --- /dev/null +++ b/frontend/static/img/glitter_flower.gif diff --git a/frontend/static/img/glitter_scannerjammer.gif b/frontend/static/img/glitter_scannerjammer.gif Binary files differnew file mode 100644 index 0000000..64fd575 --- /dev/null +++ b/frontend/static/img/glitter_scannerjammer.gif diff --git a/frontend/static/img/glittergutzbg.gif b/frontend/static/img/glittergutzbg.gif Binary files differnew file mode 100644 index 0000000..c1d2b10 --- /dev/null +++ b/frontend/static/img/glittergutzbg.gif diff --git a/frontend/static/img/icons/aim_16.png b/frontend/static/img/icons/aim_16.png Binary files differnew file mode 100755 index 0000000..f0e0dc1 --- /dev/null +++ b/frontend/static/img/icons/aim_16.png diff --git a/frontend/static/img/icons/aim_32.png b/frontend/static/img/icons/aim_32.png Binary files differnew file mode 100755 index 0000000..e343bd8 --- /dev/null +++ b/frontend/static/img/icons/aim_32.png diff --git a/frontend/static/img/icons/apple_16.png b/frontend/static/img/icons/apple_16.png Binary files differnew file mode 100755 index 0000000..6db1f23 --- /dev/null +++ b/frontend/static/img/icons/apple_16.png diff --git a/frontend/static/img/icons/apple_32.png b/frontend/static/img/icons/apple_32.png Binary files differnew file mode 100755 index 0000000..260e491 --- /dev/null +++ b/frontend/static/img/icons/apple_32.png diff --git a/frontend/static/img/icons/bandcamp_32.png b/frontend/static/img/icons/bandcamp_32.png Binary files differnew file mode 100644 index 0000000..9561303 --- /dev/null +++ b/frontend/static/img/icons/bandcamp_32.png diff --git a/frontend/static/img/icons/bebo_16.png b/frontend/static/img/icons/bebo_16.png Binary files differnew file mode 100755 index 0000000..ee944b7 --- /dev/null +++ b/frontend/static/img/icons/bebo_16.png diff --git a/frontend/static/img/icons/bebo_32.png b/frontend/static/img/icons/bebo_32.png Binary files differnew file mode 100755 index 0000000..556aea1 --- /dev/null +++ b/frontend/static/img/icons/bebo_32.png diff --git a/frontend/static/img/icons/blogger_16.png b/frontend/static/img/icons/blogger_16.png Binary files differnew file mode 100755 index 0000000..40172ce --- /dev/null +++ b/frontend/static/img/icons/blogger_16.png diff --git a/frontend/static/img/icons/blogger_32.png b/frontend/static/img/icons/blogger_32.png Binary files differnew file mode 100755 index 0000000..40825a5 --- /dev/null +++ b/frontend/static/img/icons/blogger_32.png diff --git a/frontend/static/img/icons/brightkite_16.png b/frontend/static/img/icons/brightkite_16.png Binary files differnew file mode 100755 index 0000000..4de9fee --- /dev/null +++ b/frontend/static/img/icons/brightkite_16.png diff --git a/frontend/static/img/icons/brightkite_32.png b/frontend/static/img/icons/brightkite_32.png Binary files differnew file mode 100755 index 0000000..6ff286a --- /dev/null +++ b/frontend/static/img/icons/brightkite_32.png diff --git a/frontend/static/img/icons/cargo_16.png b/frontend/static/img/icons/cargo_16.png Binary files differnew file mode 100755 index 0000000..f9c7935 --- /dev/null +++ b/frontend/static/img/icons/cargo_16.png diff --git a/frontend/static/img/icons/cargo_32.png b/frontend/static/img/icons/cargo_32.png Binary files differnew file mode 100755 index 0000000..25cd8b2 --- /dev/null +++ b/frontend/static/img/icons/cargo_32.png diff --git a/frontend/static/img/icons/delicious_16.png b/frontend/static/img/icons/delicious_16.png Binary files differnew file mode 100755 index 0000000..e4ebb98 --- /dev/null +++ b/frontend/static/img/icons/delicious_16.png diff --git a/frontend/static/img/icons/delicious_32.png b/frontend/static/img/icons/delicious_32.png Binary files differnew file mode 100755 index 0000000..482e0fa --- /dev/null +++ b/frontend/static/img/icons/delicious_32.png diff --git a/frontend/static/img/icons/designfloat_16.png b/frontend/static/img/icons/designfloat_16.png Binary files differnew file mode 100755 index 0000000..80e356e --- /dev/null +++ b/frontend/static/img/icons/designfloat_16.png diff --git a/frontend/static/img/icons/designfloat_32.png b/frontend/static/img/icons/designfloat_32.png Binary files differnew file mode 100755 index 0000000..9d17066 --- /dev/null +++ b/frontend/static/img/icons/designfloat_32.png diff --git a/frontend/static/img/icons/designmoo_16.png b/frontend/static/img/icons/designmoo_16.png Binary files differnew file mode 100755 index 0000000..90d4b84 --- /dev/null +++ b/frontend/static/img/icons/designmoo_16.png diff --git a/frontend/static/img/icons/designmoo_32.png b/frontend/static/img/icons/designmoo_32.png Binary files differnew file mode 100755 index 0000000..936da3a --- /dev/null +++ b/frontend/static/img/icons/designmoo_32.png diff --git a/frontend/static/img/icons/deviantart_16.png b/frontend/static/img/icons/deviantart_16.png Binary files differnew file mode 100755 index 0000000..363accb --- /dev/null +++ b/frontend/static/img/icons/deviantart_16.png diff --git a/frontend/static/img/icons/deviantart_32.png b/frontend/static/img/icons/deviantart_32.png Binary files differnew file mode 100755 index 0000000..8773163 --- /dev/null +++ b/frontend/static/img/icons/deviantart_32.png diff --git a/frontend/static/img/icons/digg_16.png b/frontend/static/img/icons/digg_16.png Binary files differnew file mode 100755 index 0000000..fa2efee --- /dev/null +++ b/frontend/static/img/icons/digg_16.png diff --git a/frontend/static/img/icons/digg_32.png b/frontend/static/img/icons/digg_32.png Binary files differnew file mode 100755 index 0000000..1c75b49 --- /dev/null +++ b/frontend/static/img/icons/digg_32.png diff --git a/frontend/static/img/icons/digg_alt_16.png b/frontend/static/img/icons/digg_alt_16.png Binary files differnew file mode 100755 index 0000000..49245da --- /dev/null +++ b/frontend/static/img/icons/digg_alt_16.png diff --git a/frontend/static/img/icons/dopplr_16.png b/frontend/static/img/icons/dopplr_16.png Binary files differnew file mode 100755 index 0000000..c3a8e38 --- /dev/null +++ b/frontend/static/img/icons/dopplr_16.png diff --git a/frontend/static/img/icons/dopplr_32.png b/frontend/static/img/icons/dopplr_32.png Binary files differnew file mode 100755 index 0000000..a81c683 --- /dev/null +++ b/frontend/static/img/icons/dopplr_32.png diff --git a/frontend/static/img/icons/dribbble_16.png b/frontend/static/img/icons/dribbble_16.png Binary files differnew file mode 100755 index 0000000..a6a27c7 --- /dev/null +++ b/frontend/static/img/icons/dribbble_16.png diff --git a/frontend/static/img/icons/dribbble_32.png b/frontend/static/img/icons/dribbble_32.png Binary files differnew file mode 100755 index 0000000..344a28c --- /dev/null +++ b/frontend/static/img/icons/dribbble_32.png diff --git a/frontend/static/img/icons/email_16.png b/frontend/static/img/icons/email_16.png Binary files differnew file mode 100755 index 0000000..2cabb17 --- /dev/null +++ b/frontend/static/img/icons/email_16.png diff --git a/frontend/static/img/icons/email_32.png b/frontend/static/img/icons/email_32.png Binary files differnew file mode 100755 index 0000000..9cba18c --- /dev/null +++ b/frontend/static/img/icons/email_32.png diff --git a/frontend/static/img/icons/ember_16.png b/frontend/static/img/icons/ember_16.png Binary files differnew file mode 100755 index 0000000..c7eef3b --- /dev/null +++ b/frontend/static/img/icons/ember_16.png diff --git a/frontend/static/img/icons/ember_32.png b/frontend/static/img/icons/ember_32.png Binary files differnew file mode 100755 index 0000000..88215bc --- /dev/null +++ b/frontend/static/img/icons/ember_32.png diff --git a/frontend/static/img/icons/evernote_16.png b/frontend/static/img/icons/evernote_16.png Binary files differnew file mode 100755 index 0000000..40d7a7d --- /dev/null +++ b/frontend/static/img/icons/evernote_16.png diff --git a/frontend/static/img/icons/evernote_32.png b/frontend/static/img/icons/evernote_32.png Binary files differnew file mode 100755 index 0000000..9485554 --- /dev/null +++ b/frontend/static/img/icons/evernote_32.png diff --git a/frontend/static/img/icons/facebook_16.png b/frontend/static/img/icons/facebook_16.png Binary files differnew file mode 100755 index 0000000..f0faf29 --- /dev/null +++ b/frontend/static/img/icons/facebook_16.png diff --git a/frontend/static/img/icons/facebook_32.png b/frontend/static/img/icons/facebook_32.png Binary files differnew file mode 100755 index 0000000..24d7f41 --- /dev/null +++ b/frontend/static/img/icons/facebook_32.png diff --git a/frontend/static/img/icons/flickr_16.png b/frontend/static/img/icons/flickr_16.png Binary files differnew file mode 100755 index 0000000..4a6b134 --- /dev/null +++ b/frontend/static/img/icons/flickr_16.png diff --git a/frontend/static/img/icons/flickr_32.png b/frontend/static/img/icons/flickr_32.png Binary files differnew file mode 100755 index 0000000..5179bc5 --- /dev/null +++ b/frontend/static/img/icons/flickr_32.png diff --git a/frontend/static/img/icons/forrst_16.png b/frontend/static/img/icons/forrst_16.png Binary files differnew file mode 100644 index 0000000..43b2cfe --- /dev/null +++ b/frontend/static/img/icons/forrst_16.png diff --git a/frontend/static/img/icons/forrst_32.png b/frontend/static/img/icons/forrst_32.png Binary files differnew file mode 100644 index 0000000..b710898 --- /dev/null +++ b/frontend/static/img/icons/forrst_32.png diff --git a/frontend/static/img/icons/friendfeed_16.png b/frontend/static/img/icons/friendfeed_16.png Binary files differnew file mode 100755 index 0000000..ea9d96e --- /dev/null +++ b/frontend/static/img/icons/friendfeed_16.png diff --git a/frontend/static/img/icons/friendfeed_32.png b/frontend/static/img/icons/friendfeed_32.png Binary files differnew file mode 100755 index 0000000..ebfc2b5 --- /dev/null +++ b/frontend/static/img/icons/friendfeed_32.png diff --git a/frontend/static/img/icons/gamespot_16.png b/frontend/static/img/icons/gamespot_16.png Binary files differnew file mode 100755 index 0000000..0f5a6bb --- /dev/null +++ b/frontend/static/img/icons/gamespot_16.png diff --git a/frontend/static/img/icons/gamespot_32.png b/frontend/static/img/icons/gamespot_32.png Binary files differnew file mode 100755 index 0000000..47e0cf8 --- /dev/null +++ b/frontend/static/img/icons/gamespot_32.png diff --git a/frontend/static/img/icons/google_16.png b/frontend/static/img/icons/google_16.png Binary files differnew file mode 100755 index 0000000..aeaca23 --- /dev/null +++ b/frontend/static/img/icons/google_16.png diff --git a/frontend/static/img/icons/google_32.png b/frontend/static/img/icons/google_32.png Binary files differnew file mode 100755 index 0000000..b67a62a --- /dev/null +++ b/frontend/static/img/icons/google_32.png diff --git a/frontend/static/img/icons/google_voice_16.png b/frontend/static/img/icons/google_voice_16.png Binary files differnew file mode 100755 index 0000000..d8fe79d --- /dev/null +++ b/frontend/static/img/icons/google_voice_16.png diff --git a/frontend/static/img/icons/google_voice_32.png b/frontend/static/img/icons/google_voice_32.png Binary files differnew file mode 100755 index 0000000..fcfabfa --- /dev/null +++ b/frontend/static/img/icons/google_voice_32.png diff --git a/frontend/static/img/icons/google_wave_16.png b/frontend/static/img/icons/google_wave_16.png Binary files differnew file mode 100755 index 0000000..4df0493 --- /dev/null +++ b/frontend/static/img/icons/google_wave_16.png diff --git a/frontend/static/img/icons/google_wave_32.png b/frontend/static/img/icons/google_wave_32.png Binary files differnew file mode 100755 index 0000000..9ae6ae9 --- /dev/null +++ b/frontend/static/img/icons/google_wave_32.png diff --git a/frontend/static/img/icons/googletalk_16.png b/frontend/static/img/icons/googletalk_16.png Binary files differnew file mode 100755 index 0000000..a003ddf --- /dev/null +++ b/frontend/static/img/icons/googletalk_16.png diff --git a/frontend/static/img/icons/googletalk_32.png b/frontend/static/img/icons/googletalk_32.png Binary files differnew file mode 100755 index 0000000..c5ecc6e --- /dev/null +++ b/frontend/static/img/icons/googletalk_32.png diff --git a/frontend/static/img/icons/gowalla_16.png b/frontend/static/img/icons/gowalla_16.png Binary files differnew file mode 100755 index 0000000..2c60ae6 --- /dev/null +++ b/frontend/static/img/icons/gowalla_16.png diff --git a/frontend/static/img/icons/gowalla_32.png b/frontend/static/img/icons/gowalla_32.png Binary files differnew file mode 100755 index 0000000..7ec8812 --- /dev/null +++ b/frontend/static/img/icons/gowalla_32.png diff --git a/frontend/static/img/icons/grooveshark_16.png b/frontend/static/img/icons/grooveshark_16.png Binary files differnew file mode 100755 index 0000000..8c90871 --- /dev/null +++ b/frontend/static/img/icons/grooveshark_16.png diff --git a/frontend/static/img/icons/grooveshark_32.png b/frontend/static/img/icons/grooveshark_32.png Binary files differnew file mode 100755 index 0000000..13794c4 --- /dev/null +++ b/frontend/static/img/icons/grooveshark_32.png diff --git a/frontend/static/img/icons/ilike_16.png b/frontend/static/img/icons/ilike_16.png Binary files differnew file mode 100755 index 0000000..2b41d80 --- /dev/null +++ b/frontend/static/img/icons/ilike_16.png diff --git a/frontend/static/img/icons/ilike_32.png b/frontend/static/img/icons/ilike_32.png Binary files differnew file mode 100755 index 0000000..bdac950 --- /dev/null +++ b/frontend/static/img/icons/ilike_32.png diff --git a/frontend/static/img/icons/komodomedia_azure_16.png b/frontend/static/img/icons/komodomedia_azure_16.png Binary files differnew file mode 100755 index 0000000..02b1d82 --- /dev/null +++ b/frontend/static/img/icons/komodomedia_azure_16.png diff --git a/frontend/static/img/icons/komodomedia_azure_32.png b/frontend/static/img/icons/komodomedia_azure_32.png Binary files differnew file mode 100755 index 0000000..7e12e10 --- /dev/null +++ b/frontend/static/img/icons/komodomedia_azure_32.png diff --git a/frontend/static/img/icons/komodomedia_wood_16.png b/frontend/static/img/icons/komodomedia_wood_16.png Binary files differnew file mode 100755 index 0000000..b58c51c --- /dev/null +++ b/frontend/static/img/icons/komodomedia_wood_16.png diff --git a/frontend/static/img/icons/komodomedia_wood_32.png b/frontend/static/img/icons/komodomedia_wood_32.png Binary files differnew file mode 100755 index 0000000..061c4af --- /dev/null +++ b/frontend/static/img/icons/komodomedia_wood_32.png diff --git a/frontend/static/img/icons/lastfm_16.png b/frontend/static/img/icons/lastfm_16.png Binary files differnew file mode 100755 index 0000000..10f7bd7 --- /dev/null +++ b/frontend/static/img/icons/lastfm_16.png diff --git a/frontend/static/img/icons/lastfm_32.png b/frontend/static/img/icons/lastfm_32.png Binary files differnew file mode 100755 index 0000000..d8c3c5e --- /dev/null +++ b/frontend/static/img/icons/lastfm_32.png diff --git a/frontend/static/img/icons/license.txt b/frontend/static/img/icons/license.txt new file mode 100755 index 0000000..e7eda19 --- /dev/null +++ b/frontend/static/img/icons/license.txt @@ -0,0 +1,9 @@ +If you use these icons, please place an attribution link to komodomedia.com. Social Network Icon Pack by Rogie King is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License (http://creativecommons.org/licenses/by-nc-sa/3.0/).
+
+Based on a work at www.komodomedia.com. + +More rad downloads can be found at http://www.komodomedia.com/download/ + +Feelin' the love? Donate to Paypal: rogie@komodomedia.com
+
+I claim no right of ownership to the respective company logos and glyphs in each one of these icons.
\ No newline at end of file diff --git a/frontend/static/img/icons/linkedin_16.png b/frontend/static/img/icons/linkedin_16.png Binary files differnew file mode 100755 index 0000000..20353ba --- /dev/null +++ b/frontend/static/img/icons/linkedin_16.png diff --git a/frontend/static/img/icons/linkedin_32.png b/frontend/static/img/icons/linkedin_32.png Binary files differnew file mode 100755 index 0000000..f8f73ab --- /dev/null +++ b/frontend/static/img/icons/linkedin_32.png diff --git a/frontend/static/img/icons/mixx_16.png b/frontend/static/img/icons/mixx_16.png Binary files differnew file mode 100755 index 0000000..d2d539c --- /dev/null +++ b/frontend/static/img/icons/mixx_16.png diff --git a/frontend/static/img/icons/mixx_32.png b/frontend/static/img/icons/mixx_32.png Binary files differnew file mode 100755 index 0000000..e4966b4 --- /dev/null +++ b/frontend/static/img/icons/mixx_32.png diff --git a/frontend/static/img/icons/mobileme_16.png b/frontend/static/img/icons/mobileme_16.png Binary files differnew file mode 100755 index 0000000..850e1bc --- /dev/null +++ b/frontend/static/img/icons/mobileme_16.png diff --git a/frontend/static/img/icons/mobileme_32.png b/frontend/static/img/icons/mobileme_32.png Binary files differnew file mode 100755 index 0000000..b8742bb --- /dev/null +++ b/frontend/static/img/icons/mobileme_32.png diff --git a/frontend/static/img/icons/mynameise_16.png b/frontend/static/img/icons/mynameise_16.png Binary files differnew file mode 100755 index 0000000..cb11b81 --- /dev/null +++ b/frontend/static/img/icons/mynameise_16.png diff --git a/frontend/static/img/icons/mynameise_32.png b/frontend/static/img/icons/mynameise_32.png Binary files differnew file mode 100755 index 0000000..c42d5b3 --- /dev/null +++ b/frontend/static/img/icons/mynameise_32.png diff --git a/frontend/static/img/icons/myspace_16.png b/frontend/static/img/icons/myspace_16.png Binary files differnew file mode 100755 index 0000000..5e1b417 --- /dev/null +++ b/frontend/static/img/icons/myspace_16.png diff --git a/frontend/static/img/icons/myspace_32.png b/frontend/static/img/icons/myspace_32.png Binary files differnew file mode 100755 index 0000000..269c976 --- /dev/null +++ b/frontend/static/img/icons/myspace_32.png diff --git a/frontend/static/img/icons/netvibes_16.png b/frontend/static/img/icons/netvibes_16.png Binary files differnew file mode 100755 index 0000000..fb2cec1 --- /dev/null +++ b/frontend/static/img/icons/netvibes_16.png diff --git a/frontend/static/img/icons/netvibes_32.png b/frontend/static/img/icons/netvibes_32.png Binary files differnew file mode 100755 index 0000000..308b1f7 --- /dev/null +++ b/frontend/static/img/icons/netvibes_32.png diff --git a/frontend/static/img/icons/newsvine_16.png b/frontend/static/img/icons/newsvine_16.png Binary files differnew file mode 100755 index 0000000..8f6c1a5 --- /dev/null +++ b/frontend/static/img/icons/newsvine_16.png diff --git a/frontend/static/img/icons/newsvine_32.png b/frontend/static/img/icons/newsvine_32.png Binary files differnew file mode 100755 index 0000000..b079d1f --- /dev/null +++ b/frontend/static/img/icons/newsvine_32.png diff --git a/frontend/static/img/icons/openid_16.png b/frontend/static/img/icons/openid_16.png Binary files differnew file mode 100755 index 0000000..eadf8e8 --- /dev/null +++ b/frontend/static/img/icons/openid_16.png diff --git a/frontend/static/img/icons/openid_32.png b/frontend/static/img/icons/openid_32.png Binary files differnew file mode 100755 index 0000000..073c0e6 --- /dev/null +++ b/frontend/static/img/icons/openid_32.png diff --git a/frontend/static/img/icons/orkut_16.png b/frontend/static/img/icons/orkut_16.png Binary files differnew file mode 100755 index 0000000..9d7378b --- /dev/null +++ b/frontend/static/img/icons/orkut_16.png diff --git a/frontend/static/img/icons/orkut_32.png b/frontend/static/img/icons/orkut_32.png Binary files differnew file mode 100755 index 0000000..65abe2f --- /dev/null +++ b/frontend/static/img/icons/orkut_32.png diff --git a/frontend/static/img/icons/pandora_16.png b/frontend/static/img/icons/pandora_16.png Binary files differnew file mode 100755 index 0000000..90a40a2 --- /dev/null +++ b/frontend/static/img/icons/pandora_16.png diff --git a/frontend/static/img/icons/pandora_32.png b/frontend/static/img/icons/pandora_32.png Binary files differnew file mode 100755 index 0000000..b805c1c --- /dev/null +++ b/frontend/static/img/icons/pandora_32.png diff --git a/frontend/static/img/icons/paypal_16.png b/frontend/static/img/icons/paypal_16.png Binary files differnew file mode 100755 index 0000000..3d55ff4 --- /dev/null +++ b/frontend/static/img/icons/paypal_16.png diff --git a/frontend/static/img/icons/paypal_32.png b/frontend/static/img/icons/paypal_32.png Binary files differnew file mode 100755 index 0000000..3ee5436 --- /dev/null +++ b/frontend/static/img/icons/paypal_32.png diff --git a/frontend/static/img/icons/picasa_16.png b/frontend/static/img/icons/picasa_16.png Binary files differnew file mode 100755 index 0000000..cbd580e --- /dev/null +++ b/frontend/static/img/icons/picasa_16.png diff --git a/frontend/static/img/icons/picasa_32.png b/frontend/static/img/icons/picasa_32.png Binary files differnew file mode 100755 index 0000000..074cc50 --- /dev/null +++ b/frontend/static/img/icons/picasa_32.png diff --git a/frontend/static/img/icons/playstation_16.png b/frontend/static/img/icons/playstation_16.png Binary files differnew file mode 100644 index 0000000..20bcae7 --- /dev/null +++ b/frontend/static/img/icons/playstation_16.png diff --git a/frontend/static/img/icons/playstation_32.png b/frontend/static/img/icons/playstation_32.png Binary files differnew file mode 100644 index 0000000..ee7f000 --- /dev/null +++ b/frontend/static/img/icons/playstation_32.png diff --git a/frontend/static/img/icons/plurk_16.png b/frontend/static/img/icons/plurk_16.png Binary files differnew file mode 100755 index 0000000..313268c --- /dev/null +++ b/frontend/static/img/icons/plurk_16.png diff --git a/frontend/static/img/icons/plurk_32.png b/frontend/static/img/icons/plurk_32.png Binary files differnew file mode 100755 index 0000000..3f212ef --- /dev/null +++ b/frontend/static/img/icons/plurk_32.png diff --git a/frontend/static/img/icons/posterous_16.png b/frontend/static/img/icons/posterous_16.png Binary files differnew file mode 100755 index 0000000..34fdcd2 --- /dev/null +++ b/frontend/static/img/icons/posterous_16.png diff --git a/frontend/static/img/icons/posterous_32.png b/frontend/static/img/icons/posterous_32.png Binary files differnew file mode 100755 index 0000000..6d45a50 --- /dev/null +++ b/frontend/static/img/icons/posterous_32.png diff --git a/frontend/static/img/icons/qik_16.png b/frontend/static/img/icons/qik_16.png Binary files differnew file mode 100755 index 0000000..660446e --- /dev/null +++ b/frontend/static/img/icons/qik_16.png diff --git a/frontend/static/img/icons/qik_32.png b/frontend/static/img/icons/qik_32.png Binary files differnew file mode 100755 index 0000000..466b2cc --- /dev/null +++ b/frontend/static/img/icons/qik_32.png diff --git a/frontend/static/img/icons/readernaut_16.png b/frontend/static/img/icons/readernaut_16.png Binary files differnew file mode 100755 index 0000000..abf173e --- /dev/null +++ b/frontend/static/img/icons/readernaut_16.png diff --git a/frontend/static/img/icons/readernaut_32.png b/frontend/static/img/icons/readernaut_32.png Binary files differnew file mode 100755 index 0000000..bbd5385 --- /dev/null +++ b/frontend/static/img/icons/readernaut_32.png diff --git a/frontend/static/img/icons/reddit_16.png b/frontend/static/img/icons/reddit_16.png Binary files differnew file mode 100755 index 0000000..9ca9038 --- /dev/null +++ b/frontend/static/img/icons/reddit_16.png diff --git a/frontend/static/img/icons/reddit_32.png b/frontend/static/img/icons/reddit_32.png Binary files differnew file mode 100755 index 0000000..6e3eee1 --- /dev/null +++ b/frontend/static/img/icons/reddit_32.png diff --git a/frontend/static/img/icons/roboto_16.png b/frontend/static/img/icons/roboto_16.png Binary files differnew file mode 100755 index 0000000..675d507 --- /dev/null +++ b/frontend/static/img/icons/roboto_16.png diff --git a/frontend/static/img/icons/roboto_32.png b/frontend/static/img/icons/roboto_32.png Binary files differnew file mode 100755 index 0000000..6bb2fa7 --- /dev/null +++ b/frontend/static/img/icons/roboto_32.png diff --git a/frontend/static/img/icons/rss_16.png b/frontend/static/img/icons/rss_16.png Binary files differnew file mode 100755 index 0000000..f921046 --- /dev/null +++ b/frontend/static/img/icons/rss_16.png diff --git a/frontend/static/img/icons/rss_32.png b/frontend/static/img/icons/rss_32.png Binary files differnew file mode 100755 index 0000000..0150a85 --- /dev/null +++ b/frontend/static/img/icons/rss_32.png diff --git a/frontend/static/img/icons/sharethis_16.png b/frontend/static/img/icons/sharethis_16.png Binary files differnew file mode 100644 index 0000000..52be01b --- /dev/null +++ b/frontend/static/img/icons/sharethis_16.png diff --git a/frontend/static/img/icons/sharethis_32.png b/frontend/static/img/icons/sharethis_32.png Binary files differnew file mode 100644 index 0000000..0191748 --- /dev/null +++ b/frontend/static/img/icons/sharethis_32.png diff --git a/frontend/static/img/icons/skype_16.png b/frontend/static/img/icons/skype_16.png Binary files differnew file mode 100755 index 0000000..97ed84c --- /dev/null +++ b/frontend/static/img/icons/skype_16.png diff --git a/frontend/static/img/icons/skype_32.png b/frontend/static/img/icons/skype_32.png Binary files differnew file mode 100755 index 0000000..80ebd07 --- /dev/null +++ b/frontend/static/img/icons/skype_32.png diff --git a/frontend/static/img/icons/stumbleupon_16.png b/frontend/static/img/icons/stumbleupon_16.png Binary files differnew file mode 100755 index 0000000..484ba49 --- /dev/null +++ b/frontend/static/img/icons/stumbleupon_16.png diff --git a/frontend/static/img/icons/stumbleupon_32.png b/frontend/static/img/icons/stumbleupon_32.png Binary files differnew file mode 100755 index 0000000..4ab582a --- /dev/null +++ b/frontend/static/img/icons/stumbleupon_32.png diff --git a/frontend/static/img/icons/technorati_16.png b/frontend/static/img/icons/technorati_16.png Binary files differnew file mode 100755 index 0000000..2167362 --- /dev/null +++ b/frontend/static/img/icons/technorati_16.png diff --git a/frontend/static/img/icons/technorati_32.png b/frontend/static/img/icons/technorati_32.png Binary files differnew file mode 100755 index 0000000..2ff2359 --- /dev/null +++ b/frontend/static/img/icons/technorati_32.png diff --git a/frontend/static/img/icons/tumblr_16.png b/frontend/static/img/icons/tumblr_16.png Binary files differnew file mode 100755 index 0000000..1536a14 --- /dev/null +++ b/frontend/static/img/icons/tumblr_16.png diff --git a/frontend/static/img/icons/tumblr_32.png b/frontend/static/img/icons/tumblr_32.png Binary files differnew file mode 100755 index 0000000..0ebca39 --- /dev/null +++ b/frontend/static/img/icons/tumblr_32.png diff --git a/frontend/static/img/icons/twitter_16.png b/frontend/static/img/icons/twitter_16.png Binary files differnew file mode 100755 index 0000000..2bcd957 --- /dev/null +++ b/frontend/static/img/icons/twitter_16.png diff --git a/frontend/static/img/icons/twitter_32.png b/frontend/static/img/icons/twitter_32.png Binary files differnew file mode 100755 index 0000000..38d0545 --- /dev/null +++ b/frontend/static/img/icons/twitter_32.png diff --git a/frontend/static/img/icons/viddler_16.png b/frontend/static/img/icons/viddler_16.png Binary files differnew file mode 100755 index 0000000..4ac4356 --- /dev/null +++ b/frontend/static/img/icons/viddler_16.png diff --git a/frontend/static/img/icons/viddler_32.png b/frontend/static/img/icons/viddler_32.png Binary files differnew file mode 100755 index 0000000..f232136 --- /dev/null +++ b/frontend/static/img/icons/viddler_32.png diff --git a/frontend/static/img/icons/vimeo_16.png b/frontend/static/img/icons/vimeo_16.png Binary files differnew file mode 100755 index 0000000..dc6fc51 --- /dev/null +++ b/frontend/static/img/icons/vimeo_16.png diff --git a/frontend/static/img/icons/vimeo_32.png b/frontend/static/img/icons/vimeo_32.png Binary files differnew file mode 100755 index 0000000..28948a6 --- /dev/null +++ b/frontend/static/img/icons/vimeo_32.png diff --git a/frontend/static/img/icons/virb_16.png b/frontend/static/img/icons/virb_16.png Binary files differnew file mode 100755 index 0000000..e09ef84 --- /dev/null +++ b/frontend/static/img/icons/virb_16.png diff --git a/frontend/static/img/icons/virb_32.png b/frontend/static/img/icons/virb_32.png Binary files differnew file mode 100755 index 0000000..6be8b14 --- /dev/null +++ b/frontend/static/img/icons/virb_32.png diff --git a/frontend/static/img/icons/windows_16.png b/frontend/static/img/icons/windows_16.png Binary files differnew file mode 100755 index 0000000..c022c39 --- /dev/null +++ b/frontend/static/img/icons/windows_16.png diff --git a/frontend/static/img/icons/windows_32.png b/frontend/static/img/icons/windows_32.png Binary files differnew file mode 100755 index 0000000..13b3040 --- /dev/null +++ b/frontend/static/img/icons/windows_32.png diff --git a/frontend/static/img/icons/wordpress_16.png b/frontend/static/img/icons/wordpress_16.png Binary files differnew file mode 100755 index 0000000..47568ca --- /dev/null +++ b/frontend/static/img/icons/wordpress_16.png diff --git a/frontend/static/img/icons/wordpress_32.png b/frontend/static/img/icons/wordpress_32.png Binary files differnew file mode 100755 index 0000000..7aa7ec1 --- /dev/null +++ b/frontend/static/img/icons/wordpress_32.png diff --git a/frontend/static/img/icons/xing_16.png b/frontend/static/img/icons/xing_16.png Binary files differnew file mode 100755 index 0000000..a75365b --- /dev/null +++ b/frontend/static/img/icons/xing_16.png diff --git a/frontend/static/img/icons/xing_32.png b/frontend/static/img/icons/xing_32.png Binary files differnew file mode 100755 index 0000000..38d62ee --- /dev/null +++ b/frontend/static/img/icons/xing_32.png diff --git a/frontend/static/img/icons/yahoo_16.png b/frontend/static/img/icons/yahoo_16.png Binary files differnew file mode 100755 index 0000000..5f80da3 --- /dev/null +++ b/frontend/static/img/icons/yahoo_16.png diff --git a/frontend/static/img/icons/yahoo_32.png b/frontend/static/img/icons/yahoo_32.png Binary files differnew file mode 100755 index 0000000..87e16d7 --- /dev/null +++ b/frontend/static/img/icons/yahoo_32.png diff --git a/frontend/static/img/icons/yahoobuzz_16.png b/frontend/static/img/icons/yahoobuzz_16.png Binary files differnew file mode 100755 index 0000000..4f5d3c9 --- /dev/null +++ b/frontend/static/img/icons/yahoobuzz_16.png diff --git a/frontend/static/img/icons/yahoobuzz_32.png b/frontend/static/img/icons/yahoobuzz_32.png Binary files differnew file mode 100755 index 0000000..9150db0 --- /dev/null +++ b/frontend/static/img/icons/yahoobuzz_32.png diff --git a/frontend/static/img/icons/yelp_16.png b/frontend/static/img/icons/yelp_16.png Binary files differnew file mode 100755 index 0000000..b6929ea --- /dev/null +++ b/frontend/static/img/icons/yelp_16.png diff --git a/frontend/static/img/icons/yelp_32.png b/frontend/static/img/icons/yelp_32.png Binary files differnew file mode 100755 index 0000000..211cc1a --- /dev/null +++ b/frontend/static/img/icons/yelp_32.png diff --git a/frontend/static/img/icons/youtube_16.png b/frontend/static/img/icons/youtube_16.png Binary files differnew file mode 100755 index 0000000..2281d7f --- /dev/null +++ b/frontend/static/img/icons/youtube_16.png diff --git a/frontend/static/img/icons/youtube_32.png b/frontend/static/img/icons/youtube_32.png Binary files differnew file mode 100755 index 0000000..71e60ef --- /dev/null +++ b/frontend/static/img/icons/youtube_32.png diff --git a/frontend/static/img/icons/zootool_16.png b/frontend/static/img/icons/zootool_16.png Binary files differnew file mode 100644 index 0000000..65d8bee --- /dev/null +++ b/frontend/static/img/icons/zootool_16.png diff --git a/frontend/static/img/icons/zootool_32.png b/frontend/static/img/icons/zootool_32.png Binary files differnew file mode 100644 index 0000000..0a2a0bd --- /dev/null +++ b/frontend/static/img/icons/zootool_32.png diff --git a/frontend/static/img/icosahedron.png b/frontend/static/img/icosahedron.png Binary files differnew file mode 100644 index 0000000..0d27cc8 --- /dev/null +++ b/frontend/static/img/icosahedron.png diff --git a/frontend/static/img/idgiguy2.png b/frontend/static/img/idgiguy2.png Binary files differnew file mode 100644 index 0000000..a5ba0ae --- /dev/null +++ b/frontend/static/img/idgiguy2.png diff --git a/frontend/static/img/loading.gif b/frontend/static/img/loading.gif Binary files differnew file mode 100644 index 0000000..a309d3c --- /dev/null +++ b/frontend/static/img/loading.gif diff --git a/frontend/static/img/loading2.gif b/frontend/static/img/loading2.gif Binary files differnew file mode 100644 index 0000000..d9e135c --- /dev/null +++ b/frontend/static/img/loading2.gif diff --git a/frontend/static/img/magnify.png b/frontend/static/img/magnify.png Binary files differnew file mode 100644 index 0000000..9857c6d --- /dev/null +++ b/frontend/static/img/magnify.png diff --git a/frontend/static/img/office-plant.jpg b/frontend/static/img/office-plant.jpg Binary files differnew file mode 100644 index 0000000..ebabec9 --- /dev/null +++ b/frontend/static/img/office-plant.jpg diff --git a/frontend/static/img/plant.gif b/frontend/static/img/plant.gif Binary files differnew file mode 100644 index 0000000..aade765 --- /dev/null +++ b/frontend/static/img/plant.gif diff --git a/frontend/static/img/playlist-banner.gif b/frontend/static/img/playlist-banner.gif Binary files differnew file mode 100644 index 0000000..7486d7a --- /dev/null +++ b/frontend/static/img/playlist-banner.gif diff --git a/frontend/static/img/playlist.gif b/frontend/static/img/playlist.gif Binary files differnew file mode 100644 index 0000000..19973b5 --- /dev/null +++ b/frontend/static/img/playlist.gif diff --git a/frontend/static/img/playlist_chat.gif b/frontend/static/img/playlist_chat.gif Binary files differnew file mode 100644 index 0000000..b4b0cf9 --- /dev/null +++ b/frontend/static/img/playlist_chat.gif diff --git a/frontend/static/img/pyramid.png b/frontend/static/img/pyramid.png Binary files differnew file mode 100644 index 0000000..f60b5b7 --- /dev/null +++ b/frontend/static/img/pyramid.png diff --git a/frontend/static/img/ramshead.png b/frontend/static/img/ramshead.png Binary files differnew file mode 100644 index 0000000..2139510 --- /dev/null +++ b/frontend/static/img/ramshead.png diff --git a/frontend/static/img/runner.gif b/frontend/static/img/runner.gif Binary files differnew file mode 100644 index 0000000..7077019 --- /dev/null +++ b/frontend/static/img/runner.gif diff --git a/frontend/static/img/scanjam-flipping.gif b/frontend/static/img/scanjam-flipping.gif Binary files differnew file mode 100644 index 0000000..068fbd4 --- /dev/null +++ b/frontend/static/img/scanjam-flipping.gif diff --git a/frontend/static/img/scanjam-title.gif b/frontend/static/img/scanjam-title.gif Binary files differnew file mode 100644 index 0000000..ecb0d4a --- /dev/null +++ b/frontend/static/img/scanjam-title.gif diff --git a/frontend/static/img/scanjambg2.jpg b/frontend/static/img/scanjambg2.jpg Binary files differnew file mode 100644 index 0000000..2505de2 --- /dev/null +++ b/frontend/static/img/scanjambg2.jpg diff --git a/frontend/static/img/scannerjammer-logo.png b/frontend/static/img/scannerjammer-logo.png Binary files differnew file mode 100644 index 0000000..ba2545e --- /dev/null +++ b/frontend/static/img/scannerjammer-logo.png diff --git a/frontend/static/img/water-cooler.jpg b/frontend/static/img/water-cooler.jpg Binary files differnew file mode 100644 index 0000000..ad14994 --- /dev/null +++ b/frontend/static/img/water-cooler.jpg diff --git a/frontend/static/img/watercoolericon.jpg b/frontend/static/img/watercoolericon.jpg Binary files differnew file mode 100644 index 0000000..b2870eb --- /dev/null +++ b/frontend/static/img/watercoolericon.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313810814_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313810814_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313810814_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313810826_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313810826_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313810826_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313810981_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313810981_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313810981_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811002_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811002_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811002_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811024_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811024_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811024_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811041_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811041_ryz.jpg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811041_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811730_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811730_ryz.jpg Binary files differnew file mode 100644 index 0000000..3ad4758 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811730_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811772_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811772_ryz.jpg Binary files differnew file mode 100644 index 0000000..c8ee28c --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811772_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313811923_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313811923_ryz.jpg Binary files differnew file mode 100644 index 0000000..c4f4068 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313811923_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812087_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812087_ryz.jpg Binary files differnew file mode 100644 index 0000000..59cdf49 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812087_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812093_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812093_ryz.jpg Binary files differnew file mode 100644 index 0000000..0540f06 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812093_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812097_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812097_ryz.jpg Binary files differnew file mode 100644 index 0000000..dde29ec --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812097_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812098_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812098_ryz.jpg Binary files differnew file mode 100644 index 0000000..eb63234 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812098_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812099_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812099_ryz.jpg Binary files differnew file mode 100644 index 0000000..07ac725 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812099_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812490_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812490_ryz.jpg Binary files differnew file mode 100644 index 0000000..0643cf9 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812490_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313812564_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313812564_ryz.jpg Binary files differnew file mode 100644 index 0000000..d09772b --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313812564_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313815048_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313815048_ryz.jpg Binary files differnew file mode 100644 index 0000000..a5a4b15 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313815048_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313815411_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313815411_ryz.jpg Binary files differnew file mode 100644 index 0000000..a5a4b15 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313815411_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313815429_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313815429_ryz.jpg Binary files differnew file mode 100644 index 0000000..1186715 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313815429_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/19/1313815522_ryz.jpg b/frontend/static/img/webcam/2011/08/19/1313815522_ryz.jpg Binary files differnew file mode 100644 index 0000000..7902176 --- /dev/null +++ b/frontend/static/img/webcam/2011/08/19/1313815522_ryz.jpg diff --git a/frontend/static/img/webcam/2011/08/21/1313909058_ryz.jpg b/frontend/static/img/webcam/2011/08/21/1313909058_ryz.jpg Binary files differnew file mode 100644 index 0000000..b003f5f --- /dev/null +++ b/frontend/static/img/webcam/2011/08/21/1313909058_ryz.jpg diff --git a/frontend/static/img/webcam/2011/09/26/1317090391_ryz.jpg b/frontend/static/img/webcam/2011/09/26/1317090391_ryz.jpg Binary files differnew file mode 100644 index 0000000..b15bb53 --- /dev/null +++ b/frontend/static/img/webcam/2011/09/26/1317090391_ryz.jpg diff --git a/frontend/static/js/admin.js b/frontend/static/js/admin.js new file mode 100644 index 0000000..92a0421 --- /dev/null +++ b/frontend/static/js/admin.js @@ -0,0 +1,119 @@ +var Admin = + { + videos: {}, + viewRoom: function () + { + var videoKey = '' + var hash = document.location.hash + if (hash.indexOf("#") !== -1) + hash = hash.substr(1) + var partz = hash.split("&") + for (i in partz) + { + var pair = partz[i].split("=") + if (pair[0] === "v") + videoKey = pair[1] + } + d.warn("VIEWING ROOM "+Room.name) + $.post(API.URL.room.view, {'room':Room.name,'session':Auth.session,}).success(Admin.viewCallback).error(Admin.viewError) + }, + viewError: function (raw) + { + d.warn(raw) + }, + viewCallback: function (raw) + { + var lines = API.parse("/room/view", raw) + if (! lines) + return d.error("UNABLE TO LOAD ROOM") + var ll = lines.shift().split("\t") + if (ll[0] === '0') + return d.error(ll[1]) + + Lastlog.update(lines.shift()) + Admin.storeVideos(lines) + }, + storeVideos: function (lines) + { + var rows = [] + var lastDate = "" + for (i in lines.reverse()) + { + var row = lines[i].split("\t") + if (row[0].indexOf("ROOM") === 0) + { + Room.updateSetting(row[1],row[2]) + continue + } + if (row[0].indexOf("VIDEO") === 0) + { + var type = "??" + if (row[5].indexOf("youtube") !== -1) + type = "yt" + else if (row[5].indexOf("vimeo") !== -1) + type = "vm" + else if (row[5].indexOf("soundcloud") !== -1) + type = "sc" + else if (row[5].indexOf("mp3") !== -1) + type = "au" + // 0 VIDEO 1 id 2 date 3 userid 4 username 5 url 6 title + var d = new Date(parseInt(row[2])*1000) + var thisDate = makeClockDate(d) + if (thisDate === lastDate) + thisDate = "" + else + lastDate = thisDate + var li = "<li id='video_"+row[1]+"'>" + li += "<span class='date'>"+thisDate+"</span>" + li += "<span class='time'>"+makeClockTime(d)+"</span>" + li += "<a class='user' href='/profile/"+row[4]+"' target='_blank'>"+row[4]+"</a>" + li += "<span class='type'>"+type+"</span>" + li += "<a class='title' href='"+row[5]+"' target='_blank'>"+row[6]+"</a>" + li += "<span class='remove' id='remove_"+row[1]+"'>remove</span>" + li += "</li>" + rows.push(li) + Admin.videos[row[1]] = { id: row[1], title: row[6], username: row[4] } + } + } + $("#videos").css({"display": "inline-block", "vertical-align": "top"}) + $("#videos").html(rows.join("")) + }, + removeVideoClick: function () + { + var id = $(this).attr("id") + var idx = id.substr(id.indexOf("_")+1) + var video = Admin.videos[idx] + d.act("+ remove video "+idx) + if (confirm(video.title+"\nposted by "+video.username+"\n\nThis video will be removed from the queue.")) + $.post(API.URL.video.remove, {session:Auth.session, video:idx, room:Room.name}).success(Admin.removeVideoSuccess) + }, + removeVideoSuccess: function (raw) + { + var lines = API.parse("/video/remove", raw) + if (! lines) + return d.error("UNABLE TO REMOVE VIDEO") + var l = lines.shift().split("\t") + if (l[0] === '0') + { + d.error(l[1]) + return + } + d.warn(l[1]) + $("#video_"+l[0]).fadeOut(500) + } + } +var months = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ") +function makeClockDate(d) + { + var date = d.getDate() + var month = months[d.getMonth()] + return date+"-"+month + } +function makeClockTime(d) + { + var h = d.getHours() + var m = d.getMinutes() + if (m < 10) + m = "0" + m + return h+":"+m + } diff --git a/frontend/static/js/api.js b/frontend/static/js/api.js new file mode 100644 index 0000000..e881f8c --- /dev/null +++ b/frontend/static/js/api.js @@ -0,0 +1,132 @@ +var API = + { + HEADER: "#@scanjam 0.2", + BASE_URL: "http://"+serverHost+":"+serverPort, + URL: + { + auth: + { + login: "/api/auth/login", + logout: "/api/auth/logout", + checkin: "/api/auth/checkin", + sneakin: "/api/auth/sneakin", + }, + room: + { + join: "/api/room/join", + list: "/api/room/list", + view: "/api/room/view", + poll: "/api/room/poll", + watch: "/api/room/watch", + say: "/api/room/say", + settings: "/api/room/settings", + stats: "/stats", + }, + video: + { + date: "/api/video/date", + like: "/api/video/like", + unlike: "/api/video/unlike", + remove: "/api/video/remove", + search: "/api/video/search", + }, + user: + { + settings: "/api/user/settings", + videos: "/api/user/videos", + likes: "/api/user/likes", + }, + }, + error: function (s) + { + d.error("API: "+s) + return false + }, + parse: function (api, raw) + { + if (! raw) + return API.error("no result") + var lines = raw.split("\n") + if (lines.shift() !== API.HEADER) + return API.error("bad header") + if (! lines.length) + return API.error("no content") + return lines + }, + init: function () + { + d.warn("INIT API") + for (type in API.URL) + { + for (name in API.URL[type]) + { + API.URL[type][name] = API.BASE_URL + API.URL[type][name] + } + } + // $.ajaxSetup({ timeout: 1000 }) + } + } +var Local = + { + support: false, + hash: null, + get: null, + set: null, + _html5_get: function (key) + { + var val = localStorage["scanjam."+key] + if (val === "true") return true + if (val === "false") return false + if (val === "undefined") return undefined + return val + }, + _html5_set: function (key, val) + { + if (val === undefined) + localStorage["scanjam."+key] = "" + else + localStorage["scanjam."+key] = val + }, + _hash_get: function (key) + { + if (key in Local.hash) + return Local.hash[key] + }, + _hash_set: function (key, val) + { + Local.hash[key] = val + }, + _supports_html5_storage: function () + { + try + { return 'localStorage' in window && window['localStorage'] !== null; } + catch (e) + { return false } + }, + like: function (videoid) + { Local.set("like."+videoid, true) }, + unlike: function (videoid) + { Local.set("like."+videoid, false) }, + isLiked: function (videoid) + { return Local.get("like."+videoid) }, + init: function () + { + Local.support = Local._supports_html5_storage() + if (Local.support) + { + d.warn("SUPPORTS LOCAL STORAGE") + Local.get = Local._html5_get + Local.set = Local._html5_set + } + else + { + d.error("NO LOCAL STORAGE") + Local.hash = {} + Local.get = Local._hash_get + Local.set = Local._hash_set + } + } + } +API.init() +Local.init() + diff --git a/frontend/static/js/audio.js b/frontend/static/js/audio.js new file mode 100644 index 0000000..de33851 --- /dev/null +++ b/frontend/static/js/audio.js @@ -0,0 +1,142 @@ +var Audio = + { + type: "audio", + loaded: false, + pending: false, + playing: false, + paused: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 100, + play: function (video) + { + d.warn("AUDIO PLAY "+video.key) + if (video.error) + return Audio.error() + if (Audio.playing) + Audio.stop() + $("#screen").html("<div id='audio'></div><div id='audio-img'></div><div id='audio-dl'></div>") + $("#ytscreen").css("z-index", -2) + Audio.video = video + Audio.playing = false + + var partz = video.src.split(" ") + var img = partz[0] + var url = partz[1] + var title = partz.slice(2).join(" ") + + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Audio.player = soundManager.createSound + ({ + id: "player-"+video.id, + url: url, + volume: Audio.volume, + onfinish: Audio.finish, + onerror: Audio.error, + onload: Audio.onload, + }) + if (! Audio.player) + return Audio.error("no player") + Audio.player.play() + + $("#video-title").html(title) + $("#video-link").attr("href", url) + $("#audio-dl").html('<a href="'+url+'" target="_parent">download</a>') + $("#audio-img").html("<img src='"+img+"' id='audio-art' />") + $("#audio-art").bind("error", function(){$("#audio-art").hide()}) + }, + onload: function (success) + { + if (! success) + return Audio.error("failed to load") + }, + toggle: function () + { + d.warn("TOGGLE PLAYBACK") + if (Audio.paused) + return Audio.resume() + else + return Audio.pause() + }, + error: function (s) + { + if (! s) + s = "unspecified error" + Player.error("AUDIO "+s) + Audio.finish() + }, + setVolume: function (vol) + { + Audio.volume = vol + if (Audio.player) + Audio.player.setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Audio.paused = true + Audio.playing = false + if (Audio.player) + Audio.player.pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Audio.paused = false + Audio.playing = true + if (Audio.player) + Audio.player.resume() + return false + }, + stop: function () + { + d.warn("AUDIO STOP") + if (Audio.player) + Audio.player.stop() + Audio.playing = false + }, + finish: function () + { + d.warn("AUDIO FINISH") + Audio.playing = false + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Player.finish() + }, + load: function () + { + d.warn("LOADING AUDIO") + Audio.loaded = true + }, + unload: function () + { + d.warn("AUDIO UNLOADED") + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Audio.loaded = false + Audio.playing = false + }, + init: function () + { + d.warn("AUDIO INIT") + } + } +Player.register(Audio) +soundManager.url = '/swf/' +soundManager.useFlashBlock = false +soundManager.debugMode = false diff --git a/frontend/static/js/auth.js b/frontend/static/js/auth.js new file mode 100644 index 0000000..a0c667d --- /dev/null +++ b/frontend/static/js/auth.js @@ -0,0 +1,166 @@ +var Auth = + { + userid: false, + username: false, + session: false, + loaded: false, + access: 0, + login: function () + { + d.warn("LOG IN") + var username = d.trim( $("#login-username").val() ) + var password = d.trim( $("#login-password").val() ) + var pwhash = $.md5("scanjam"+password) + if (! username || ! password) return + Main.enter = false + d.warn("LOGGING IN") + $.post(API.URL.auth.login, {'username':username, 'password': pwhash}, Auth.loginCallback) + $("#chat").hide() + }, + loginCallback: function (raw) + { + var lines = API.parse("/auth/login", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + u = lines[1].split("\t") + + Auth.userid = u[0] + Auth.username = u[1] + Auth.session = u[2] + Auth.access = u[3] + + document.cookie = "session="+Auth.session+";path=/;domain=.scannerjammer.com;max-age=1086400" + Auth.success() + }, + checkin: function () + { + d.warn("CHECK IN") + $.post(API.URL.auth.checkin, {'session':Auth.session}, Auth.checkinCallback) + }, + checkinCallback: function (raw) + { + var lines = API.parse("/auth/checkin", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + u = lines[1].split("\t") + Auth.userid = u[0] + Auth.username = u[1] + Auth.success() + }, + sneakin: function (userid,username) + { + d.warn("SNEAK IN") + $.post(API.URL.auth.sneakin, {'userid':userid,'username':username}).success(Auth.sneakinCallback) + }, + sneakinCallback: function (raw) + { + var lines = API.parse("/auth/sneakin", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + d.joy("snuck in!") + u = lines[1].split("\t") + + Auth.userid = u[0] + Auth.username = u[1] + Auth.session = u[2] + Auth.access = u[3] + + d.warn(lines[1]) + if (! Auth.session) + return + document.cookie = "session="+Auth.session+";path=/;domain=.scannerjammer.com;max-age=1086400" + Auth.success() + }, + logout: function () + { + d.warn("LOG OUT") + clearTimeout(Room.timer) + Room.unload() + Auth.userid = false + Auth.username = false + Local.set('userid', false) + Local.set('username', false) + document.cookie = "session=false;path=/;domain=.scannerjammer.com;max-age=0" + Auth.session = "" + Auth.load() + }, + error: function () + { + Auth.load() + }, + success: function () + { + d.joy("logged in as "+Auth.username) + Auth.unload() + Room.load() + }, + unload: function () + { + d.warn("AUTH UNLOAD") + $("#login").hide() + $("#loading").show() + Keyboard.enter = false + Auth.loaded = false + }, + load: function () + { + d.warn("AUTH LOAD") + $("#loading").hide() + $("#login").show() + $("#login-username").focus() + $("#login-username").keydown(Keyboard.textareaMap) + $("#login-password").keydown(Keyboard.textareaMap) + $("#login-password").val("") + $("#login-go").click(Auth.login) + Keyboard.enter = Auth.login + $("#bg").show() + Auth.loaded = true + }, + init: function () + { + d.warn("INIT AUTH") + if (document.cookie) + { + d.warn("got a cookie") + d.warn(document.cookie) + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("session") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Auth.session = cookie[1] + break + } + } + } + d.warn("got sessionid "+Auth.session) + if (Auth.session) + return true + } + var userid = Local.get('userid') + var username = Local.get('username') + if (userid && username) + { + d.warn("attempting to sneak in "+username) + Auth.sneakin(userid,username) + return true + } + return false + } + } + diff --git a/frontend/static/js/avatar-data.js b/frontend/static/js/avatar-data.js new file mode 100644 index 0000000..3d18fa7 --- /dev/null +++ b/frontend/static/js/avatar-data.js @@ -0,0 +1 @@ +AVATARS = ["arcane2.gif", "21.gif", "39.gif", "22.gif", "51.gif", "63.gif", "42.gif", "6.gif", "43.gif", "30.gif", "13.gif", "23.gif", "70.gif", "34.gif", "9.gif", "33.gif", "4.gif", "17.gif", "29.gif", "5.gif", "28.gif", "57.gif", "20.gif", "50.gif", "18.gif", "8.gif", "12.gif", "64.gif", "3.gif", "69.gif", "49.gif", "71.gif", "11.gif", "36.gif", "56.gif", "46.gif", "37.gif", "19.gif", "40.gif", "15.gif", "10.gif", "24.gif", "41.gif", "67.gif", "38.gif", "66.gif", "48.gif", "26.gif", "72.gif", "14.gif", "54.gif", "65.gif", "27.gif", "32.gif", "62.gif", "25.gif", "68.gif", "45.gif", "59.gif", "61.gif", "47.gif", "53.gif", "60.gif", "16.gif", "44.gif", "2.gif", "52.gif", "1.gif", "55.gif", "31.gif", "7.gif", "58.gif", "35.gif"] diff --git a/frontend/static/js/avatar.js b/frontend/static/js/avatar.js new file mode 100644 index 0000000..11d39d4 --- /dev/null +++ b/frontend/static/js/avatar.js @@ -0,0 +1,236 @@ +var Avatar = + { + orientation: true, + loaded: false, + } +Room.loadCallback = function () { setTimeout(Viewport.fullscreenOn, 500) } +Chat.store = function (lines) + { + var newVideos = [] + var newChat = [] + var postponeScroll = false + for (i in lines) + { + if (! lines[i]) + continue + row = lines[i].split("\t") + if (row[0] === 'VIDEO') + { + row.shift() + if (row[0] in Chat.oldVideo) + continue + Chat.oldVideo[row[0]] = row + Playlist.enqueueOldVideoFormat([row]) + } + else if (row[0] === 'ROOM') + { + Room.updateSetting(row[1],row[2]) + } + else if (row[0] === 'LIKE') + { + username = row[1] + Like.enqueue(username) + } + else if (row[0] === 'CAM') + { + VideoChat.updateCount(row[1]) + } + else + { + // 0 id 1 date 2 user 3 msg + if (row[0] in Chat.oldChat) + continue + Chat.oldChat[row[0]] = row + var c = Chat.parse(row) + if (c.indexOf("<img") !== -1) + { + postponeScroll = true + d.joy(">> POSTPONING") + } + if (row[2] === Auth.username && $.md5(row[3]) in Chat.messages) + continue + newChat.push(c) + } + } + if (newChat.length) + { + if (Avatar.loaded) + { + $("#chat").append(newChat.join("")) + } + else + { + Avatar.loaded = true + $("#chat").append(newChat[newChat.length-1]) + } + if (postponeScroll) + setTimeout('d.scrollToBottom("#chat")', 2000) + else + d.scrollToBottom("#chat") + } + } +Chat.say = function () + { + d.act("+ sent message") + var msg = d.sanitize( $("#chat-message").val() ) + $("#chat-message").val("") + if (! msg) return + if (msg === "debug=1") { $("#msg").show(); d.scrollToBottom("#msg"); return } + if (msg === "debug=0") { $("#msg").hide(); return } + if (msg === "poll=0") { d.error("+ DISABLED POLLING"); clearTimeout(Chat.timer); return} + if (msg.indexOf("bg=") === 0) { Room.setBg( msg.split("=",2)[1] ); return } + var hash = $.md5(msg) + Chat.messages[hash] = true + var newrow = [0, 0, Auth.username, msg] + // var newdiv = Chat.parse(newrow) + // $("#chat").append(newdiv) + // if (newdiv.indexOf("<img") !== -1) + // setTimeout('d.scrollToBottom("#chat")', 2000) + if (msg.indexOf("scannerjammer.com/avatar") === -1) + msg = "http://scannerjammer.com/avatar/" + d.choice(AVATARS) + " " + msg + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: msg}, Room.sayCallback) + d.scrollToBottom("#chat") + } +Chat.parse = function (row) + { + return Chat.parseWords(row[3]) + }, +Chat.parseWords = function (raw) + { + var words = raw.split(" ") + var s = "" + for (i in words) + { + var avatar = "" + var word = words[i] + if (word.indexOf("http") !== -1) + { + if (word.indexOf("scannerjammer.com/avatar") !== -1) + { + avatar = word + } + else if (word.indexOf("youtube.com/watch?") !== -1) + { + var ytid = "youtube_"+Youtube.getYtid(word) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtube.com/v/") !== -1) + { + var index = word.indexOf("/v/") + var ytid = "youtube_"+word.substr(index+3,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtu.be") !== -1) + { + var ytid = "youtube_"+word.substr(16,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + // http://www.youtube.com/user/ahchachachacha#p/f/28/1GSBekxLR1E + else if (word.indexOf("youtube.com/user") !== -1) + { + var ytid = "youtube_"+word.substr(-11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("vimeo.com") !== -1) + { + var vimeoid = word.replace(VIMEOregexp, "vimeo_$3") + if (vimeoid in Player.videos) + txt = Player.videos[vimeoid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+vimeoid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("soundcloud.com") !== -1) + { + var scid = "soundcloud_" + $.md5(word) + if (scid in Player.videos) + txt = Player.videos[scid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+scid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf(".jpeg") !== -1 || + word.indexOf(".JPG") !== -1 || + word.indexOf(".GIF") !== -1 || + word.indexOf(".PNG") !== -1 || + word.indexOf(".JPEG") !== -1 || + word.indexOf(".jpg") !== -1 || + word.indexOf(".gif") !== -1 || + word.indexOf(".png") !== -1) + { + s += '<a href="'+word+'" target="_blank" class="pic"><img src="'+word+'" /></a>' + } + else if (word.indexOf("scannerjammer.com/profile") !== -1) + { + var username = word.substr( word.indexOf("profile")+8 ).replace("/","") + s += '<a href="'+word+'">ScannerJammer: '+username+'</a>' + } + else + { + var poffset = word.indexOf('//') + var linktext = word.substr(poffset+2, word.indexOf('/', poffset+2)).replace("www.","") + s += '<a href="'+word+'" target="_blank">'+linktext+'</a> ' + } + } + else if (word.indexOf(".com") !== -1 || + word.indexOf(".net") !== -1 || + word.indexOf(".org") !== -1 || + word.indexOf(".us") !== -1 || + word.indexOf(".nu") !== -1 || + word.indexOf(".uk") !== -1 || + word.indexOf(".fr") !== -1 || + word.indexOf(".de") !== -1 || + word.indexOf(".fm") !== -1) + { + var txt = word.replace("www.","") + s += '<a href="http://'+word+'" target="_blank">'+txt+'</a> ' + } + else + s += word + " " + } + if (! avatar.length) + avatar = d.choice(AVATARS) + Avatar.orientation = ! Avatar.orientation + if (Avatar.orientation) + { + var q = '<div class="frame"><table border="0"><tr><td valign="top" class="avatar-left"><img src="'+ avatar +'"/></td>' + q += '<td valign="top" class="tri"><div class="triangle-left"></div></td><td class="message">' + q += '<div class="message-blurb">' + s + '</div></td></tr></table></div>' + return q + } + else + { + var q = [ + '<div class="frame">', + '<table border="0"><tr><td valign="top" class="message"><div class="message-blurb">', + s, + '</div></td><td valign="top" class="tri"><div class="triangle-right"></div></td><td valign="top" class="avatar-right">', + '<img src="', + avatar, + '" /></td></tr></table></div>' + ].join("") + return q + } + + return s + } diff --git a/frontend/static/js/calendar.js b/frontend/static/js/calendar.js new file mode 100644 index 0000000..cf70e29 --- /dev/null +++ b/frontend/static/js/calendar.js @@ -0,0 +1,273 @@ +var Keyboard = + { + altMode: false, + fullscreenKeys: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenOff() + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.toggle() + if (kc === 76) + Player.likeClick() + return false + }, + standardKeys: function (event) + { + kc = event.keyCode + if (kc === 91) + { + Keyboard.altMode = true + return true + } + if (kc === 27) + { + Viewport.fullscreenOn() + return false + } + if (kc === 37 || kc === 177) + { + Player.playPrev() + return false + } + else if (kc === 39 || kc === 176) + { + Player.playNext() + return false + } + if (! Keyboard.altMode && kc === 76) + { + Player.likeClick() + return false + } + if (kc === 32 || kc === 179) + { + Player.toggle() + return false + } + Keyboard.altMode = false + return true + } + } +var Viewport = + { + fullscreenMode: false, + fullscreenOn: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls,#calendar,.furniture").hide() + $("#settings-container").hide() + $(window).unbind("resize") + $(window).bind("resize", Viewport.fullscreenResize) + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.fullscreenKeys) + Viewport.fullscreenResize() + Viewport.fullscreenMode = true + }, + fullscreenResize: function () + { + $("#projector").css({ position: 'fixed', top: 0, left: 0, width: $(window).width(), height: $(window).height() }) + $("#screen,#ytscreen").css({ width: $(window).width(), height: $(window).height() }) + }, + fullscreenOff: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls,#calendar,.furniture").show() + $(window).unbind("resize") + $(window).bind("resize", Viewport.standardResize) + Viewport.standardResize() + Viewport.fullscreenMode = false + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.standardKeys) + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Viewport.fullscreenOn) + }, + standardResize: function () + { + var w = $(window).width() + var h = $(window).height() + + var ytw = (w)*1/3 + var yth = ytw * 9/16 + + var buttonheight = $("#fullscreen").height() + + var topoffset = 100 + var rightoffset = 100 + + $("#player").css("right", rightoffset) + $("#player").css("top", topoffset) + $("#player").css("height", yth+buttonheight+20) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + $("#projector").css("position", "absolute") + + $("#controls").css("top", yth+10+10) + var playerHeight = yth+buttonheight+topoffset+10 + + $("#playlist,#playlistbg").css("right", rightoffset) + $("#playlist,#playlistbg").css("top", playerHeight+30) + $("#playlist,#playlistbg").css("width", ytw+19) + $("#playlist,#playlistbg,#queue").css("height", h-playerHeight-50) + + $("#controls").css({ position: 'absolute', top: yth+20, bottom: 'auto', right: 'auto', }) + $("#calendar").css({ top: playerHeight-63, right: rightoffset+ytw+50 }) + } + } + +var Profile = + { + mode: false, + loadQueue: function (queue) + { + if (! queue || ! queue.length) + return + Player.clearQueue() + $("#queue").html("") + Playlist.enqueueOldVideoFormat(queue) + }, + init: function () + { + } + } + +var Room = + { + } +var Poll = + { + room: "main", + delay: 5000, + init: function () + { + if (document.cookie) + { + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("room") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Poll.room = cookie[1] + break + } + } + } + } + Poll.poll() + Viewport.standardResize() + }, + poll: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + } + } + +var Calendar = + { + background: "", + dateLoad: function (y, m, d) + { + var data = + { + year: y, + month: m, + day: d, + } + $.post(API.URL.video.date, data).success(Calendar.dateSuccess) + }, + todayLoad: function () + { + d.warn("today") + $.post(API.URL.video.date).success(Calendar.dateSuccess) + }, + dateSuccess: function (raw) + { + var lines = API.parse("/video/date", raw) + if (! lines.length) return + var videos = [] + for (i in lines) + { + var line = lines[i].split("\t") + if (line[0] === "BG") + { + if (Calendar.background === line[1]) + continue + Calendar.background = line[1] + $("#bg").fadeOut(1000, function () + { + $("#bg img").attr("src", Calendar.background) + $("#bg img").bind("load", function () + { + $("#bg").fadeIn(1000) + $("#bg img").unbind("load") + }) + }) + } + if (line[0] === "VIDEO") + { + line.shift() + videos.push(line) + } + } + Player.clearQueue() + $("#queue").html("") + Playlist.enqueueOldVideoFormat(videos) + }, + onSelect: function (dateText, inst) + { + var datez = dateText.split("-") + Calendar.dateLoad(datez[0], datez[1], datez[2]) + }, + init: function () + { + $('#calendar').datepicker({ + inline: true, + onSelect: Calendar.onSelect, + dateFormat: "yy-m-d", + minDate: new Date(2011, 2, 2), + maxDate: new Date(), + }) + Calendar.todayLoad() + $('#calendar').fadeIn(1000) + } + } + +var Main = + { + init: function () + { + $(window).bind("resize", Viewport.standardResize) + $(window).bind("keydown", Keyboard.standardKeys) + Playlist.showScores = true + Auth.success = Poll.init + if (Auth.init()) + Auth.checkin() + Profile.init() + Player.init() + Like.likeVideoDelay = 6000 + $("#controls").fadeIn(2000) + $("#contact").fadeIn(2000) + setTimeout('Viewport.standardResize()', 1000) + Calendar.init() + } + } +Main.init() + diff --git a/frontend/static/js/chat.js b/frontend/static/js/chat.js new file mode 100644 index 0000000..822e1ee --- /dev/null +++ b/frontend/static/js/chat.js @@ -0,0 +1,280 @@ +var VIMEOregexp = /^(\bhttps?:\/\/)(www.)?vimeo.com\/([0-9]+).*$/i +var Chat = + { + timer: null, + oldChat: {}, + oldVideo: {}, + lastPoll: 0, + delay: 1000, + delayShort: 1000, + delayLong: 5000, + messages: {}, + callback: false, + parse: function (row) + { + var s = '<a href="/profile/' + row[2] + '" class="u">' + row[2] + "</a> <span>" + s += Chat.parseWords(row[3]) + s += "</span><br />" + return s + }, + parseWords: function (raw) + { + if (! raw) + return "" + var words = raw.split(" ") + var s = "" + for (i in words) + { + var word = words[i] + if (word.indexOf("http") !== -1) + { + if (word.indexOf("youtube.com/watch?") !== -1) + { + var ytid = "youtube_"+Youtube.getYtid(word) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtube.com/v/") !== -1) + { + var index = word.indexOf("/v/") + var ytid = "youtube_"+word.substr(index+3,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtu.be") !== -1) + { + var ytid = "youtube_"+word.substr(16,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + // http://www.youtube.com/user/ahchachachacha#p/f/28/1GSBekxLR1E + else if (word.indexOf("youtube.com/user") !== -1) + { + var ytid = "youtube_"+word.substr(-11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("vimeo.com") !== -1) + { + var vimeoid = word.replace(VIMEOregexp, "vimeo_$3") + if (vimeoid in Player.videos) + txt = Player.videos[vimeoid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+vimeoid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("soundcloud.com") !== -1) + { + var scid = "soundcloud_" + $.md5(word) + if (scid in Player.videos) + txt = Player.videos[scid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+scid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf(".jpeg") !== -1 || + word.indexOf(".JPG") !== -1 || + word.indexOf(".GIF") !== -1 || + word.indexOf(".PNG") !== -1 || + word.indexOf(".JPEG") !== -1 || + word.indexOf(".jpg") !== -1 || + word.indexOf(".gif") !== -1 || + word.indexOf(".png") !== -1) + { + s += '<a href="'+word+'" target="_blank" class="pic"><img src="'+word+'" /></a>' + } + else if (word.indexOf("scannerjammer.com/profile") !== -1) + { + var username = word.substr( word.indexOf("profile")+8 ).replace("/","") + s += '<a href="'+word+'">@'+username+'</a>' + } + // else if (word.indexOf("@") === 0 && word.length > 2) + // { + // } + else + { + var poffset = word.indexOf('//') + var linktext = word.substr(poffset+2, word.indexOf('/', poffset+2) - 2).replace("www.","").replace(/\/+$/,"") + s += '<a href="'+word+'" target="_blank">'+linktext+'</a> ' + } + } + else if (word.indexOf(".com") !== -1 || + word.indexOf(".net") !== -1 || + word.indexOf(".org") !== -1 || + word.indexOf(".us") !== -1 || + word.indexOf(".nu") !== -1 || + word.indexOf(".uk") !== -1 || + word.indexOf(".fr") !== -1 || + word.indexOf(".de") !== -1 || + word.indexOf(".fm") !== -1) + { + var txt = word.replace("www.","") + s += '<a href="http://'+word+'" target="_blank">'+txt+'</a> ' + } + else + s += word + " " + } + return s + }, + store: function (lines) + { + var newVideos = [] + var newChat = [] + var postponeScroll = false + for (i in lines) + { + if (! lines[i]) + continue + row = lines[i].split("\t") + if (row[0] === 'VIDEO') + { + row.shift() + if (row[0] in Chat.oldVideo) + continue + Chat.oldVideo[row[0]] = row + Playlist.enqueueOldVideoFormat([row]) + } + else if (row[0] === 'ROOM') + { + Room.updateSetting(row[1],row[2]) + } + else if (row[0] === 'LIKE') + { + username = row[1] + Like.enqueue(username) + } + else if (row[0] === 'CAM') + { + VideoChat.updateCount(row[1]) + } + else + { + // 0 id 1 date 2 user 3 msg + if (row[0] in Chat.oldChat) + continue + Chat.oldChat[row[0]] = row + var c = Chat.parse(row) + if (c.indexOf("<img") !== -1) + { + postponeScroll = true + d.joy(">> POSTPONING") + } + if (row[2] === Auth.username && $.md5(row[3]) in Chat.messages) + continue + newChat.push(c) + } + } + if (newChat.length) + { + $("#chat").append(newChat.join("")) + if (postponeScroll) + setTimeout('d.scrollToBottom("#chat")', 2000) + else + d.scrollToBottom("#chat") + } + }, + say: function () + { + d.act("+ sent message") + var msg = d.sanitize( $("#chat-message").val() ) + $("#chat-message").val("") + if (! msg) return + if (msg === "debug=1") { $("#msg").show(); d.scrollToBottom("#msg"); return } + if (msg === "debug=0") { $("#msg").hide(); return } + if (msg === "poll=0") { d.error("+ DISABLED POLLING"); clearTimeout(Chat.timer); return} + var hash = $.md5(msg) + Chat.messages[hash] = true + var newrow = [0, 0, Auth.username, msg] + var newdiv = Chat.parse(newrow) + $("#chat").append(newdiv) + // if (Chat.callback) + // Chat.callback(1) + if (newdiv.indexOf("<img") !== -1) + setTimeout('d.scrollToBottom("#chat")', 2000) + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: msg}, Room.sayCallback) + d.scrollToBottom("#chat") + }, + send: function (msg) + { + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: msg}, Room.sayCallback) + // var hash = $.md5(msg) + // Chat.messages[hash] = true + // var newrow = [0, 0, Auth.username, msg] + // var newdiv = Chat.parse(newrow) + // $("#chat").append(newdiv) + // if (newdiv.indexOf("<img") !== -1) + // setTimeout('d.scrollToBottom("#chat")', 2000) + // d.scrollToBottom("#chat") + }, + sayCallback: function (raw) + { + var lines = API.parse("/room/say", raw) + if (! lines) return + var newid = lines.split("\t")[0] + Chat.oldChat[newid] = true + // Room.store(lines) + d.joy("MESSAGE SENT") + }, + poll: function () + { + // d.warn("Polling") + $.post(API.URL.room.poll, + { + room: Room.name, + session: Auth.session, + last: Chat.lastPoll, + cam: VideoChat.isOpen, + }).success(Chat.pollCallback).error(Chat.pollErrorCallback) + }, + pollErrorCallback: function () + { + d.error("Poll failed, waiting "+Math.floor(Chat.delayLong)+"s...") + Chat.timer = setTimeout(Chat.poll, Chat.delayLong) + }, + pollCallback: function (raw) + { + // d.warn("Poll successful") + Chat.timer = setTimeout(Chat.poll, Chat.delay) + var lines = API.parse("/room/poll", raw) + if (! lines) + return d.error("Poll failed") + Chat.lastPoll = parseInt(lines.shift()) - 1 + Lastlog.update(lines.shift()) + Chat.store(lines) + } + } + +var Lastlog = + { + old: "", + update: function (lastlog) + { + if (Lastlog.old === lastlog) + return + Lastlog.old = lastlog + var names = lastlog.split("\t") + var s = "" + for (i in names.sort()) + { + s += "<li class='ll'><a href='/profile/"+names[i]+"'>"+names[i]+"</a></li>" + } + $("#lastlog").html(s) + $("#lastlogbg").css("height", $("#lastlogbox").height()) + } + } diff --git a/frontend/static/js/debug.js b/frontend/static/js/debug.js new file mode 100644 index 0000000..1a3339f --- /dev/null +++ b/frontend/static/js/debug.js @@ -0,0 +1,130 @@ +var d = + { + DEBUG: false, + act: function (s) + { + // $('#msg').append('<strong>'+s+'</strong><br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + joy: function (s) + { + // $('#msg').append('<b>'+s+'</b><br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + warn: function (s) + { + // $('#msg').append(s+'<br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + error: function (s) + { + // $('#msg').append('<em>ERROR: '+s+'</em><br/>') + // d.scrollToBottom("#msg") + // console.log(s) + return false + }, + noop: function () {}, + scrollToTop: function (elem) + { + $(elem).scrollTop( 0 ) + }, + scrollToBottom: function (elem) + { + try + { + $(elem).scrollTop( $(elem)[0].scrollHeight ) + } + catch (err) + { + } + }, + pageUp: function (div) + { + var st = $(div).scrollTop() + var h = $(window).height() + d.warn("PAGEUP: "+st+" "+h) + $(div).scrollTop( st - (2/3) * h ) + var st = $(div).scrollTop() + d.warn("ST NOW: "+st+" "+h) + }, + pageDown: function (div) + { + var st = $(div).scrollTop() + var h = $(window).height() + $(div).scrollTop( st + (2/3) * h ) + }, + choice: function (list) + { + return list[Math.floor (Math.random () * list.length)] + }, + trim: function (s) + { + if (s) + return s.replace(/^\s+|\s+$/g,"") + else + return "" + }, + sanitizeWithNewlines: function (s) + { + if (s) + return d.trim( s ).replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/\0/g,"") + return "" + }, + sanitize: function (s) + { + if (s) + return d.trim( s ).replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/\n/g,"").replace(/\r/g,"").replace(/\0/g,"") + return "" + }, + linkify: function (s) + { + var words = s.split(" ") + var checked = [] + for (i in words) + { + var word = words[i] + if (words[i].indexOf("http") === 0) + { + var poffset = word.indexOf('//') + var linktext = word.substr(poffset+2, word.indexOf('/', poffset+2)) + checked.push('<a href="'+word+'" target="_blank">'+linktext+'</a>') + } + else + checked.push(word) + } + return checked.join(" ") + }, + enableStylesheet: function (style) + { + $("link[@rel*=style][title]").each(function (i) + { + if (this.getAttribute('title') == style) + this.disabled = false + }) + }, + disableStylesheet: function (style) + { + $("link[@rel*=style][title]").each(function (i) + { + if (this.getAttribute('title') == style) + this.disabled = true + }) + }, + buildLookup: function (list) + { + var lookup = {} + for (var i = 0; i < list.length; i++) + lookup[list[i]] = true + return lookup + } + } + diff --git a/frontend/static/js/dump.js b/frontend/static/js/dump.js new file mode 100644 index 0000000..d6ca3c1 --- /dev/null +++ b/frontend/static/js/dump.js @@ -0,0 +1,2 @@ +$("#bg").html('<iframe style="border-width:0; height:100%; width:100%; background:#fff;" scrolling=no src="http://dump.fm/fullscreen"></iframe>') +// $("#chatbg,#playlistbg").css({ 'background-color': '#fff' }) diff --git a/frontend/static/js/embed.js b/frontend/static/js/embed.js new file mode 100644 index 0000000..d52c7a0 --- /dev/null +++ b/frontend/static/js/embed.js @@ -0,0 +1,142 @@ +var VIMEOregexp = /^(\bhttps?:\/\/)(www.)?vimeo.com\/([0-9]+).*$/i +var stWidget = {addEntry:function(){}} +var Room = + { + load: function () + { + } + } +var Keyboard = + { + standardMap: function (event) + { + kc = event.keyCode + if (kc === 27) // && Room.loaded) + { + Menu.close() + Viewport.fullscreenOn() + return false + } + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.pause() + if (kc === 76) + Player.likeClick() + event.preventDefault() + } + } +var Viewport = + { + resize: function () + { + var w = $(window).width() + var h = $(window).height() + var ytw = w + var yth = ytw * 3/4 + + var conheight = $("#controls").height() + $("#player").css("height", yth+conheight+40) + $("#player").css("top", 0).css("left", 0) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + + $("#controls").css("top", yth) + var playerTop = yth+15 + + $("#playlist,#playlistbg").css("top", playerTop+20) + $("#playlist,#playlistbg").css("width", '100%') + $("#playlist,#playlistbg,#queue").css("height", h-playerTop-20) + } + } +var Poll = + { + room: roomName, + last: "1", + delay: 60 * 1000, + init: function () + { + if (Auth.init()) + { + Poll.poll = Poll.pollAuth + Poll.delay = 3 * 1000 + Auth.success = Poll.poll + Auth.checkin () + } + else + { + Poll.poll = Poll.pollFree + Poll.poll() + } + }, + poll: function () {}, + pollAuth: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollFree: function () + { + $.post(API.URL.room.watch, + { + room: Poll.room, + last: Poll.last, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + var lines = raw.split("\n") + lines.shift() + Poll.last = d.trim( lines.shift() ) + var videos = [] + for (i in lines) + { + if (lines[i].indexOf("VIDEO") === 0) + { + var row = lines[i].split("\t") + row.shift() + videos.push(row) + } + } + if (videos.length) + { + Playlist.enqueueOldVideoFormat(videos) + } + } + } + +var Main = + { + init: function () + { + if (roomName === "disaro") + $("title").html("DISARO 20†† RADIO") + else if (roomName === "main") + $("title").html("SCANNERJAMMER RADIO") + else if (roomName === "sewergreats") + $("title").html("SEWER GREATS RADIO") + else + $("title").html(roomName.toUpperCase()+" RADIO") + $(window).bind("resize", Viewport.resize) + Viewport.resize() + $(window).bind("keydown", Keyboard.standardMap) + Poll.init() + Player.init() + Playlist.init() + $("#mute").bind("click", Player.muteClick) + setTimeout('Player.start()', 2000) + Player.queueOffset = 0 + } + } +Main.init() diff --git a/frontend/static/js/glitter-data.js b/frontend/static/js/glitter-data.js new file mode 100644 index 0000000..56787f2 --- /dev/null +++ b/frontend/static/js/glitter-data.js @@ -0,0 +1 @@ +GLITTER_DATA = ["Young-Red-Witch.gif", "You-Want-It-Come-and-Get-It.gif", "Winnie-Glitter-2.gif", "XoXo-Hearts.gif", "Winnie-Glitter.gif", "woman-style-lipstick-makeup.gif", "Yellow-Bird.gif", "Wings-2.gif", "Wings-5.gif", "Washington-Redskins.gif", "Vibrate-Me.gif", "Tweety-Bird-Dancing.gif", "Two-Sexy-Gals.gif", "Vibrate-Me-1.gif", "Tinkerbell.gif", "Tired-Puppy.gif", "Tinkerbell-Green-Dress.gif", "Tinkerbell-Flying.gif", "tiger_eye_sparkle.gif", "thanksc.gif", "Tinkerbell-Dreamy.gif", "Thank-You-Friend.gif", "Tear-Drop-Fairy.gif", "Texas-Rangers.gif", "Teddy-Bear-Glitter.gif", "Tampa-Bay-Devilrays.gif", "St-Louis-Rams.gif", "Tear-Drop-Fairy-1.gif", "staypunk-sparkle-cross.gif", "Sucker.gif", "sparkle-logo.gif", "Spanish-Beauty.gif", "Spank-Me.gif", "Spank-Me-1.gif", "Silver-Flower-Face.gif", "Sleek-Red.gif", "Simply-Pink.gif", "Some-Like-It-hot.gif", "Soft-Ice-Cream.gif", "Showing-Sexy-Luv.gif", "Silver-Cross.gif", "Sharing-Fruit.gif", "Sexy-White-Hair.gif", "Show-It-To-Me.gif", "showin_some_love_reflecting_rosebud.gif", "Sexy-Cape.gif", "Sexy-Flower-Bed.gif", "Sexy-Silver.gif", "Sexy-Star.gif", "sexy-100.gif", "Sexy-Blue-Hearts.gif", "Sexy-Bitch-Leoppard-1.gif", "Sexy-Bitch-Leoppard.gif", "Sexy-Black-White.gif", "Set-Me-free.gif", "Riding-Roses.gif", "Rose.gif", "Samurai-Chick.gif", "Red-Umbrella.gif", "Res-Fantasy-Sky.gif", "Red-Haze-Fairy.gif", "Red-Rose-Glitter.gif", "Red-Hair-Glitter.gif", "Red-Head-Goth.gif", "Purple-Flower-and-Butterfly.gif", "proud-mom-aunt.gif", "Red-Flower.gif", "Purple-Gal.gif", "Purple-Glitter-Flower.gif", "Powerpuff-Blossom.gif", "Princess-Fairy.gif", "Potty-Head-Care-Bear.gif", "Playboy-Purple.gif", "Playboy-Pink.gif", "Playboy-Silver.gif", "Playboy-Bunny-Pink.gif", "Playboy-Orange.gif", "Playboy-24.gif", "Playboy-4.gif", "Playboy-047.gif", "Playboy-Blue.gif", "Playboy-9.gif", "Playboy-5.gif", "Pittsburgh-Penguins.gif", "Playboy-032.gif", "Playboy-029.gif", "Playboy-036.gif", "Playboy-045.gif", "Pink-Lips-High-Heals.gif", "Pink-Shoe.gif", "Pink-Godess.gif", "pinkcowgirl.gif", "Pink-Heart-Dolphins.gif", "Pink-Glitter-Star.gif", "Pink-Bitches.gif", "Pink-Fantashy-Hearts.gif", "Philadelphia-Phillies.gif", "Philadelphia-Eagles.gif", "Phoenix-Coyotes.gif", "Overlooking-Fairy.gif", "Philadelphia-Eagles-1.gif", "Parental-Advisor.gif", "Palm-Tree.gif", "penis.gif", "Orange-Love.gif", "Orange-Eyes.gif", "Ninja-Turtle.gif", "Oh-My.gif", "Nice-Brow.gif", "New-York-Yankees.gif", "never-give-up.gif", "new-year-29.gif", "New-England-Patriots.gif", "myspace-flower-rose.gif", "Naughty-Pink.gif", "Naught-Girl-Grey.gif", "Music-Note-Glitter.gif", "Marilyn-Silver-Sparkle.gif", "Mushroom-Fairy.gif", "Muscle-Legs.gif", "Mickey.gif", "Minnesota-Wild.gif", "Long-Legs.gif", "Los-Angeles-Dodgers.gif", "Love-The-Lord.gif", "Marilyn-Silver-Sparkle-1.gif", "Live-For-Jesus.gif", "lindsay-lohan.gif", "Leopard-Legs.gif", "LETS-KISS.gif", "Kumba.gif", "Kansas-City-Chiefs.gif", "kisses-for-my-valentine-glitter.gif", "Kinky-Care-Bear.gif", "Kite-Care-Bear.gif", "ice-cream-cone-dessert-sweet-smile.gif", "Im-such-a-Bad-Girl.gif", "I-Love-Mickey.gif", "Jazz.gif", "Hot-Stuff.gif", "Hot-Pink-Bikini.gif", "Houston-Texans.gif", "Hot-Pink-Lady.gif", "Howdy-Hat.gif", "Hot-Long-Hair.gif", "Honey.gif", "Hot-Jail-Babe.gif", "Here-Big-Boy.gif", "Hello-Blue-Roses.gif", "Hello-Rose.gif", "Hi-Sexy-Red.gif", "Hollow-Heart-Red.gif", "Heart-Underwear.gif", "Have-Dreams.gif", "He-Died-For-you.gif", "Have-A-Beautiful-Day.gif", "happy-new-year.gif", "happy-new-year-computer.gif", "happy-new-year-524.gif", "happy-new-year-527.gif", "gtmc048.gif", "gtmc058.gif", "Happy-Feb-14th-Arrow-Heart.gif", "gtmc079.gif", "gtmc072.gif", "gtmc067.gif", "gtmc034.gif", "gtmc039.gif", "gtmc037.gif", "gtmc041.gif", "Green-Palm-Tree.gif", "Gorgeous-Pink-Flowers.gif", "goodbye7(combine).gif", "Gorgeous-Fairy.gif", "Ghetto-Booty.gif", "Getting-Ready.gif", "glitterfriend38.gif", "flirting-my-way-to-the-top.gif", "flowers.gif", "Fur-Cowgirl.gif", "Florida-Marlins.gif", "Fantasy-Fairy.gif", "Fantasy-Fairy-5.gif", "Fendi-Yellow.gif", "Fantasy-Fairy-8.gif", "Fairy-Wings-5.gif", "Fantasy-Fairy-4.gif", "Fairy-Wings-4.gif", "Fantasy-Fairy-10.gif", "Fairy-Waterfalls.gif", "Fairy-Fantasy-5.gif", "Fairy-Chest.gif", "Fairy-Caught-in-Jar.gif", "Fairy-23.gif", "Fairy-18.gif", "egypt_320_320_256_9223372036854775000_0_1_0.gif", "eye-glitter.gif", "egypt_320_256_9223372036854775000_0_1_0.gif", "Drppin-By-To-Say-hellow.gif", "Droppin-In-To-Say-Hello.gif", "egypt.gif", "Eeyore-Angel.gif", "dreamer.gif", "Dirty-Little-Secret.gif", "Dolphin-Animated.gif", "Cuban-Babe.gif", "Cupid-Just-Struck.gif", "date13.gif", "Colour-My-World.gif", "Cone-Get-It.gif", "Close-Girlfriends.gif", "Colorado-Rockies.gif", "cleopatra-elizabeth-liz-taylor-dress-babe.gif", "Cleveland-Indians.gif", "christmas-sexy6.gif", "christian_symbol07.gif", "christmas-sexy11.gif", "Chicago-Whitesox.gif", "Chicago-Cubs.gif", "Cherries.gif", "Chicago-Bears.gif", "Cat-Fairy.gif", "Cheetah-Chick.gif", "Cherries-Glittler.gif", "Cell-Phone-Glitter.gif", "Butterfly-Girl.gif", "California-Angels.gif", "Blue-Purple-Shoe.gif", "Buffalo-Bills.gif", "Bulls.gif", "Broken-heart-Pink.gif", "Burger-King-Glitter.gif", "Booty-Call.gif", "Blue-Care-Bear.gif", "Blue-Dolphin.gif", "Blue-Flower-03.gif", "Blue-Flower-02.gif", "Blue-Cape-Fairy.gif", "Blue-Butterfly-Heaven.gif", "Bloody-Vampire.gif", "Black-Kisses.gif", "Black-Razzers.gif", "blonde_gold_sparkle.gif", "Belly-Dnacer.gif", "Belly-Dancer.gif", "Belle-Glitter.gif", "beauty-red-rose-sparkle.gif", "Bible-Diet.gif", "beautiful-unicorn-magical-sparkle.gif", "Beautiful-Friendship.gif", "Beat-Hell.gif", "Baltimore-Orioles.gif", "Baltimore-Ravens.gif", "Atlanta-Falcons.gif", "awkward_pink_purple_glitter_wiggle.gif", "babe-bikini-butt-ass-face.gif", "Atlanta-Braves.gif", "Arizona-Cardinals.gif", "Arizona-Diamondbacks.gif", "ani-sparkle-fountain.gif", "American-Sexy-Thing.gif", "Aloha-Girl.gif", "American-Sexy-Thing-1.gif", "American-Flag-Heart.gif", "Air-Plane.gif", "1292462203316-dumpfm-yrmomvsmymom-sparkle.gif", "aaliyah.gif", "99-percent-tejana-and-1-percent-floridian.gif", "100-Percent-Sexy-Cowgirl.gif"] diff --git a/frontend/static/js/glitter.js b/frontend/static/js/glitter.js new file mode 100644 index 0000000..9aed159 --- /dev/null +++ b/frontend/static/js/glitter.js @@ -0,0 +1,108 @@ +var Glitter = + { + path: "/img/glitter/", + delay: 50, + count: 0, + radius: $(window).height() / 3, + direction: false, + centerX: $(window).width() * 2 / 7, + centerY: $(window).height() / 3, + loopTimer: false, + loopers: [], + rotate: function (id, angle, radius, direction, opacity) + { + if (direction) + angle += 2 + else + angle -= 2 + radians = angle * Math.PI / 180 + newX = Math.sin(radians) * radius + Glitter.centerX + newY = Math.cos(radians) * radius + Glitter.centerY + $(id).css({ "left": newX, "top": newY, "opacity": opacity/100 }) + opacity -= 1 + if (opacity === 0) + { + $(id).remove() + return false + } + return [id, angle, radius, direction, opacity] + }, + loop: function () + { + var newLoopers = [] + for (i in Glitter.loopers) + { + var l = Glitter.loopers[i] + var r = Glitter.rotate(l[0], l[1], l[2], l[3], l[4]) + if (r) + newLoopers.push(r) + } + Glitter.loopers = newLoopers + Glitter.loopTimer = setTimeout(Glitter.loop, Glitter.delay) + }, + go: function () + { + Glitter.count += 1 + // if (Glitter.count % 20 === 0) + // Glitter.direction = ! Glitter.direction + var index = Math.floor( Math.random() * GLITTER_DATA.length ) + var radius = Glitter.radius + Math.floor( Math.random() * 100 ) + var angle = Math.floor( Math.random() * 360 ) + var opacity = 100 + var newsrc = GLITTER_DATA[index] + var newid = "glitter_" + Glitter.count + var newdiv = "<div id='"+newid+"' class='glitter'><img src='"+Glitter.path+newsrc+"'/></div>" + // console.log(newdiv) + $("body").append(newdiv) + Glitter.loopers.push(["#"+newid, angle, radius, Glitter.direction, opacity]) + if (! Glitter.loopTimer) + Glitter.loop() + }, + generate: function (count) + { + if (count > 1) + count = 1 + for (var i = 0; i < count; i++) + setTimeout(Glitter.go, 50) + }, + oldTextareaMap: Keyboard.textareaMap, + oldStandardMap: Keyboard.standardMap, + oldFullscreenMap: Keyboard.fullscreenMap, + fullscreenMap: function (event) + { + Chat.callback(1) + return Glitter.oldFullscreenMap(event) + }, + standardMap: function (event) + { + Chat.callback(1) + return Glitter.oldStandardMap(event) + }, + textareaMap: function (event) + { + Chat.callback(1) + return Glitter.oldTextareaMap(event) + }, + init: function () + { + $("#glitter-go").bind("click", Glitter.go) + $("#flower img").attr("src", "/img/glitter_flower.gif") + Chat.callback = Glitter.generate + Like.likeVideoDelay = 10000 + var newtitle = "<img src='/img/glitter_scannerjammer.gif' />" + setTimeout('$("#heading").html("'+newtitle+'")', 6000) + $("#topic").css({position:"fixed", top: 40, left: 750}) + Room.loadCallback = function () + { + setTimeout(Viewport.fullscreenOn, 500) + setTimeout('$("#logobg").css({width: "100%"})', 1000) + Keyboard.textareaMap = Glitter.textareaMap + Keyboard.standardMap = Glitter.standardMap + Keyboard.fullscreenMap = Glitter.fullscreenMap + Keyboard.focusTextarea() + } + }, + } +Glitter.init() + + diff --git a/frontend/static/js/jquery-1.5.2.min.js b/frontend/static/js/jquery-1.5.2.min.js new file mode 100644 index 0000000..f78f96a --- /dev/null +++ b/frontend/static/js/jquery-1.5.2.min.js @@ -0,0 +1,16 @@ +/*! + * jQuery JavaScript Library v1.5.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Mar 31 15:28:23 2011 -0400 + */ +(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,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=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.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 e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(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(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,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"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.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?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){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,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.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]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),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]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.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!!k(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"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},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 b<c[3]-0},gt:function(a,b,c){return b>c[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=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||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=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":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=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=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(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.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:[]}},l.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&&(l.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 href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[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}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.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 k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},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 R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(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(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(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=d(arguments[0]);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,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.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 d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.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?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.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(!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 bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.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):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file diff --git a/frontend/static/js/jquery.md5.js b/frontend/static/js/jquery.md5.js new file mode 100644 index 0000000..0333717 --- /dev/null +++ b/frontend/static/js/jquery.md5.js @@ -0,0 +1,230 @@ + + /** + * jQuery MD5 hash algorithm function + * + * <code> + * Calculate the md5 hash of a String + * String $.md5 ( String str ) + * </code> + * + * Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash. + * MD5 (Message-Digest algorithm 5) is a widely-used cryptographic hash function with a 128-bit hash value. MD5 has been employed in a wide variety of security applications, and is also commonly used to check the integrity of data. The generated hash is also non-reversable. Data cannot be retrieved from the message digest, the digest uniquely identifies the data. + * MD5 was developed by Professor Ronald L. Rivest in 1994. Its 128 bit (16 byte) message digest makes it a faster implementation than SHA-1. + * This script is used to process a variable length message into a fixed-length output of 128 bits using the MD5 algorithm. It is fully compatible with UTF-8 encoding. It is very useful when u want to transfer encrypted passwords over the internet. If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). + * This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin. + * + * Example + * Code + * <code> + * $.md5("I'm Persian."); + * </code> + * Result + * <code> + * "b8c901d0f02223f9761016cfff9d68df" + * </code> + * + * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com > + * @link http://www.semnanweb.com/jquery-plugin/md5.html + * @see http://www.webtoolkit.info/ + * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License] + * @param {jQuery} {md5:function(string)) + * @return string + */ + + (function($){ + + var rotateLeft = function(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); + } + + var addUnsigned = function(lX, lY) { + var lX4, lY4, lX8, lY8, lResult; + lX8 = (lX & 0x80000000); + lY8 = (lY & 0x80000000); + lX4 = (lX & 0x40000000); + lY4 = (lY & 0x40000000); + lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); + if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8); + if (lX4 | lY4) { + if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); + else return (lResult ^ 0x40000000 ^ lX8 ^ lY8); + } else { + return (lResult ^ lX8 ^ lY8); + } + } + + var F = function(x, y, z) { + return (x & y) | ((~ x) & z); + } + + var G = function(x, y, z) { + return (x & z) | (y & (~ z)); + } + + var H = function(x, y, z) { + return (x ^ y ^ z); + } + + var I = function(x, y, z) { + return (y ^ (x | (~ z))); + } + + var FF = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var GG = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var HH = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var II = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var convertToWordArray = function(string) { + var lWordCount; + var lMessageLength = string.length; + var lNumberOfWordsTempOne = lMessageLength + 8; + var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; + var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; + var lWordArray = Array(lNumberOfWords - 1); + var lBytePosition = 0; + var lByteCount = 0; + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); + lByteCount++; + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); + lWordArray[lNumberOfWords - 2] = lMessageLength << 3; + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; + return lWordArray; + }; + + var wordToHex = function(lValue) { + var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255; + WordToHexValueTemp = "0" + lByte.toString(16); + WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2); + } + return WordToHexValue; + }; + + var uTF8Encode = function(string) { + string = string.replace(/\x0d\x0a/g, "\x0a"); + var output = ""; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + output += String.fromCharCode(c); + } else if ((c > 127) && (c < 2048)) { + output += String.fromCharCode((c >> 6) | 192); + output += String.fromCharCode((c & 63) | 128); + } else { + output += String.fromCharCode((c >> 12) | 224); + output += String.fromCharCode(((c >> 6) & 63) | 128); + output += String.fromCharCode((c & 63) | 128); + } + } + return output; + }; + + $.extend({ + md5: function(string) { + var x = Array(); + var k, AA, BB, CC, DD, a, b, c, d; + var S11=7, S12=12, S13=17, S14=22; + var S21=5, S22=9 , S23=14, S24=20; + var S31=4, S32=11, S33=16, S34=23; + var S41=6, S42=10, S43=15, S44=21; + string = uTF8Encode(string); + x = convertToWordArray(string); + a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; + for (k = 0; k < x.length; k += 16) { + AA = a; BB = b; CC = c; DD = d; + a = FF(a, b, c, d, x[k+0], S11, 0xD76AA478); + d = FF(d, a, b, c, x[k+1], S12, 0xE8C7B756); + c = FF(c, d, a, b, x[k+2], S13, 0x242070DB); + b = FF(b, c, d, a, x[k+3], S14, 0xC1BDCEEE); + a = FF(a, b, c, d, x[k+4], S11, 0xF57C0FAF); + d = FF(d, a, b, c, x[k+5], S12, 0x4787C62A); + c = FF(c, d, a, b, x[k+6], S13, 0xA8304613); + b = FF(b, c, d, a, x[k+7], S14, 0xFD469501); + a = FF(a, b, c, d, x[k+8], S11, 0x698098D8); + d = FF(d, a, b, c, x[k+9], S12, 0x8B44F7AF); + c = FF(c, d, a, b, x[k+10], S13, 0xFFFF5BB1); + b = FF(b, c, d, a, x[k+11], S14, 0x895CD7BE); + a = FF(a, b, c, d, x[k+12], S11, 0x6B901122); + d = FF(d, a, b, c, x[k+13], S12, 0xFD987193); + c = FF(c, d, a, b, x[k+14], S13, 0xA679438E); + b = FF(b, c, d, a, x[k+15], S14, 0x49B40821); + a = GG(a, b, c, d, x[k+1], S21, 0xF61E2562); + d = GG(d, a, b, c, x[k+6], S22, 0xC040B340); + c = GG(c, d, a, b, x[k+11], S23, 0x265E5A51); + b = GG(b, c, d, a, x[k+0], S24, 0xE9B6C7AA); + a = GG(a, b, c, d, x[k+5], S21, 0xD62F105D); + d = GG(d, a, b, c, x[k+10], S22, 0x2441453); + c = GG(c, d, a, b, x[k+15], S23, 0xD8A1E681); + b = GG(b, c, d, a, x[k+4], S24, 0xE7D3FBC8); + a = GG(a, b, c, d, x[k+9], S21, 0x21E1CDE6); + d = GG(d, a, b, c, x[k+14], S22, 0xC33707D6); + c = GG(c, d, a, b, x[k+3], S23, 0xF4D50D87); + b = GG(b, c, d, a, x[k+8], S24, 0x455A14ED); + a = GG(a, b, c, d, x[k+13], S21, 0xA9E3E905); + d = GG(d, a, b, c, x[k+2], S22, 0xFCEFA3F8); + c = GG(c, d, a, b, x[k+7], S23, 0x676F02D9); + b = GG(b, c, d, a, x[k+12], S24, 0x8D2A4C8A); + a = HH(a, b, c, d, x[k+5], S31, 0xFFFA3942); + d = HH(d, a, b, c, x[k+8], S32, 0x8771F681); + c = HH(c, d, a, b, x[k+11], S33, 0x6D9D6122); + b = HH(b, c, d, a, x[k+14], S34, 0xFDE5380C); + a = HH(a, b, c, d, x[k+1], S31, 0xA4BEEA44); + d = HH(d, a, b, c, x[k+4], S32, 0x4BDECFA9); + c = HH(c, d, a, b, x[k+7], S33, 0xF6BB4B60); + b = HH(b, c, d, a, x[k+10], S34, 0xBEBFBC70); + a = HH(a, b, c, d, x[k+13], S31, 0x289B7EC6); + d = HH(d, a, b, c, x[k+0], S32, 0xEAA127FA); + c = HH(c, d, a, b, x[k+3], S33, 0xD4EF3085); + b = HH(b, c, d, a, x[k+6], S34, 0x4881D05); + a = HH(a, b, c, d, x[k+9], S31, 0xD9D4D039); + d = HH(d, a, b, c, x[k+12], S32, 0xE6DB99E5); + c = HH(c, d, a, b, x[k+15], S33, 0x1FA27CF8); + b = HH(b, c, d, a, x[k+2], S34, 0xC4AC5665); + a = II(a, b, c, d, x[k+0], S41, 0xF4292244); + d = II(d, a, b, c, x[k+7], S42, 0x432AFF97); + c = II(c, d, a, b, x[k+14], S43, 0xAB9423A7); + b = II(b, c, d, a, x[k+5], S44, 0xFC93A039); + a = II(a, b, c, d, x[k+12], S41, 0x655B59C3); + d = II(d, a, b, c, x[k+3], S42, 0x8F0CCC92); + c = II(c, d, a, b, x[k+10], S43, 0xFFEFF47D); + b = II(b, c, d, a, x[k+1], S44, 0x85845DD1); + a = II(a, b, c, d, x[k+8], S41, 0x6FA87E4F); + d = II(d, a, b, c, x[k+15], S42, 0xFE2CE6E0); + c = II(c, d, a, b, x[k+6], S43, 0xA3014314); + b = II(b, c, d, a, x[k+13], S44, 0x4E0811A1); + a = II(a, b, c, d, x[k+4], S41, 0xF7537E82); + d = II(d, a, b, c, x[k+11], S42, 0xBD3AF235); + c = II(c, d, a, b, x[k+2], S43, 0x2AD7D2BB); + b = II(b, c, d, a, x[k+9], S44, 0xEB86D391); + a = addUnsigned(a, AA); + b = addUnsigned(b, BB); + c = addUnsigned(c, CC); + d = addUnsigned(d, DD); + } + var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); + return tempValue.toLowerCase(); + } + }); + })(jQuery);
\ No newline at end of file diff --git a/frontend/static/js/like.js b/frontend/static/js/like.js new file mode 100644 index 0000000..f564f4c --- /dev/null +++ b/frontend/static/js/like.js @@ -0,0 +1,97 @@ +var Like = + { + timeout: false, + likeVideoDelay: 1000, + likeMessageDelay: 10000, + favewords: + [ + 'dazzled', 'dangled', 'amazed', 'shocked', 'wowed', + 'spangled', 'glittered', 'blinged', 'jazzed', 'smoked', + 'rocked', 'jammed', 'stoked', 'blazed', 'pringled', 'engulfed', + ], + colors: + [ + "#ffa1b8","#ffb9a1","#ffe8a1","#ffa1e7","#a1a4ff","#cda1ff","#fca1ff","#a1d3ff","#e8a1ff","#a1f6ff","#a1ffaa","#c7ffa1" + ], + enqueue: function (username) + { + d.joy("liked by "+username) + $("#likereport").append( + $("<a>").attr("href","/profile/"+username).html(username+" was "+d.choice(Like.favewords)+"!").attr("style","color:"+d.choice(Like.colors))) + if (Viewport.focused) + Like.fire() + else + Like.pending = true + }, + fire: function () + { + d.joy("LIKE ANIMATION GO") + Like.pending = false + $("#likereport").stop(false,false).show() + d.scrollToBottom("#likereport") + $("#plant").stop(true, true).show() + $("#flower").stop(true, true).show() + if (Like.timeout) + clearTimeout(Like.timeout) + Like.timeout = setTimeout(Like.queueFade, 1000) + }, + queueFade: function timeout() + { + d.joy("LIKE ANIMATION FADE") + Like.timeout = false + $("#plant").fadeOut(Like.likeVideoDelay) + $("#flower").fadeOut(Like.likeVideoDelay) + $("#likereport").fadeOut(Like.likeMessageDelay, function(){$("#likereport").html("")}) + }, + likeVideo: function (video) + { + if (! Auth.session) + return d.error("like: not logged in") + if (video.username === Auth.username) + return d.error("like: that's you") + var data = { video: video.id, session: Auth.session, } + if (Local.isLiked(video.id)) + { + d.joy("unliking "+video.key) + if (Player.currentKey === video.key) + $("#like").removeClass("liked") + $("#like_"+video.id).removeClass("liked").html(" like") + video.liked = false + Local.unlike(video.id) + if (video.score) + { + video.score -= 1 + if (video.score < 0) + { + video.score = 0 + $("#score_"+video.id).html(' ') + } + else + { + $("#score_"+video.id).html(video.score) + } + } + $.post(API.URL.video.unlike, data) + } + else + { + d.joy("liking "+video.key) + if (Player.currentKey === video.key) + $("#like").addClass("liked") + $("#like_"+video.id).addClass("liked").html("liked") + $("#flower").show().fadeOut(Like.likeVideoDelay) + video.liked = true + Local.like(video.id) + if (video.score) + { + video.score += 1 + $("#score_"+video.id).html(video.score) + } + $.post(API.URL.video.like, data) + } + }, + init: function () + { + } + } + diff --git a/frontend/static/js/main.js b/frontend/static/js/main.js new file mode 100644 index 0000000..8a3c3a1 --- /dev/null +++ b/frontend/static/js/main.js @@ -0,0 +1,662 @@ +var Keyboard = + { + enter: false, + enteredText: false, + altMode: false, + focusTextarea: function () + { + // $("#chat").append("TEXTAREA FOCUS") + $(window).unbind("keydown") + $("#chat-message").unbind("keydown").bind("keydown", Keyboard.textareaMap) + $("#chat-message").unbind("focus").focus().bind("focus", Keyboard.focusTextarea) + Search.close () + if ($("#chat-message").val().length === 0) + Keyboard.enteredText = false + }, + blurTextarea: function () + { + // $("#chat").append("TEXTAREA BLUR") + $(window).unbind("keydown") + if (Viewport.fullscreenMode && Viewport.fullscreenInterface) + $(window).bind("keydown", Keyboard.fullscreenInterfaceMap) + else if (Viewport.fullscreenMode) + $(window).bind("keydown", Keyboard.fullscreenMap) + else + $(window).bind("keydown", Keyboard.standardMap) + $("#chat-message").unbind("keydown") + }, + textareaMap: function (event) + { + var kc = event.keyCode + if (kc === 8) + { + var v = $("#chat-message").val() + if (v.length < 2) + Keyboard.enteredText = false + return true + } + if (kc === 13) + { + Keyboard.enteredText = false + if (Keyboard.enter) + Keyboard.enter() + if (Chat.callback) + { + Chat.callback(1) + } + return false + } + if (kc === 27) + { + Menu.close() + if (Viewport.fullscreenMode && Viewport.fullscreenInterface) + Viewport.fullscreenHideInterface() + else if (Viewport.fullscreenMode) + Viewport.fullscreenOff() + else + Viewport.fullscreenOn() + return false + } + if (! Keyboard.enteredText) + { + if (kc === 37) + { + Player.playPrev() + return + } + else if (kc === 39) + { + Player.playNext() + return + } + } + if (kc === 33) + return d.pageUp("#chat") + if (kc === 34) + return d.pageDown("#chat") + Keyboard.enteredText = true + return true + }, + standardMap: function (event) + { + kc = event.keyCode + if (kc === 91) + { + Keyboard.altMode = true + return true + } + else if (kc === 27) // && Room.loaded) + { + Menu.close() + Viewport.fullscreenOn() + return false + } + else if (! Menu.isOpen) + { + if (kc === 37 || kc === 177) + Player.playPrev() + else if (kc === 39 || kc === 176) + Player.playNext() + else if (kc === 32 || kc === 179) + Player.pause() + else if (! Keyboard.altMode && kc === 76) + Player.likeClick() + } + Keyboard.altMode = false + return true + }, + fullscreenInterfaceMap: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenHideInterface() + if (kc === 33) + d.pageUp("#chat") + if (kc === 34) + d.pageDown("#chat") + if (kc === 32 || kc === 179) + Player.pause() + if (kc === 37 || kc === 177) + Player.playPrev() + else if (kc === 39 || kc === 176) + Player.playNext() + if (! Keyboard.altMode && kc === 76) + Player.likeClick() + return false + }, + fullscreenMap: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenOff() + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.pause() + if (kc === 76) + Player.likeClick() + return false + } + } +var Viewport = + { + focused: true, + fullscreenMode: false, + fullscreenInterface: false, + fullscreenFocusTimer: false, + fullscreenOn: function () + { + var msg = $("#chat-message").val() + $(window).unbind("resize") + $(window).bind("resize", Viewport.fullscreenResize) + $("#chat").unbind("mouseover").unbind("mouseout") + $("#chat-message").focus() + Keyboard.focusTextarea() + $("#chat,#playlist").addClass("fullscreen") + $("#bg,#chatbg,#playlistbg,#playlist").hide() + $("#faqlink").hide() + $("#logobg").css("width",$("#logo").width()+60) + $("#like").show() + $("#controls").css("position", "fixed") + Menu.close () + Search.close () + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Viewport.fullscreenOff) + $("#video-title").addClass("fullscreen") + Viewport.fullscreenInterface = true + Viewport.fullscreenMode = true + Viewport.fullscreenResize() + Viewport.chatMouseOut() + $("#chat-message").val(msg) + d.scrollToBottom("#chat") + }, + fullscreenOff: function () + { + $("#logobg").css("width","100%") + $(window).unbind("keydown") + // $(window).bind("keydown", Keyboard.standardMap) + $(window).unbind("resize") + $(window).bind("resize", Viewport.standardResize) + $("#chat").bind("mouseover", Viewport.chatMouseOver) + $("#chat").bind("mouseout", Viewport.chatMouseLaave) + $("#bg,#logo,#logobg,#form,#formbg,#chat,#chatbg,#playlist,#playlistbg,#lastlogbox,#lastlogbg,#sitez,#controls").show() + $("#controls").css("position", "absolute") + $("#controls").css("min-width", "auto").css('top','auto').css('bottom', 'auto').css('left','auto').css('right','auto') + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Main.fullscreenOn) + $("#video-title").removeClass("fullscreen") + $("#chat,#playlist").removeClass("fullscreen") + $("#controls").css("padding", 0) + Viewport.standardResize() + setTimeout('d.scrollToBottom("#chat")', 500) + Keyboard.focusTextarea() + Viewport.fullscreenMode = false + clearInterval(Viewport.fullscreenFocusTimer) + Viewport.fullscreenFocusTimer = false + }, + fullscreenHideInterface: function () + { + Viewport.fullscreenInterface = false + Keyboard.blurTextarea() + $("#form,#formbg,#chat,#playlist,#lastlogbox,#lastlogbg,#sitez,#controls,#logo,#logobg").hide() + }, + fullscreenResize: function () + { + var w = $(window).width() + var h = $(window).height() + var fw = 4 * w / 7 - 40 + var ph = h / 3 - 30 + var ch = 2 * h / 3 + var fh = 50 + var clh = ch - fh - 50 + + var pw = w * 2 / 3 - 20 + + var chatwidth = (4*w)/5 - 20 + + var chatheight = h-fh-5 + var fbot = 20 + var chatbot = Viewport.chatBottom + + if (VideoChat.isOpen) + { + var vch = 150 + $("#tokbox-embed").css("width", fw-20) + chatheight -= vch + chatbot += vch + fbot += vch + } + + $("#player").css("top", -10).css("left", -10) + $("#screen,#ytscreen").css("width",w).css("height",h) + + $("#chat").css("left", 0).css("bottom", chatbot).css("width", chatwidth).css("height", chatheight) + d.scrollToBottom("#chat") + + var sendw = $("#chat-send").width() + var camw = $("#videochat-toggle").width() + $("#chat-message").css("width", fw-sendw-camw-50) + $("#form,#formbg").css("left", 0) + $("#form").css("bottom", fbot) + $("#form,#formbg").css("width", fw) + + var controlsw = $("#controls").width() + var controlsoffset = ( w - fw - controlsw ) / 2 + $("#controls").css({ "top": "auto", "bottom": fbot+2, "right": controlsoffset, "background": "black", "padding": 10, }) + + $("#lastlogbox,#lastlogbg").css("top", h/3).css("left", w*(7/8)-10) + $("#lastlogbg").css("height", $("#lastlogbox").height()) + }, + playerTop: 94, + chatWidth: 500, + chatBottom: 75, + formHeight: 50, + standardResize: function () + { + var w = $(window).width() + var h = $(window).height() + var ytw = 1 * w / 2 - 90 + if (ytw > 500) + ytw = 500 + var yth = ytw * 9/ 16 + + var fh = Viewport.formHeight + + var cw = w - ytw - 80 + var ch = 2 * h / 3 + var chatheight = h-fh-5 + Viewport.chatWidth = cw + + var pw = cw - 20 + var ph = h / 3 - 30 + + var fbot = 20 + var chatbot = Viewport.chatBottom + + var clw = cw*3/4 + var clh = ch - fh - 50 + + var llw = cw / 4 - 30 + var llh = ch - fh - 30 + + var sendw = $("#chat-send").width() + var camw = $("#videochat-toggle").width() + $("#chat-message").css("width", pw-sendw-camw-30) + + if (VideoChat.isOpen) + { + var vch = chatheight * 1 / 2 + if (vch < 280) + vch = 280 + $("#tokbox-embed").css({"width": cw+20, "height": vch}) + $("#tokbox-embedded").css({"height": vch}) + chatheight -= vch + chatbot += vch + fbot += vch + } + + var msgw = 0 + var buttonheight = $("#fullscreen").height() + + $("#bg img").css("width", w) + $("#bg img").css("height", h) + + $("#logo").css("left", 20) + + if (retrograde) + { + // PLAYER ON LEFT + $("#player").css("left", 20) + $("#player").css("top", Viewport.playerTop) + $("#player").css("height", yth+buttonheight+20) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + Player.width = ytw + Player.height = yth + + $("#controls").css("top", yth+10+10) + var playerHeight = yth+buttonheight+Viewport.playerTop + 10 + + $("#playlist,#playlistbg").css("left", 20) + $("#playlist,#playlistbg").css("top", playerHeight+30) + $("#playlist,#playlistbg").css("width", ytw+19) + $("#playlist,#playlistbg,#queue").css("height", h-playerHeight-50) + + $("#chat,#chatbg").css("left", 60+ytw) + $("#chat,#chatbg").css("bottom", chatbot) + $("#chat,#chatbg").css("width", cw) + $("#chat,#chatbg").css("height", chatheight) + // $("#chat").css("overflow-y", "scroll") + // $("#chat").css("overflow-x", "hidden") + + $("#form,#formbg").css("left", 60+ytw) + $("#form,#formbg").css("bottom", fbot) + $("#form,#formbg").css("width", cw) + $("#form,#formbg").css("height", fh-15) + $("#formbg").css("opacity", 0.7) + + $("#lastlogbox,#lastlogbg").css("top", 90) + $("#lastlogbox,#lastlogbg").css("left", ytw+60+clw) + $("#lastlogbox,#lastlogbg").css("width", llw) + $("#lastlogbox").css("max-height", (h-fh-70-40)*3/4) + $("#lastlogbox").css("overflow-y", "auto") + $("#lastlogbox").css("overflow-x", "hidden") + + $("#likereport").css("bottom", 90) + $("#likereport").css("left", ytw+60+clw) + $("#likereport").css("width", llw-20) + $("#likereport").css("height", (h-fh-70-40)*1/4) + + $("#msg").css("max-height", h-130) + } + + else + { + // PLAYER ON RIGHT + $("#player").css("left", 40+pw+20) + $("#player").css("top", Viewport.playerTop) + $("#player").css("height", yth+buttonheight+20) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + + $("#controls").css("top", yth+10+10) + var playerHeight = yth+buttonheight+Viewport.playerTop+10 + + $("#playlist,#playlistbg").css("left", 40+pw+20) + $("#playlist,#playlistbg").css("top", playerHeight+30) + $("#playlist,#playlistbg").css("width", ytw+19) + $("#playlist,#playlistbg,#queue").css("height", h-playerHeight-50) + + $("#chat,#chatbg").css("left", 0) + $("#chat,#chatbg").css("bottom", chatbot) + $("#chat,#chatbg").css("width", cw) + $("#chat,#chatbg").css("height", chatheight) + // $("#chat").css("overflow-y", "scroll") + // $("#chat").css("overflow-x", "hidden") + + $("#plant").css("left", cw-300) + + $("#form,#formbg").css("left", 0) + $("#form").css("bottom", fbot) + $("#form,#formbg").css("width", cw) + $("#form,#formbg").css("height", fh-15) + $("#formbg").css("opacity", 0.7) + + $("#lastlogbox,#lastlogbg").css("top", 90) + $("#lastlogbox,#lastlogbg").css("left", 10+clw) + $("#lastlogbox,#lastlogbg").css("width", llw) + $("#lastlogbox").css("max-height", (h-fh-70-40)*3/4) + $("#lastlogbox").css("overflow-y", "auto") + $("#lastlogbox").css("overflow-x", "hidden") + + var lrwidth = llw-20 + if (lrwidth < 150) lrwidth = 150 + $("#likereport").css("bottom", 90) + $("#likereport").css("left", cw-lrwidth-90) + $("#likereport").css("width", lrwidth) + $("#likereport").css("max-height", (h-fh-70-40)*1/4) + + $("#msg").css("max-height", h-130) + } + $("#lastlogbg").css("height", $("#lastlogbox").height()) + d.scrollToBottom("#chat") + }, + scrollbarWidth: 16, + getScrollbarWidth: function () + { + var initial = document.body.style.overflow + document.body.style.overflow = 'hidden'; + var width = document.body.clientWidth; + document.body.style.overflow = 'scroll' + width -= document.body.clientWidth + if (! width) + width = document.body.offsetWidth - document.body.clientWidth + document.body.style.overflow = initial + return width + }, + focus: function () + { + d.warn("VIEWPORT FOCUS") + if (! Viewport.fullscreenMode || Viewport.fullscreenInterface) + Keyboard.focusTextarea() + document.body.tabIndex = 0 + document.body.focus() + Viewport.focused = true + // Chat.delay = 1000 + if (Like.pending) + Like.fire() + // Chat.delay = Chat.delayShort + }, + blur: function () + { + d.warn("VIEWPORT BLUR") + Viewport.focused = false + // Chat.delay = Chat.delayLong + }, + chatMouseOver: function () + { + $("#chat").css({"overflow-y": "scroll", "width": Viewport.chatWidth + Viewport.scrollbarWidth }) + $("#chat").scrollTop( $("#chat").scrollTop() ) + }, + chatMouseOut: function () + { + $("#chat").css({"overflow-y": "hidden", "width": Viewport.chatWidth}) + }, + init: function () + { + Viewport.scrollbarWidth = Viewport.getScrollbarWidth () + $("#chat").bind("mouseover", Viewport.chatMouseOver) + $("#chat").bind("mouseout", Viewport.chatMouseOut) + } + } +var Background = + { + src: "http://lalalizard.com/bgz/jupiteraurora.jpg", + srcReset: "http://lalalizard.com/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif", + load: function () + { + $("#bg").show() + //setTimeout(function(){$("#bg img").attr("src", Background.src)}, 2000) + }, + init: function () + { + } + } +var Include = + { + glitter: function () + { + Room.ops = {} + $("body").append("<script type='text/javascript' src='/js/glitter.js'></script>") + $("body").append("<script type='text/javascript' src='/js/glitter-data.js'></script>") + d.enableStylesheet("glitter") + }, + avatar: function () + { + Room.ops = {} + $("body").append("<script type='text/javascript' src='/js/avatar-data.js'></script>") + $("body").append("<script type='text/javascript' src='/js/avatar.js'></script>") + d.enableStylesheet("avatar") + }, + jonomilo: function () + { + Room.ops = d.buildLookup(["daytimetelevision"]) + d.enableStylesheet("white") + $("#heading").remove() + $("#topic").remove() + $("#likebutton").before("<h1 id='heading'></h1><h2 id='topic'></h2>") + Include.middleColumn () + }, + middleColumn: function () + { + Chat.previousName = false + Chat.containsImage = function (s) + { + if (s.indexOf("http") === -1) + return false + var suffixes = ["jpg","jpeg","gif","png"] + for (var i = 0; i < suffixes.length; i++) + { + if (s.indexOf(suffixes[i]) !== -1) + { + // console.log(suffixes[i] + " " + s) + return true + } + } + return false + } + Chat.parse = function (row) + { + if (Chat.containsImage(row[3])) + { + var s = "<div class='chatimg'>" + s += "<span>" + s += Chat.parseWords(row[3]) + s += "</span>" + s += "</div>" + return s + } + else + { + Chat.previousName = row[2] + var s = "<div class='chatline'>" + s += '<a href="/profile/' + row[2] + '" class="u">' + row[2] + "</a>" + s += "<span>" + s += Chat.parseWords(row[3]) + s += "</span>" + s += "</div>" + return s + } + } + }, + diornights: function () + { + $("#logo").append("<h2 class='radio'><a href='http://diornights.com/radio/'>OPEN RADIO</a></h2>") + }, + disaro: function () + { + $("#logo").append("<h2 class='radio'><a href='/disaro/radio/'>OPEN RADIO</a></h2>") + }, + sewergreats: function () + { + $("#logo").append("<h2 class='radio'><a href='/sewergreats/radio/'>OPEN RADIO</a></h2>") + }, + dump: function () + { + Room.ops = d.buildLookup([""]) + $("body").append("<script type='text/javascript' src='/js/dump.js'></script>") + }, + yhvh: function () + { + Room.ops = d.buildLookup(["greta"]) + }, +/* + icons: function () + { + $("#bg").html('<iframe style="border-width:0; height:100%; width:100%; background:#fff;" scrolling=no src="http://asdf.us/strobe"></iframe>'); + }, +*/ + feederbleeder: function () + { + Room.ops = {} + $("#preamblewords").remove() + $("#topic").remove() + $("#heading").after("<h2 id='topic' class='preamblish'></h2>") + d.enableStylesheet("feederbleeder") + var oldsay = Chat.say + Chat.say = function () + { + var msg = $("#chat-message").val() + if (msg.indexOf("http") !== -1) + { + $("#chat").append("<div class='modhello'>Sorry, only the Feederbleeder robot can post videos and images in this room. Please visit <a href='/'>another room</a> to post videos.</div>") + $("#chat-message").val("") + d.scrollToBottom("#chat") + } + else + { + oldsay () + } + } + }, + fred: function () + { + Room.ops = d.buildLookup(["scannerjammer"]) + }, + frederick: function () + { + Room.ops = d.buildLookup(["scannerjammer"]) + d.enableStylesheet("frederick") + }, + glasspopcorn: function () + { + Room.ops = d.buildLookup(["glasspopcorn"]) + setTimeout(VideoChat.toggle, 2000) + $("#plant img").attr("src", "/img/1309267681552dumpfmfrakbuddyglasscross_1310066105.gif") + $("#flower img").attr("src", "/img/1278131405573-dumpfm-glasspopcorn-sitmanpiano.gif") + $("#heading").remove() + $("#logo").append("<h2 class='radio'><a href='/glasspopcorn/radio/'>OPEN RADIO</a></h2>") + $("body").append("<div id='glasspopcornlogo'><img src='http://lalalizard.com/img/glasspopcornheader.png' width='400'/></div>") + $("#preamblewords").html("Post GIFs and Soundclouds into the chat!<br/>Use arrow keys to switch videos<br/>Hit L key to LIKE<br/>Hit ESC to change modes") + Player.unregister("youtube") + Player.unregister("vimeo") + Player.unregister("audio") + }, + sfvacid: function () + { + // $("#logo").append("<h2 class='radio'><a href='/sfvacid/radio/'>OPEN RADIO</a></h2>") + }, + main: function () + { + Room.ops = false + $("#heading").remove() + $("#preamblewords").after("<h1> </h1>") + $("#topic").remove() + // Room.loadCallback = function () + // { + // setTimeout(Viewport.fullscreenOn, 3000) + // } + // $("#likebutton").before("<h2 class='preamblish'>Post urls into the chat!<br/>Use arrow keys to switch videos</h2>") + } + } + +var Main = + { + init: function () + { + d.warn("INIT MAIN") + + if (roomName in Include) + { + Include[roomName]() + } + + $(window).bind("focus", Viewport.focus) + $(window).bind("blur", Viewport.blur) + $(window).bind("resize", Viewport.standardResize) + $(window).bind("keydown", Keyboard.standardMap) + Viewport.standardResize() + Viewport.init() + Background.init() + $("#chat").append("<div id='shim'></div>") + Room.init() + if ( Auth.init() ) + Room.connect() + else + Auth.load() + document.write('<script async src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>') + if (window.location.pathname.split("/")[2] == "read") + { + API.URL.room.join = API.BASE_URL + "/api/room/view" + // API.URL.room.poll = API.BASE_URL + "/api/room/read" + d.enableStylesheet("tiny") + Viewport.playerTop = 20 + Viewport.chatBottom = 20 + Viewport.formHeight = 5 + Player.mute() + } + } + } +Main.init () diff --git a/frontend/static/js/player.js b/frontend/static/js/player.js new file mode 100644 index 0000000..87973a4 --- /dev/null +++ b/frontend/static/js/player.js @@ -0,0 +1,546 @@ +var VIMEOregexp = /^(\bhttps?:\/\/)(www.)?vimeo.com\/([0-9]+).*$/i +var PLAY_BUTTONS = + { + prev: "<div class='arrow-prev'></div> <div class='arrow-prev'></div>", + next: "<div class='arrow-next'></div> <div class='arrow-next'></div>", + pause: "<div class='arrow-pause'></div> <div class='arrow-pause'></div>", + play: "<div class='arrow-play'></div>", + } +var Player = + { + videos: {}, + queue: [], + projectors: {}, + projector: null, + newVideos: false, + currentIdx: 0, + video: false, + errors: 0, + width: '100%', + height: '100%', + playlistOffset: 30, + queueOffset: 60, + paused: false, + muted: false, + enqueue: function (video) + { + if (! (video.type in Player.projectors)) + return d.error("unknown video type "+video.type) + var key = video.type+"_"+video.name + if (key in Player.videos) + { + Player.videos[key].idx = Player.queue.length + Player.videos[key].seen = false + if (video.offset) + Player.videos[key].offset = video.offset + d.warn("bumped "+key) + } + else + { + video.key = key + video.idx = Player.queue.length + Player.videos[key] = video + Player.newVideos = true + d.warn("enqueued "+key) + } + $("#"+video.key).html(video.title) + Player.queue.push(key) + return true + }, + clearQueue: function () + { + Player.queue = [] + Player.currentIdx = 0 + Playlist.count = 0 + }, + register: function (projector) + { + d.warn("registered "+projector.type) + Player.projectors[projector.type] = projector + }, + unregister: function (projectortype) + { + d.warn("unregistered "+projectortype) + delete Player.projectors[projectortype] + }, + start: function () + { + d.warn("PLAYER START") + Player.currentIdx = Player.queue.length - 1 + if (! Player.queue.length) + return d.error("empty queue") + Player.playLatest() + }, + finish: function () + { + d.warn("PLAYER FINISH") + d.warn("____________") + Player.playLatest() + }, + error: function (s) + { + if (s) + d.error(Player.errors+" "+s) + else + d.error("PLAYER ERROR "+Player.errors) + $("li#queue_"+Player.video.idx+" span.title").html("<i>This video cannot be embedded</i>") + Player.video.error = true + }, + playLatest: function () + { + d.warn("PLAY LATEST") + var idx = Player.currentIdx + var len = Player.queue.length + if (Player.newVideos) + { + for (i = idx; i < len; i++) + { + var video = Player.videos[Player.queue[i]] + d.warn("check "+Player.queue[i]) + if (video.seen) + continue + Player.currentIdx = i + d.joy("new video! "+video.key+" at "+i) + Player.queueJumpToCurrentVideo(Player.currentIdx) + Player.playVideo(video) + return + } + for (i = idx - 1; i >= 0; i--) + { + var video = Player.videos[Player.queue[i]] + d.warn("check "+Player.queue[i]) + if (video.seen) + continue + Player.currentIdx = i + d.joy("new video! "+video.key+" at "+i) + Player.queueJumpToCurrentVideo(Player.currentIdx) + Player.playVideo(video) + return + } + Player.newVideos = false + d.warn("no new videos") + } + Player.playNext() + }, + playNext: function () + { + d.warn("____________") + d.warn("PLAY NEXT") + var idx = Player.currentIdx + do + { + idx -= 1 + if (Player.queue[idx] === Player.video.key) + idx -= 1 + if (idx < 0) + idx = Player.queue.length - 1 + } + while (Player.videos[ Player.queue[idx] ].error === true) + Player.queueJumpToCurrentVideo(idx) + Player.playIdx(idx) + }, + playPrev: function () + { + d.warn("____________") + d.warn("PLAY PREV") + var idx = Player.currentIdx + do + { + idx = (idx + 1) % Player.queue.length + if (Player.queue[idx] === Player.video.key) + continue + } + while (Player.videos[ Player.queue[idx] ].error === true) + Player.queueJumpToCurrentVideo(idx) + Player.playIdx(idx) + }, + playKey: function (key) + { + Player.playVideo( Player.videos[key] ) + }, + playIdx: function (idx) + { + d.warn("play idx: "+idx) + Player.currentIdx = idx + Player.playVideo( Player.videos[Player.queue[idx]] ) + }, + throttle: function () + { + d.error("THROTTLED") + Player.stop() + Player.errors = 0 + }, + stop: function () + { + Player.projector.stop() + }, + playVideo: function (video) + { + if (! video) + { + d.error("GOT EMPTY VIDEO") + d.warn(Player.currentIdx) + d.warn(Player.queue[ Player.currentIdx ]) + d.warn(Player.videos[ Player.queue[ Player.currentIdx ] ]) + return + } + if (video.error === true) + { + Player.errors += 1 + d.error(video.key) + if (Player.errors > Player.queue.length) + return Player.throttle() + return Player.finish() + } + d.warn("PLAY VIDEO: "+video.key) + if (video.type !== Player.projector.type) + { + d.warn("SWITCHING PROJECTORS") + d.warn([Player.projector.type, video.type].join(" → ")) + Player.projector.unload() + Player.projector = Player.projectors[video.type] + Player.projector.load() + if (Player.muted) + Player.projector.setVolume(0) + } + video.seen = true + if (! Player.fullscreenMode) + { + $("#video-title").hide().html(video.title).fadeIn(100, function () { + setTimeout("$('#video-title').fadeOut(2000)", 4000) + }) + } + + Player.errors = 0 + Player.video = video + Player.projector.play(video) + Player.linkUpdate(video) + Player.currentIdx = video.idx + $("#queue li.playing").removeClass("playing") + $("#chat a.ytlink.playing").removeClass("playing") + $("#queue li").removeClass("playing") + $("li#queue_"+video.idx).addClass("playing") + $("#"+video.key).addClass("playing") + $("#"+video.key).html(video.title) + $("#like").removeClass("liked").html("LIKE") + $("#pause").html(PLAY_BUTTONS.pause) + if (Local.isLiked(video.id)) + { + $("#like").addClass("liked").html("LIKED") + } + }, + queueJumpToCurrentVideo: function (idx) + { + $("#playlist").scrollTop( $("li#queue_"+idx)[0].offsetTop - Player.playlistOffset ) + $("#queue").scrollTop( $("li#queue_"+idx)[0].offsetTop - Player.queueOffset ) + }, + toggle: function () + { + Player.projector.toggle() + }, + pause: function () + { + Player.projector.pause() + $("#pause").html(PLAY_BUTTONS.play) + }, + mute: function () + { + if (Player.projector) + { + if (Player.muted) + Player.projector.setVolume(100) + else + Player.projector.setVolume(0) + } + Player.muted = ! Player.muted + }, + muteClick: function () + { + if (Player.muted) + $("#mute").removeClass("muted") + else + $("#mute").addClass("muted") + Player.mute() + }, + prevClick: function () + { + d.act("+ clicked prev") + Player.playPrev() + }, + pauseClick: function () + { + d.act("+ clicked pause") + Player.errors = 0 + if (Player.projector.toggle()) + { + $("#pause").html(PLAY_BUTTONS.play) + d.warn("set to play") + } + else + { + $("#pause").html(PLAY_BUTTONS.pause) + d.warn("set to pause") + } + }, + nextClick: function () + { + d.act("+ clicked next") + Player.playNext() + }, + scanClick: function () + { + d.act("+ clicked scan") + Scanner.scan() + }, + likeClick: function () + { + d.act("+ clicked player like") + Like.likeVideo(Player.video) + }, + linkClick: function () + { + d.act("+ clicked permalink") + Player.pause() + }, + linkUpdate: function (video) + { + d.warn("UPDATING LINK") + $("#video-link").attr("href", video.src) + var vidurl = "http://scannerjammer.com/" + if (Room.name !== "main") + vidurl += Room.name+"/" + vidurl += "#v="+video.id + $("#sharebutton").attr("st_url", vidurl).attr("st_title", video.title) +/* + stWidget.addEntry({ + service: "sharethis", + element: document.getElementById("sharebutton"), + url: vidurl, + title: video.title, + summary: "ScannerJammer: Youtube video chat", + }) +*/ + }, + + fullscreenClick: function () + { + d.act("+ clicked fullscreen") + }, + setVolume: function (vol) + { + if (Player.projector && Player.projector.type !== 'null') + { + // alert(Player.projector.type) + Player.projector.setVolume(vol) + } + }, + init: function () + { + d.warn("PLAYER INIT") + $("#prev").html(PLAY_BUTTONS.prev) + $("#pause").html(PLAY_BUTTONS.play) + $("#next").html(PLAY_BUTTONS.next) + $("#prev").bind("click", Player.prevClick) + $("#pause").bind("click", Player.pauseClick) + $("#next").bind("click", Player.nextClick) + $("#scan").bind("click", Player.scanClick) + $("#like").bind("click", Player.likeClick) + $("#video-link").bind("click", Player.linkClick) + $("#fullscreen").bind("click", Viewport.fullscreenOn) + Player.projector = {type:"null",load:d.noop,unload:Youtube.unload,} + for (i in Player.projectors) + Player.projectors[i].init() + if (Player.queue.length > 0) + Player.currentIdx = Player.queue.length + Playlist.init() + } + } + +var Playlist = + { + count: 0, + showScores: false, + enqueue: function (videos) + { + if (! (videos instanceof Array)) + videos = [videos] + // d.warn("PLAYLIST ENQUEUE "+videos.length) + var rows = [] + var clickables = [] + for (i in videos) + { + var video = videos[i] + $("#"+video.key).html(video.title) + if (Player.enqueue(video)) + { + rows.push(Playlist.display(video)) + Playlist.count += 1 + } + } + $("#queue").prepend(rows.reverse().join("")) + }, + enqueueOldVideoFormat: function (videos) + { + // d.warn("ENQUEUING "+videos.length+" OLD FORMAT") + for (i in videos) + { + // 0 id 1 date 2 userid 3 user 4 url 5 title + var row = videos[i] + var video = + { + id: row[0], + date: row[1], + userid: row[2], + username: row[3], + src: row[4], + title: row[5] || '___', + seen: false, + error: false, + } + if (row.length > 6) + { + video.score = parseInt(row[6]) || 0 + // block video if it's a duplicate + } + var url = row[4] + if (url.indexOf("youtube.com") !== -1) + { + var ytid = Youtube.getYtid(url) + video.type = "youtube" + video.name = ytid + } + else if (url.indexOf("vimeo.com") !== -1) + { + var vimeoid = url.replace(VIMEOregexp, "$3") + video.type = "vimeo" + video.name = vimeoid + } + else if (url.indexOf("soundcloud.com") !== -1) + { + video.type = "soundcloud" + video.name = $.md5(video.src) + } + else if (url.indexOf("mp3") !== -1) + { + video.type = "audio" + video.name = $.md5(video.src) + } + else + { + d.error("bad video id in "+url) + continue + } + video.key = video.type + "_" + video.name + Playlist.enqueue(video) + // d.joy("GOT VIDEO: "+key) + } + }, + clickTitle: function (e) + { + var id = $(this).parent().attr("id") + var idx = id.substr(id.indexOf("_")+1) + d.act("+ clicked playlist "+idx) + Player.playIdx(parseInt(idx)) + }, + clickLike: function (e) + { + var id = $(this).parent().attr("id") + var idx = id.substr(id.indexOf("_")+1) + var videokey = Player.queue[idx] + var video = Player.videos[videokey] + d.act("+ clicked playlist like "+video.key) + Like.likeVideo(video) + }, + clickChatlink: function (e) + { + e.preventDefault() + var key = $(this).attr("id") + var video = Player.videos[key] + d.act("+ clicked link "+video.key) + Player.playVideo(video) + }, + display: function (video) + { + var likeClass = '' + var likeWord = " like" + if (video.username === Auth.username) + { + likeClass = "you" + } + else if (Local.isLiked(video.id)) + { + likeClass = 'liked' + likeWord = 'liked' + } + var s = "<li id='queue_"+Playlist.count+"'>" + if (Playlist.showScores) + { + score = video.score + if (score < 1) + score = ' ' + s += "<span class='score' id='score_"+video.id+"'>"+score+"</span>" + } + s += "<span id='like_"+video.id+"' class='like "+likeClass+"'>"+likeWord+"</span>" + s += "<a class='user' href='/profile/"+video.username+"'>"+video.username+"</a>" + s += "<span class='title'>"+video.title+"</span>" + s += "</li>" + return s + }, + init: function () + { + d.warn("PLAYLIST INIT") + $("#queue li span.title").live("click", Playlist.clickTitle) + $("#queue li span.like").live("click", Playlist.clickLike) + $("#chat a.ytlink").live("click", Playlist.clickChatlink) + } + } + +var Scanner = + { + scanMode: false, + scanTimeout: false, + scanBlinkTimeout: false, + scanBlinkState: false, + scanBlinkRate: 200, + scanRate: 9000, + scanBlink: function () + { + if (Scanner.scanBlinkState) + { + $("#scan").addClass("blinkOff") + $("#scan").removeClass("blinkOn") + Scanner.scanBlinkState = false + } + else + { + $("#scan").addClass("blinkOn") + $("#scan").removeClass("blinkOff") + Scanner.scanBlinkState = true + } + Scanner.scanBlinkTimeout = setTimeout(Scanner.scanBlink, Scanner.scanBlinkRate) + }, + scanGo: function () + { + Player.playNext() + Scanner.scanTimeout = setTimeout(Scanner.scanGo, Scanner.scanRate) + }, + scan: function () + { + if (Scanner.scanMode) + { + d.warn("SCANNER ON") + Scanner.scanMode = false + clearTimeout(Scanner.scanTimeout) + clearTimeout(Scanner.scanBlinkTimeout) + $("#scan").removeClass("blinkOn") + $("#scan").removeClass("blinkOff") + } + else + { + d.warn("SCANNER OFF") + Scanner.scanMode = true + Scanner.scanBlink() + Scanner.scanGo() + } + } + } diff --git a/frontend/static/js/poll.js b/frontend/static/js/poll.js new file mode 100644 index 0000000..01f480b --- /dev/null +++ b/frontend/static/js/poll.js @@ -0,0 +1,53 @@ +var Poll = + { + room: "main", + delay: 5000, + init: function () + { + if (document.cookie) + { + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("room") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Poll.room = cookie[1] + break + } + } + } + } + Poll.poll() + }, + poll: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + } + } +var Main = + { + init: function () + { + Auth.success = Poll.init + if (Auth.init()) + Auth.checkin() + } + } +Main.init() + diff --git a/frontend/static/js/profile.js b/frontend/static/js/profile.js new file mode 100644 index 0000000..6005e79 --- /dev/null +++ b/frontend/static/js/profile.js @@ -0,0 +1,540 @@ +var Keyboard = + { + altMode: false, + fullscreenKeys: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenOff() + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.toggle() + if (kc === 76) + Player.likeClick() + return false + }, + standardKeys: function (event) + { + kc = event.keyCode + if (kc === 91) + { + Keyboard.altMode = true + return true + } + if (kc === 27) + { + Viewport.fullscreenOn() + return false + } + if (kc === 37 || kc === 177) + { + Player.playPrev() + return false + } + else if (kc === 39 || kc === 176) + { + Player.playNext() + return false + } + if (! Menu.isOpen && ! Keyboard.altMode && kc === 76) + { + Player.likeClick() + return false + } + if (kc === 32 || kc === 179) + { + Player.toggle() + return false + } + Keyboard.altMode = false + return true + } + } +var Viewport = + { + fullscreenMode: false, + fullscreenOn: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls").hide() + $("#settings-container").hide() + $(window).unbind("resize") + $(window).bind("resize", Viewport.fullscreenResize) + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.fullscreenKeys) + // 1) HIDDEN + // $("body").css("overflow-y", "hidden") + d.scrollToTop("body") + Viewport.fullscreenResize() + Viewport.fullscreenMode = true + // $("#fullscreen").unbind("click") + // $("#fullscreen").bind("click", Viewport.fullscreenOff) + $("#fullscreen-warning").show().fadeOut(3000) + $("#video-title").addClass("fullscreen") + }, + fullscreenResize: function () + { + // 2) FIXED + // $("#projector").css({ position: 'fixed', top: 0, left: 0, width: $(window).width(), height: $(window).height() }) + $("#player").css({ top: 0, left: 0, width: $(window).width(), height: $(window).height() }) + $("#screen,#ytscreen").css({ width: $(window).width(), height: $(window).height() }) + }, + fullscreenOff: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls").show() + // $("body").css("overflow-y", "scroll") + $(window).unbind("resize") + $(window).bind("resize", Viewport.standardResize) + Viewport.standardResize() + Viewport.fullscreenMode = false + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.standardKeys) + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Viewport.fullscreenOn) + $("#video-title").removeClass("fullscreen") + }, + standardResize: function () + { + var w = $(window).width() + var h = $(window).height() + var contact = w * 200 / 1425 + var ytw = (w-contact-40)*4/7 + var yth = ytw * 9/16 + var plw = (w-contact-40)*3/7 + + $("#contact img").css("max-width", contact) + var conheight = $("#controls").height() + var contactheight = $("#contact").height() + var qheight = Math.max(yth+conheight+40, h - 94 - 60) // Math.max(yth+conheight+40, contactheight) + + $("#playlist").css("top", 94).css("left", contact+40) + $("#playlist,#playlistbg").css("width", plw-20) + $("#playlist,#playlistbg").css("height", qheight) + $("#queue").css("height", qheight) + var queuetop = $("#queue").offset().top + $("#playlistbg").css("top", queuetop).css("left", contact+40) + + $("#contact").css("width", contact).css("top", 94).css("left", 20) + + $("#projector").css({ position: 'absolute', }) + $("#player").css("height", yth+conheight+10) + $("#player").css("top", queuetop).css("left", plw+contact+40) + $("#projector").css("left", 0) + $("#player,#projector,#screen,#ytscreen").width(ytw-40) + $("#projector,#screen,#ytscreen").height(yth) + + $("#controls").css({ position: 'absolute', top: yth+20, bottom: 'auto', right: 'auto', }) + + $("#gif-container").css("top", qheight+30+134) + }, + focus: function () + { + d.warn("VIEWPORT FOCUS") + // if (! Viewport.fullscreenMode || Viewport.fullscreenInterface) + // Keyboard.focusTextarea() + document.body.tabIndex = 0 + document.body.focus() + Viewport.focused = true + // Chat.delay = 1000 + // if (Like.pending) + // Like.fire() + // Chat.delay = Chat.delayShort + }, + blur: function () + { + d.warn("VIEWPORT BLUR") + Viewport.focused = false + // Chat.delay = Chat.delayLong + } + } +var Room = + { + load: function () + { + Settings.open() + } + } +var Settings = + { + bio: "", + data: {}, + eventSet: false, + defaults: + { + avatar: "http://scannerjammer.com/img/runner.gif", + bg: "http://scannerjammer.com/bgz/scannerjammer_cyberspace.jpg", + }, + open: function () + { + if (parseInt(Auth.userid) !== userProfile[0]) + return + $("#settings-hook").show() + $("#profile-avatar").val(Settings.data.avatar) + $("#profile-bg").val(Settings.data.bg) + $("#profile-bio").html(Settings.bio) + if (! Profile.eventSet) + { + $("#profile-settings-save").bind("click", Settings.save) + Profile.eventSet = true + } + }, + save: function () + { + d.warn("saving profile") + var avatar = d.sanitize( $("#profile-avatar").val() ) + Settings.data.avatar = avatar + var bg = d.sanitize( $("#profile-bg").val() ) + Settings.data.bg = bg + var bio = d.sanitizeWithNewlines( $("#profile-bio").val() ) + Settings.bio = bio + Settings.load() + var s = "avatar\t"+avatar+"\n" + s += "bg\t"+bg+"\n" + var data = { + userid: userProfile[0], + settings: s, + bio: bio, + session: Auth.session, + } + $.post(API.URL.user.settings, data).success(Settings.saveCallback).error(Settings.errorCallback) + }, + errorCallback: function (raw) + { + }, + saveCallback: function (raw) + { + Menu.settings.close() + }, + load: function () + { + if (Settings.data.avatar.indexOf("http://") === 0) + $(".avatar").attr("src", Settings.data.avatar).show() + else + $(".avatar").hide() + if (Settings.data.bg.indexOf("http://") === 0) + { + $("#bg img").attr("src", Settings.data.bg) + $("#bg").show() + } + else + $("#bg").hide() + var bio = '' + if (! Settings.bio.length) + { + bio = "<img src='/img/playlist.gif' />" + } + var lines = d.trim( Settings.bio ).split("\n") + for (i in lines) + { + if (lines[i].length === 0) + continue + var s = Chat.parseWords(lines[i]) + if (s.indexOf("<img") !== -1) + bio += s + else + bio += "<p>"+s+"</p>" + } + $("#bio").html(bio) + Settings.open() + Viewport.standardResize() + }, + init: function () + { + if (userProfile[6]) + { + Settings.bio = userProfile[6] + } + if (userProfile[7]) + { + var lines = userProfile[7].split("\n") + for (i in lines) + { + var pair = lines[i].split("\t") + Settings.data[pair[0]] = pair[1] + } + } + for (i in Settings.defaults) + { + if (! (i in Settings.data)) + Settings.data[i] = Settings.defaults[i] + } + Settings.load() + } + } +function menu (key, loadCallback) + { + d.warn("MENU INIT "+key) + this.show = function () + { + if (! Menu.isOpen) + { + $("#"+key+"-container").show() + Menu.current = key + loadCallback() + } + } + this.hide = function () + { + if (! Menu.isOpen) + $("#"+key+"-container").hide() + } + this.close = function () + { + $("#"+key+"-container").hide() + $(".opened").removeClass("opened") + Menu.isOpen = false + } + this.click = function () + { + for (i in Menu.keys) + { + $("#"+Menu.keys[i]+"-container").hide() + } + $("#"+key+"-container").show() + if (Menu.current !== key) + loadCallback() + Menu.current = key + $(".opened").removeClass("opened") + $("#"+key+"-hook").addClass("opened") + Menu.isOpen = true + } + $("#"+key+"-hook").hover(this.show, this.hide).click(this.click) + $("#"+key+"-close").click(this.close) + $("#"+key+"-container").hover(this.click, function(){}) + } +var Menu = + { + isOpen: false, + current: false, + keys: ["settings"], + close: function () + { + if (Menu.current) + Menu[Menu.current].close() + }, + settings: new menu("settings", Settings.open) + } +var Profile = + { + mode: false, + page: 0, + pages: [], + loadMore: function () + { + var api = "" + // console.log(Profile.mode) + if (Profile.mode === "user") + api = API.URL.user.videos + else if (Profile.mode === "like") + api = API.URL.user.likes + else + return + var data = + { + user: userProfile[1], + start: Player.videos[Player.queue[0]].date, + } + d.scrollToTop(window) + $("#queueMore").unbind("click") + $("#queue").html("<li id='queueLoading'>LOADING<br/><img src='/img/loading2.gif'/></li>") + $.post(api, data).success(Profile.loadMoreCallback) + }, + loadMoreCallback: function (raw) + { + var lines = API.parse("/user/load", raw) + if (! lines) return + if (lines[0].indexOf("0\t") === 0) + return // console.log(lines.split("\t")[1]) + queue = [] + for (i in lines) + { + if (lines[i].length < 2) + continue + line = lines[i].split("\t") + queue.push(line) + } + Profile.page += 1 + Profile.pages[Profile.page] = queue + Profile.loadQueue(queue) + $("#queue").prepend("<li id='queueLess'>Go Back</li>") + $("#queueLess").unbind("click") + $("#queueLess").bind("click", Profile.loadLess) + if (queue.length < 50) + $("#queue").append("<li id='queueDone'>That's all the videos!</li>") + }, + loadLess: function () + { + Profile.page -= 1 + Profile.loadQueue(Profile.pages[Profile.page]) + if (Profile.page !== 0) + { + $("#queue").prepend("<li id='queueLess'>Go Back</li>") + $("#queueLess").unbind("click") + $("#queueLess").bind("click", Profile.loadLess) + return + } + }, + loadQueue: function (queue) + { + if (! queue || ! queue.length) + return + Player.clearQueue() + $("#queueMore").unbind("click") + $("#queue").html("") + Playlist.enqueueOldVideoFormat(queue) + d.scrollToTop("#queue") + if (Profile.mode !== "top") + { + if (queue.length > 49) + { + $("#queue").append("<li id='queueMore'>Load More Videos</li>") + $("#queueMore").bind("click", Profile.loadMore) + } + } + }, + loadLikeQueue: function () + { + if (Profile.mode === "like") + return + Profile.page = 0 + Profile.pages = [likeVideoQueue] + Profile.mode = "like" + $(".mode").removeClass("mode") + $("#likeQueue").addClass("mode") + Profile.loadQueue(likeVideoQueue) + }, + loadTopQueue: function () + { + if (Profile.mode === "top") + return + Profile.mode = "top" + $(".mode").removeClass("mode") + $("#topQueue").addClass("mode") + Profile.loadQueue(topVideoQueue) + }, + loadUserQueue: function () + { + if (Profile.mode === "user") + return + Profile.page = 0 + Profile.pages = [userVideoQueue] + Profile.mode = "user" + $(".mode").removeClass("mode") + $("#userQueue").addClass("mode") + Profile.loadQueue(userVideoQueue) + }, + loadImages: function () + { + var lastDate = imageQueue[0][0] + var bars = [] + var s = "" + + for (i in imageQueue) + { + img = imageQueue[i] + if (img[0] !== lastDate) + { + bars.push('<div>'+s+'</div>') + s = "" + lastDate = img[0] + } + s += '<img src="'+img[1]+'"/>' + } + bars.push('<div>'+s+'</div>') + $("#gifs").html(bars.join("")) + }, + init: function () + { + if (userVideoQueue && userVideoQueue.length && userVideoQueueTitle) + { + $("#queueLinks").append('<li id="userQueue">'+userVideoQueueTitle+'</li>') + $("#userQueue").bind("click", Profile.loadUserQueue) + } + if (likeVideoQueue && likeVideoQueue.length && likeVideoQueueTitle) + { + $("#queueLinks").append('<li id="likeQueue">'+likeVideoQueueTitle+'</li>') + $("#likeQueue").bind("click", Profile.loadLikeQueue) + likeVideoQueue.reverse() + } + if (topVideoQueue && topVideoQueue.length && topVideoQueueTitle) + { + $("#queueLinks").append('<li id="topQueue">'+topVideoQueueTitle+'</li>') + $("#topQueue").bind("click", Profile.loadTopQueue) + topVideoQueue.reverse() + } + if (userVideoQueue && userVideoQueue.length) + Profile.loadUserQueue() + else if (likeVideoQueue && likeVideoQueue.length) + Profile.loadLikeQueue() + // if (imageQueue && imageQueue.length) + // Profile.loadImages() + } + } +var Poll = + { + room: "main", + delay: 5000, + init: function () + { + if (document.cookie) + { + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("room") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Poll.room = cookie[1] + break + } + } + } + } + Poll.poll() + Settings.open() + }, + poll: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + } + } + +var Main = + { + init: function () + { + $(window).bind("focus", Viewport.focus) + $(window).bind("blur", Viewport.blur) + $(window).bind("resize", Viewport.standardResize) + $(window).bind("keydown", Keyboard.standardKeys) + Playlist.showScores = true + Auth.success = Poll.init + if (Auth.init()) + Auth.checkin() + Profile.init() + Player.init() + Settings.init() + $("#controls").fadeIn(2000) + $("#contact").fadeIn(2000) + setTimeout('Viewport.standardResize()', 1000) + } + } +Main.init() + diff --git a/frontend/static/js/register.js b/frontend/static/js/register.js new file mode 100644 index 0000000..24e8fa0 --- /dev/null +++ b/frontend/static/js/register.js @@ -0,0 +1,292 @@ +function warn (s) + { + $('#msg').append(s+"<br/>") + scrollToBottom('#msg') + } +function scrollToTop (div) + { $(div).scrollTop( 0 ) } +function scrollToBottom (div) + { $(div).scrollTop( $(div)[0].scrollHeight ) } +function trim (s) + { if (s) { return s.replace(/^\s+|\s+$/g,"") } else { return s } } +function supports_html5_storage () + { + try + { return 'localStorage' in window && window['localStorage'] !== null; } + catch (e) + { return false } + } +function noop() { return false } +var API = + { + HEADER: "#@scanjam 0.2", + LIKE_STRING: "like", + HAS_LOCAL_STORAGE: supports_html5_storage(), + BASE_URL: "http://scannerjammer.com:19898", + URL: + { + auth: + { + register: "/api/auth/register", + available: "/api/auth/available", + login: "/api/auth/login", + logout: "/api/auth/logout", + }, + room: + { + join: "/api/room/join", + poll: "/api/room/poll", + say: "/api/room/say", + }, + video: + { + like: "/api/video/like", + unlike: "/api/video/unlike", + }, + }, + parse: function (api,raw) + { + if (! raw) + { warn(api+": no result"); return false } + var lines = raw.split("\n") + if (lines.shift() !== API.HEADER) + { warn(api+": no header"); return false } + if (! lines.length) + { warn(api+": no content"); return false } + return lines + }, + init: function () + { + for (type in API.URL) + { + for (name in API.URL[type]) + { + API.URL[type][name] = API.BASE_URL + API.URL[type][name] + } + } + }, + } +var Local = API.HAS_LOCAL_STORAGE ? + { + getOrSet: function (key, value) + { + if (value) + localStorage["scanjam."+key] = value + else + return localStorage.getItem("scanjam."+key) + }, + userid: function (id) + { return Local.getOrSet("userid", id) }, + username: function (name) + { return Local.getOrSet("username", name) }, + isLiked: function (videoid) + { return localStorage.getItem("scanjam.like."+videoid) === "true" }, + unlike: function (videoid) + { localStorage["scanjam.like."+videoid] = false }, + like: function (videoid) + { localStorage["scanjam.like."+videoid] = true }, + } : { isLiked: noop, unlike: noop, like: noop, getOrSet: noop, username: noop, userid: noop, } +var Register = + { + userok: false, + pwok: false, + username: false, + pwtimeout: false, + activated: false, + submit: function () + { + if (! Register.userok || ! Register.pwok) + return + $("#register-go").unbind("click") + var username = $("#register-username").val() + var password = $("#register-pw2").val() + var pwhash = $.md5("scanjam"+password) + Register.username = username + var data = + { + 'username': username, + 'password': pwhash, + } + $("#success-username").html(username) + $.post(API.URL.auth.register, data).success(Register.submitCallback).error(Register.errorCallback) + }, + errorCallback: function (raw) + { + Register.error("#username-available","weird problem, err try again") + Register.error("#password-match", "") + Register.deactivateGoButton() + Register.activateGoButton() + return + }, + submitCallback: function (raw) + { + lines = API.parse("/api/register",raw) + if (! lines || lines[0] !== "OK") + return Register.errorCallback() + var u = lines[1].split("\t") + Local.userid(u[0]) + Local.username(u[1]) + document.cookie = "session="+u[2]+";path=/;domain=.scannerjammer.com;max-age=1086400" + + $("#register").fadeOut(1000, function () + { + $("#success").fadeIn(1000, function() + { + $("#bg").fadeIn(700, 'linear') + }) + }) + }, + checkPassword: function () + { + var pw1 = $("#register-pw").val() + var pw2 = $("#register-pw2").val() + if (! pw1 && ! pw2) + return + if (pw1 && ! pw2) + return + if (pw1 !== pw2) + { + Register.error("#password-match", "passwords don't match..") + Register.pwok = false + return + } + $("#password-match").removeClass("error") + $("#password-match").html("passwords match!") + Register.pwok = true + if (Register.userok) + Register.activateGoButton() + }, + deactivateGoButton: function () + { + $("#register-go").css("color", "#000") + $("#register-go").animate({opacity: 0.2}, 500) + Register.activated = false + }, + activateGoButton: function () + { + $("#register-go").css("color", "#00f") + $("#register-go").animate({opacity: 1.0}, 500) + if (! Register.activated) + { + Register.activated = true + $("#register-go").bind("click", Register.submit) + } + }, + error: function (id, msg) + { + $(id).addClass("error") + $(id).html(msg) + Register.deactivateGoButton() + }, + checkAvailability: function () + { + var isalphanumeric = /^[a-zA-Z0-9]+$/ + var username = $("#register-username").val() + if (! username) + { + Register.error("#username-available", "please enter a username..") + Register.userok = false + return + } + if (isalphanumeric.test(username) === false) + { + Register.error("#username-available", "just letters/numbers plz..") + Register.userok = false + return + } + $.post(API.URL.auth.available, {'username':username}, Register.checkAvailabilityCallback) + }, + checkAvailabilityCallback: function (raw) + { + lines = API.parse("/user/register", raw) + if (! lines || lines[0] !== "OK") + { + alert(raw) + Register.error("#username-available", "name already taken..") + Register.userok = false + return + } + $("#username-available").removeClass("error") + $("#username-available").html("available!") + Register.userok = true + if (Register.pwok) + Register.activateGoButton() + }, + usernameUpdate: function (event) + { + Register.userok = false + return true + }, + pwUpdate: function (event) + { + // if (event.keyCode === 13) + // { + // Register.submit() + // return false + // } + if (Register.pwtimeout) + clearTimeout(Register.pwtimeout) + Register.pwtimeout = setTimeout(Register.checkPassword, 100) + return true + }, + init: function () + { + $("#register-username").val("") + $("#register-pw").val("") + $("#register-pw2").val("") + $("#register-username").bind("blur", Register.checkAvailability) + $("#register-pw2").bind("blur", Register.checkPassword) + $("#register-username").bind("keydown", Register.usernameUpdate) + $("#register-pw").bind("keydown", Register.pwUpdate) + $("#register-pw2").bind("keydown", Register.pwUpdate) + $("#register").fadeIn(1000, function () + { + $("#plant").fadeIn(1000) + }) + $("#register-username").focus() + }, + } +var Main = + { + roomName: false, + enter: false, + resize: function () + { + var w = $(window).width() + var h = $(window).height() + + $("#bg img").css("width", w) + $("#bg img").css("height", h) + + $("#msg").css("max-height", h-130) + }, + kp: function (event) + { + if (event.keyCode === 13) + { + if (Main.enter) + Main.enter() + return false + } + return true + }, + init: function () + { + warn("INIT") + $("#msg").hide() + + $(window).resize(Main.resize) + Main.resize() + + API.init() + $(window).load(Register.init) + + if (window.location.hash) + { + Main.roomName = window.location.hash.replace("#","") + $("#sj-link").attr("href", "/"+Main.roomName+"/") + } + }, + } +Main.init() + diff --git a/frontend/static/js/room.js b/frontend/static/js/room.js new file mode 100644 index 0000000..48924d9 --- /dev/null +++ b/frontend/static/js/room.js @@ -0,0 +1,459 @@ +var Menu = {} +var Room = + { + loaded: false, + ops: {}, + settings: {}, + settingsButtonBound: false, + updateSettingMethods: + { + bg: function (url) + { + if (url === Room.settings.bg) + return + d.warn("clearing bg") + $("#bg").fadeOut(500, function () + { + if (url) + { + d.warn("updating bg to "+url) + $("#bg img").attr('src', url).bind("load", function(){$("#bg").fadeIn(2000);d.warn("bg updated")}) + } + }) + }, + title: function (s) + { + if (s.length === 0) + s = " " + $("#heading").html( s.replace(">",">").replace("<","<") ) + }, + topic: function (s) + { + if (s.length === 0) + s = " " + $("#topic").html( d.linkify(s.replace(">",">").replace("<","<")) ) + }, + phase: function (s) + { + if (s === 'light') + { + // turn on lookit stylesheet + } + else + { + // turn off lookit stylesheet + } + }, + bgcolor: function (s) + { + if (s) + $('body').css("background-color", s) + } + }, + updateSetting: function (k, v) + { + d.warn( "update setting: "+k ) + $("room-"+k).val(v) + if (k in Room.updateSettingMethods) + var f = Room.updateSettingMethods[k](v) + Room.settings[k] = v + }, + settingsOpen: function () + { + d.warn("ROOM SETTINGS LOAD") + $("#room-id").html(Room.id) + $("#room-name").html(Room.name) + $("#room-path").html(Room.path) + $("#room-title").val(Room.settings['title']) + $("#room-topic").val(Room.settings['topic']) + $("#room-phase").val(Room.settings['phase']) + $("#room-bg").val(Room.settings['bg']) + $("#room-bgcolor").val(Room.settings['bgcolor']) + $("#room-plant").val(Room.settings['plant']) + $("#room-flower").val(Room.settings['flower']) + $("#room-updater").html(Room.settings['updater']) + if (! Room.settingsButtonBound) + { + Room.settingsButtonBound = true + $("#room-settings-save").bind("click", Room.settingsSaveClick) + } + $("#room-settings-unload").bind("click", Room.settingsClose) + if (Auth.access > 0) + $("#room-mod-tag").html("<a href='/"+Room.name+"/admin'>Moderate room</a>") + else + $("#room-mod-tag").html("") + d.warn("LOADED") + }, + settingsClose: function () + { + d.warn("ROOM SETTINGS UNLOAD") + Room.settingsButtonBound = false + $("#room-settings-save").unbind("click") + }, + settingsKeys: ["title","topic","bg"], + last_bg: "", + settingsSaveClick: function () + { + $("#room-settings-save").unbind("click") + var set = [] + if (Room.ops !== false) + { + if (Auth.access < 1 && !(Auth.username in Room.ops)) + { + Menu.settings.close() + return + } + } + Room.last_bg = Room.settingsKeys['bg'] + for (i in Room.settingsKeys) + { + var k = Room.settingsKeys[i] + var v = d.sanitize( $("#room-"+k).val() ) + Room.updateSetting(k, v) + set.push(k+"\t"+v) + } + set.push("updater\t"+Auth.username) + var s = set.join("\n") + $.post(API.URL.room.settings, {room: Room.name, session: Auth.session, settings: s}, Room.settingsCallback) + Menu.settings.close() + }, + settingsCallback: function (raw) + { + var lines = API.parse("/room/say", raw) + if (! lines) + return + if (lines[0].indexOf("OK") !== -1) + { + d.warn("settings updated: "+lines.shift()) + $("#room-updater").hide().html("you!").fadeIn(500) + } + else if (lines[0].indexOf("BG_SIZE") !== -1) + { + var partz = lines[0].split("\t") + setTimeout('Room.updateSettingMethods.bg(Room.last_bg)', 2000) + alert("Background too large!\n\nYour image: "+ partz[2]+" bytes\nMax size: " + partz[3] + " bytes") + } + else if (lines[0].indexOf("BG_DATA") !== -1) + { + setTimeout('Room.updateSettingMethods.bg(Room.last_bg)', 2000) + alert("Unable to retrieve background image") + } + $("#room-settings-save").bind("click", Room.settingsSaveClick) + }, + connect: function () + { + var videoKey = '' + var hash = document.location.hash + if (hash.indexOf("#") !== -1) + hash = hash.substr(1) + var partz = hash.split("&") + for (i in partz) + { + var pair = partz[i].split("=") + if (pair[0] === "v") + videoKey = pair[1] + } + d.warn("JOINING ROOM "+Room.name) + $.ajax({ + type: 'POST', + url: API.URL.room.join, + data: {'room':Room.name,'session':Auth.session,'enqueue':videoKey}, + timeout: 2000, + }).success(Room.joinCallback).error(Room.joinErrorCallback) + }, + joinErrorCallback: function (jqXHR, textStatus, errorThrown) + { + d.warn("JOIN ERROR") + if (Room.loaded) + return + if (textStatus === "timeout") + Room.connect() + else + Auth.load() + }, + joinCallback: function (raw) + { + var lines = API.parse("/room/join", raw) + if (!lines){ + d.error("UNABLE TO LOAD ROOM"); + setTimeout(Room.load, 500); + return; + } + var u = lines.shift().split("\t") + + if (u[0] === '0') + return Auth.load() + d.warn("JOINED ROOM") + Auth.unload() + Auth.userid = u[0] + Auth.username = u[1] + Auth.access = u[2] + d.joy("logged in as "+Auth.username) + + Lastlog.update(lines.shift()) + Chat.store(lines) + + d.warn("__________") + d.warn("__________") + d.warn("__________") + Room.load() + d.warn("__________") + d.warn("__________") + d.warn("__________") + }, + load: function () + { + d.warn("LOAD ROOM") + $("#loading").fadeOut(500, function() + { + Background.load() + Player.init() + VideoChat.init() + Chat.poll() + }) + $("#loading").fadeOut(1500, Room.loadFinish) + }, + loadFinish: function () + { + setTimeout("d.scrollToBottom('#chat')", 500) + $("#logo").show() + $("#logobg,#logobar").show() + $("#likebutton").css("display", "inline-block") + + $("#player").show() + $("#playlist").show() + $("#playlistbg").show() + + $("#form").show() + $("#formbg").show() + $("#chat").fadeIn(200) + d.scrollToBottom("#chat") + $("#chatbg").show() + $("#lastlogbox").show() + $("#lastlogbg").show() + + Keyboard.enter = Chat.say + $("#chat-message").bind("focus", Keyboard.focusTextarea) + $("#chat-message").bind("blur", Keyboard.blurTextarea) + $("#chat-message").focus() + Keyboard.focusTextarea() + $("#chat-send").bind("click", Chat.say) + $("#fullscreen").bind("click", Viewport.fullscreenOn) + $("#sitez").show() + $("#logout").click(Auth.logout) + if (Room.name === "feederbleeder") + { + $("#heading").css({ "color": "#ff3333" }) + // Viewport.fullscreenOn() + } + //else + Viewport.standardResize() + // $(".ytlink").live("click", Player.ytLinkClick, false) + + if (Auth.access > 0) + { + // var div = $("<div>").addClass("modhello").html("Congratulations new moderator! Click on the cube icon in the upper right corner and you will see the MODERATE ROOM link.").click(function(){$(this).fadeOut(1000)}) + // $("#chat").append(div) + } + // var div = $("<div>").addClass("modhello").html("Hey! You can now use the LEFT AND RIGHT ARROW KEYS to browse the playlist, and the L key to like a video!").click(function(){$(this).fadeOut(1000)}) + // $("#chat").append(div) + setTimeout(Player.start, 2000) + Room.loaded = true + document.cookie = "room="+Room.name+";path=/;domain=.scannerjammer.com;max-age=86400" + if (Room.loadCallback) + Room.loadCallback() + }, + loadCallback: false, + unload: function () + { + $("#logo,#logobg,#player,#playlist,#playlistbg,#form,#formbg,#chat,#chatbg,#lastlogbox,#lastlogbg,#sitez").hide() + Menu.close() + }, + init: function () + { + d.warn("INIT ROOM") + if (roomName !== undefined) + Room.name = roomName + else + Room.name = "main" + d.warn("room: "+Room.name) + // $("#chat").show() + } + } + +var Rooms = + { + loaded: false, + queue: [ + [0, "rooms", "/", "http://scannerjammer.com/bgz/gridzy9.jpg", "<span style='color: #fff;'>→ SEE ALL <span style='text-decoration: underline;'>OPEN ROOMS</span></span>"], + [1, "main", "/main", "http://scannerjammer.com/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif", "MAIN ROOM"], + [12, "FEEDERBLEEDER", "/feederbleeder", "http://scannerjammer.com/img/Tropic_Of_Cancer__The_Sorrow_Of_Two_Blooms_1308602037.jpg", "FEEDERBLEEDER"], + [2, "avatar", "/avatar", "http://scannerjammer.com/img/avatar2.png", "avatar"], + [3, "glitter", "/glitter", "http://scannerjammer.com/bgz/argus.gif", "glitter"], + [10, 'jono', '/jonomilo', 'http://scannerjammer.com/bgz/whitesquare.gif', 'jònò mì lò'], + //[11, 'SJD', 'http://lolz.biz/sjd', 'http://scannerjammer.com/img/idgiguy2.png', 'SJD'], + [4, "waterfall", "/waterfall", "http://i.imgur.com/QEZRF.gif", "waterfall"], + ], + list: function () + { + if (Rooms.loaded) + return + Rooms.listDisplay(Rooms.queue) + // $.post(API.URL.room.list, {session:Auth.session}).success(Rooms.listCallback).error(Rooms.listError) + }, + listCallback: function (raw) + { + // parse API + Rooms.listDisplay(lines) + }, + listError: function () + { + Rooms.listDisplay(Rooms.queue) + }, + listDisplay: function (rooms) + { + $("#rooms-loading").hide() + var divz = [] + for (i in rooms) + { + var r = rooms[i] + var s = "<a href='"+r[2]+"'><li style='background-image: url("+r[3]+")'>"+r[4] + if (r[1] === Room.name) + s += " < YOU ARE HERE" + s += "</li></a>" + divz.push(s) + } + $("#rooms-list").html(divz.join('')) + Rooms.loaded = true + } + } +var About = + { + loaded: false, + init: function () + { + $("#your-profile").attr('href', 'http://scannerjammer.com/profile/'+Auth.username) + About.loaded = true + } + } +function menu (key, loadCallback) + { + d.warn("MENU INIT "+key) + this.appear = function () + { + if (! Menu.isOpen) + { + $("#"+key+"-container").show() + Menu.current = key + loadCallback() + $("#chat-message").blur() + Keyboard.blurTextarea() + } + } + this.disappear = function () + { + if (! Menu.isOpen) + $("#"+key+"-container").hide() + } + this.close = function () + { + $("#"+key+"-container").hide() + $(".opened").removeClass("opened") + Menu.isOpen = false + } + this.click = function () + { + for (i in Menu.keys) + { + $("#"+Menu.keys[i]+"-container").hide() + } + $("#"+key+"-container").show() + if (Menu.current !== key) + loadCallback() + Menu.current = key + $(".opened").removeClass("opened") + $("#"+key+"-hook").addClass("opened") + Menu.isOpen = true + } + $("#"+key+"-hook").hover(this.appear, this.disappear).click(this.click) + $("#"+key+"-close").click(this.close) + $("#"+key+"-container").hover(this.click, this.close) + } +var VideoChat = + { + isOpen: false, + badgePositioned: false, + suppressBadge: 0, + updateCount: function (count) + { + /* + if (VideoChat.suppressBadge > 0) + { + VideoChat.suppressBadge -= 1 + return + } + */ + if (parseInt(count) > 0) + { + if (! VideoChat.badgePositioned) + { + VideoChat.badgePositioned = true + $("#videochat-badge").css({ + right: 5, + top: 5, + }).show() + } + $("#videochat-badge").html(count).show() + } + else + { + $("#videochat-badge").hide() + } + }, + open: function () + { + // $("#tokbox-embed").html('<iframe id="tokbox-embedded" src="http://scannerjammer.com/tokbox/" style="border:none"></iframe>') + // $("#tokbox-embed").show() + // $(window).trigger('resize') + VideoChat.isOpen = true + // Webcam.load() + Tokbox.load() + }, + close: function () + { + // $("#tokbox-embed").hide().html("") + // $("#tokbox-close").hide() + // $(window).trigger('resize') + VideoChat.isOpen = false + VideoChat.suppressBadge = 20 + // Webcam.unload() + Tokbox.unload() + }, + toggle: function () + { + if (VideoChat.isOpen) + VideoChat.close() + else + VideoChat.open() + }, + init: function () + { + // Webcam.init() + $("#tokbox").show() + $("#videochat-toggle").click(VideoChat.toggle) + } + } +var Menu = + { + isOpen: false, + current: false, + keys: ["settings","about","rooms"], + close: function () + { + if (Menu.current) + Menu[Menu.current].close() + }, + settings: new menu("settings", Room.settingsOpen), + rooms: new menu("rooms", Rooms.list), + about: new menu("about", About.init), + } diff --git a/frontend/static/js/roomlist.js b/frontend/static/js/roomlist.js new file mode 100644 index 0000000..1b6c6d8 --- /dev/null +++ b/frontend/static/js/roomlist.js @@ -0,0 +1,166 @@ +var Keyboard = + { + enter: false, + textareaMap: function (event) + { + var kc = event.keyCode + if (kc === 13) + { + if (Keyboard.enter) + Keyboard.enter() + return false + } + return true + }, + } +var Poll = + { + room: "main", + delay: 5000, + init: function () + { + if (document.cookie) + { + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("room") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Poll.room = cookie[1] + break + } + } + } + } + Poll.poll() + }, + poll: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + } +var Roomlist = + { + minwidth: 200, + width: 200, + list: function () + { + var roomz = {} + var keys = [] + var sorted = [] + var presortOrder = + [ + "main", + "nightschool", + "waterfall", + "feederbleeder", + "diornights", + "classical", + "jonomilo", + "dump", + "tang", + "avatar", + "glitter", + "yhvh", + "los7angele55", + //"sjd", + "frederick", + "icons", + // "gorgeoustaps", "psychichandbook", + // "tense", + ] + var presortMap = {} + for (var i = 0; i < presortOrder.length; i++) + presortMap[presortOrder[i]] = true + //roomz['sjd'] = Roomlist.newRecord([0,"sjd",0,0,"http://scannerjammer.com/img/sjd.jpg"]) + for (var i = 0; i < ROOM_LIST.length; i++) + { + var row = ROOM_LIST[i] + if (row.length < 4) + continue + roomz[row[1]] = Roomlist.newRecord(row) + if (! (presortMap.hasOwnProperty(row[1]))) + keys.push(row[1]) + } + for (var i = 0; i < presortOrder.length; i++) + { + sorted.push(roomz[presortOrder[i]]) + } + for (i in keys.sort()) + { + // console.log(keys[i]) + sorted.push(roomz[keys[i]]) + } + $("#roomlist").html(sorted.join("")) + }, + newRecord: function (row) + { + var rotation = function(x) { + var pre = " -moz- -webkit- -o-".split(" "); + var r = ""; + var d = Math.floor(Math.random()*2 * x - x); + //console.log(d); + for (var i in pre) { + r += pre[i] + "transform:rotate(" + d + "deg);" + } + r += "\">"; + return r; + }; + //console.log(rotation); + var s = "" + //if (row[1] === "sjd") + // s += "<a href='http://lolz.biz/sjd/' class='roomdiv' style=\"width: "+Roomlist.width+"px;" + rotation(5); + if (row[1] === "main") + s += "<a href='/"+row[1]+"' class='roomdiv' style=\"width: "+Roomlist.width*2+"px;" + rotation(5); + else + s += "<a href='/"+row[1]+"' class='roomdiv' style=\"width: "+Roomlist.width+"px;" + rotation(5); + if (parseInt(row[3]) > 0) + s += "<span class='count'>" + row[3] + "</span>" + s += "<span class='roomname'>" + row[1] + "</span>" + s += "<div class=\"roombg\" style=\"background-image: url('"+row[4]+"'); " + rotation(5) + "</div>" + s += "</a>" + return s + }, + init: function () + { + if (Auth.loaded) + Auth.unload() + Poll.init() + }, + } +var Main = + { + resize: function () + { + var w = $(window).width() + var cols = 4 // Math.floor(w / Roomlist.minwidth) + Roomlist.width = Math.floor(w / cols) + }, + init: function () + { + $(window).resize(Main.resize) + Main.resize() + Roomlist.list() + Auth.success = Roomlist.init + if (! Auth.init()) + Auth.load() + }, + } +Main.init() + diff --git a/frontend/static/js/search.js b/frontend/static/js/search.js new file mode 100644 index 0000000..e644026 --- /dev/null +++ b/frontend/static/js/search.js @@ -0,0 +1,191 @@ +YOUTUBE_SEARCH_URL = "https://gdata.youtube.com/feeds/api/videos" +YOUTUBE_URL_PREFIX = "http://youtube.com/watch?v=" +function courtesy_s (quantity, noun) + { + if (quantity > 1) + return quantity + " " + noun + "s" + return quantity + " " + noun + } +var Search = + { + start: 0, + limit: 20, + sj: function () + { + Search.start = 0 + Search.terms = $("#search-terms").val() + Search.sjSearch (Search.terms, Search.start) + }, + sjSearch: function (terms, start) + { + var params = + { + "q": terms, + "start": Search.start, + "limit": Search.limit, + "session": Auth.session, + } + $.post(API.URL.video.search, params, Search.sjCallback) + $("#search-instructions").hide() + $("#search-results").html("").hide() + $("#search-loading").show() + $("#search-results-container").show() + }, + sjCallback: function (raw) + { + var lines = API.parse ("/video/search", raw) + var items = [] + for (var i = 0; i < lines.length; i++) + { + // 0 id 1 score 2 user 3 usercount 4 title 5 url 6 thumbnail + var line = lines[i].split("\t") + if (line.length < 7) + continue + var video = + { + url: line[5], + thumbnail: line[6], + title: line[4], + user: line[2], + quantify: "", + } + if (parseInt(line[3]) > 1) + video['user'] += " + " + courtesy_s (parseInt(line[3])-1, "other") + if (parseInt(line[1]) > 0) + video['quantify'] = courtesy_s (parseInt(line[1]), "like") + var tag = Search.resultTag (video) + items.push(tag) + } + if (items.length === Search.limit) + { + Search.start += Search.limit + $("#search-next-page").show() + } + else + { + $("#search-next-page").hide() + } + $("#search-loading").hide() + $("#search-results").html(items.join("")).show() + $("#search-instructions").show() + $("#curtain").bind("click", Search.close).css({"background-color": "transparent", "z-index": 99}).show() + }, + youtube: function () + { + var terms = $("#search-terms").val() + var params = + { + "q": terms, + "v": 2, + "alt": "jsonc", + } + $.get(YOUTUBE_SEARCH_URL, params, Search.youtubeCallback, "jsonp") + $("#search-results-container").show() + $("#search-results").html("").hide() + $("#search-loading").show() + }, + durationToString: function (duration) + { + return Math.floor(duration / 60) + ":" + (duration % 60) + }, + viewCountToString: function (viewCount) + { + if (! viewCount) + return '0' + var vc = viewCount.toString () + var commas = /(\d+)(\d{3})/; + while (commas.test(vc)) + { + vc = vc.replace(commas, '$1' + ',' + '$2'); + } + return vc + }, + resultTag: function (video) + { + var tag = "<li data-url='"+video['url']+"'>" + tag += "<div class='thumb' style='background-image: url(" + video['thumbnail'] + ")'></div>" + tag += "<h4>" + video['title'] + "</h4>" + tag += "<span class='metadata'>" + tag += video['user'] + tag += "<br/>" + tag += video['quantify'] + tag += "</span>" + tag += "<a href='"+video['url']+"' target='_blank' class='preview'>Preview</a>" + tag += "</li>" + return tag + }, + youtubeCallback: function (data) + { + var items = [] + for (var i = 0; i < data['data']['items'].length; i++) + { + var item = data['data']['items'][i] + var video = + { + url: YOUTUBE_URL_PREFIX+item['id'], + thumbnail: item['thumbnail']['sqDefault'], + title: item['title'], + user: item['uploader'], + quantify: Search.viewCountToString(item['viewCount']) + "views", + } + var tag = Search.resultTag (video) + items.push(tag) + } + $("#search-loading").hide() + $("#search-results").html(items.join("")).show() + }, + keydown: function (e) + { + if (e.keyCode === 13) + { + Search.sj () + } + if (e.keyCode === 27) + { + Search.close () + Keyboard.focusTextarea () + } + }, + nextPage: function () + { + Search.sjSearch (Search.terms, Search.start) + }, + loadResult: function () + { + var url = $(this).parent().data("url") + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: url}) + Search.close () + }, + close: function () + { + $("#curtain").unbind("click", Search.close).hide() + $("#search-results-container").hide() + $("#search-terms").val("") + }, + blurSearchTextarea: function () + { + $(window).unbind("keydown") + $("#chat-message").unbind("keydown").bind("keydown", Keyboard.textareaMap) + $("#chat-message").unbind("focus").focus().bind("focus", Keyboard.focusTextarea) + if ($("#chat-message").val().length === 0) + Keyboard.enteredText = false + }, + focusSearchTextarea: function () + { + $(window).unbind("keydown") + $("#chat-message").unbind("keydown") + }, + init: function () + { + $("#search-results li div").live("click", Search.loadResult) + $("#search-results li h4").live("click", Search.loadResult) + $("#search-results li span").live("click", Search.loadResult) + $("#search-terms").bind("keydown", Search.keydown) + $("#search-terms").bind("focus", Search.focusSearchTextarea) + $("#search-terms").bind("blur", Search.blurSearchTextarea) + // $("#search-terms").val("glock n my hand") + // Search.sj () + } + } +Search.init () + diff --git a/frontend/static/js/sj6.js b/frontend/static/js/sj6.js new file mode 100644 index 0000000..7da01a0 --- /dev/null +++ b/frontend/static/js/sj6.js @@ -0,0 +1,6505 @@ +/*! + * jQuery JavaScript Library v1.5.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Mar 31 15:28:23 2011 -0400 + */ +(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,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=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.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 e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(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(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,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"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.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?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){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,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.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]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),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]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.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!!k(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"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},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 b<c[3]-0},gt:function(a,b,c){return b>c[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=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||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=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":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=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=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(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.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:[]}},l.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&&(l.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 href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[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}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.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 k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},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 R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(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(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(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=d(arguments[0]);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,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.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 d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.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?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.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(!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 bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.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):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); + /** + * jQuery MD5 hash algorithm function + * + * <code> + * Calculate the md5 hash of a String + * String $.md5 ( String str ) + * </code> + * + * Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash. + * MD5 (Message-Digest algorithm 5) is a widely-used cryptographic hash function with a 128-bit hash value. MD5 has been employed in a wide variety of security applications, and is also commonly used to check the integrity of data. The generated hash is also non-reversable. Data cannot be retrieved from the message digest, the digest uniquely identifies the data. + * MD5 was developed by Professor Ronald L. Rivest in 1994. Its 128 bit (16 byte) message digest makes it a faster implementation than SHA-1. + * This script is used to process a variable length message into a fixed-length output of 128 bits using the MD5 algorithm. It is fully compatible with UTF-8 encoding. It is very useful when u want to transfer encrypted passwords over the internet. If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). + * This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin. + * + * Example + * Code + * <code> + * $.md5("I'm Persian."); + * </code> + * Result + * <code> + * "b8c901d0f02223f9761016cfff9d68df" + * </code> + * + * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com > + * @link http://www.semnanweb.com/jquery-plugin/md5.html + * @see http://www.webtoolkit.info/ + * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License] + * @param {jQuery} {md5:function(string)) + * @return string + */ + + (function($){ + + var rotateLeft = function(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); + } + + var addUnsigned = function(lX, lY) { + var lX4, lY4, lX8, lY8, lResult; + lX8 = (lX & 0x80000000); + lY8 = (lY & 0x80000000); + lX4 = (lX & 0x40000000); + lY4 = (lY & 0x40000000); + lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); + if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8); + if (lX4 | lY4) { + if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); + else return (lResult ^ 0x40000000 ^ lX8 ^ lY8); + } else { + return (lResult ^ lX8 ^ lY8); + } + } + + var F = function(x, y, z) { + return (x & y) | ((~ x) & z); + } + + var G = function(x, y, z) { + return (x & z) | (y & (~ z)); + } + + var H = function(x, y, z) { + return (x ^ y ^ z); + } + + var I = function(x, y, z) { + return (y ^ (x | (~ z))); + } + + var FF = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var GG = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var HH = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var II = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var convertToWordArray = function(string) { + var lWordCount; + var lMessageLength = string.length; + var lNumberOfWordsTempOne = lMessageLength + 8; + var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; + var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; + var lWordArray = Array(lNumberOfWords - 1); + var lBytePosition = 0; + var lByteCount = 0; + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); + lByteCount++; + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); + lWordArray[lNumberOfWords - 2] = lMessageLength << 3; + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; + return lWordArray; + }; + + var wordToHex = function(lValue) { + var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255; + WordToHexValueTemp = "0" + lByte.toString(16); + WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2); + } + return WordToHexValue; + }; + + var uTF8Encode = function(string) { + string = string.replace(/\x0d\x0a/g, "\x0a"); + var output = ""; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + output += String.fromCharCode(c); + } else if ((c > 127) && (c < 2048)) { + output += String.fromCharCode((c >> 6) | 192); + output += String.fromCharCode((c & 63) | 128); + } else { + output += String.fromCharCode((c >> 12) | 224); + output += String.fromCharCode(((c >> 6) & 63) | 128); + output += String.fromCharCode((c & 63) | 128); + } + } + return output; + }; + + $.extend({ + md5: function(string) { + var x = Array(); + var k, AA, BB, CC, DD, a, b, c, d; + var S11=7, S12=12, S13=17, S14=22; + var S21=5, S22=9 , S23=14, S24=20; + var S31=4, S32=11, S33=16, S34=23; + var S41=6, S42=10, S43=15, S44=21; + string = uTF8Encode(string); + x = convertToWordArray(string); + a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; + for (k = 0; k < x.length; k += 16) { + AA = a; BB = b; CC = c; DD = d; + a = FF(a, b, c, d, x[k+0], S11, 0xD76AA478); + d = FF(d, a, b, c, x[k+1], S12, 0xE8C7B756); + c = FF(c, d, a, b, x[k+2], S13, 0x242070DB); + b = FF(b, c, d, a, x[k+3], S14, 0xC1BDCEEE); + a = FF(a, b, c, d, x[k+4], S11, 0xF57C0FAF); + d = FF(d, a, b, c, x[k+5], S12, 0x4787C62A); + c = FF(c, d, a, b, x[k+6], S13, 0xA8304613); + b = FF(b, c, d, a, x[k+7], S14, 0xFD469501); + a = FF(a, b, c, d, x[k+8], S11, 0x698098D8); + d = FF(d, a, b, c, x[k+9], S12, 0x8B44F7AF); + c = FF(c, d, a, b, x[k+10], S13, 0xFFFF5BB1); + b = FF(b, c, d, a, x[k+11], S14, 0x895CD7BE); + a = FF(a, b, c, d, x[k+12], S11, 0x6B901122); + d = FF(d, a, b, c, x[k+13], S12, 0xFD987193); + c = FF(c, d, a, b, x[k+14], S13, 0xA679438E); + b = FF(b, c, d, a, x[k+15], S14, 0x49B40821); + a = GG(a, b, c, d, x[k+1], S21, 0xF61E2562); + d = GG(d, a, b, c, x[k+6], S22, 0xC040B340); + c = GG(c, d, a, b, x[k+11], S23, 0x265E5A51); + b = GG(b, c, d, a, x[k+0], S24, 0xE9B6C7AA); + a = GG(a, b, c, d, x[k+5], S21, 0xD62F105D); + d = GG(d, a, b, c, x[k+10], S22, 0x2441453); + c = GG(c, d, a, b, x[k+15], S23, 0xD8A1E681); + b = GG(b, c, d, a, x[k+4], S24, 0xE7D3FBC8); + a = GG(a, b, c, d, x[k+9], S21, 0x21E1CDE6); + d = GG(d, a, b, c, x[k+14], S22, 0xC33707D6); + c = GG(c, d, a, b, x[k+3], S23, 0xF4D50D87); + b = GG(b, c, d, a, x[k+8], S24, 0x455A14ED); + a = GG(a, b, c, d, x[k+13], S21, 0xA9E3E905); + d = GG(d, a, b, c, x[k+2], S22, 0xFCEFA3F8); + c = GG(c, d, a, b, x[k+7], S23, 0x676F02D9); + b = GG(b, c, d, a, x[k+12], S24, 0x8D2A4C8A); + a = HH(a, b, c, d, x[k+5], S31, 0xFFFA3942); + d = HH(d, a, b, c, x[k+8], S32, 0x8771F681); + c = HH(c, d, a, b, x[k+11], S33, 0x6D9D6122); + b = HH(b, c, d, a, x[k+14], S34, 0xFDE5380C); + a = HH(a, b, c, d, x[k+1], S31, 0xA4BEEA44); + d = HH(d, a, b, c, x[k+4], S32, 0x4BDECFA9); + c = HH(c, d, a, b, x[k+7], S33, 0xF6BB4B60); + b = HH(b, c, d, a, x[k+10], S34, 0xBEBFBC70); + a = HH(a, b, c, d, x[k+13], S31, 0x289B7EC6); + d = HH(d, a, b, c, x[k+0], S32, 0xEAA127FA); + c = HH(c, d, a, b, x[k+3], S33, 0xD4EF3085); + b = HH(b, c, d, a, x[k+6], S34, 0x4881D05); + a = HH(a, b, c, d, x[k+9], S31, 0xD9D4D039); + d = HH(d, a, b, c, x[k+12], S32, 0xE6DB99E5); + c = HH(c, d, a, b, x[k+15], S33, 0x1FA27CF8); + b = HH(b, c, d, a, x[k+2], S34, 0xC4AC5665); + a = II(a, b, c, d, x[k+0], S41, 0xF4292244); + d = II(d, a, b, c, x[k+7], S42, 0x432AFF97); + c = II(c, d, a, b, x[k+14], S43, 0xAB9423A7); + b = II(b, c, d, a, x[k+5], S44, 0xFC93A039); + a = II(a, b, c, d, x[k+12], S41, 0x655B59C3); + d = II(d, a, b, c, x[k+3], S42, 0x8F0CCC92); + c = II(c, d, a, b, x[k+10], S43, 0xFFEFF47D); + b = II(b, c, d, a, x[k+1], S44, 0x85845DD1); + a = II(a, b, c, d, x[k+8], S41, 0x6FA87E4F); + d = II(d, a, b, c, x[k+15], S42, 0xFE2CE6E0); + c = II(c, d, a, b, x[k+6], S43, 0xA3014314); + b = II(b, c, d, a, x[k+13], S44, 0x4E0811A1); + a = II(a, b, c, d, x[k+4], S41, 0xF7537E82); + d = II(d, a, b, c, x[k+11], S42, 0xBD3AF235); + c = II(c, d, a, b, x[k+2], S43, 0x2AD7D2BB); + b = II(b, c, d, a, x[k+9], S44, 0xEB86D391); + a = addUnsigned(a, AA); + b = addUnsigned(b, BB); + c = addUnsigned(c, CC); + d = addUnsigned(d, DD); + } + var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); + return tempValue.toLowerCase(); + } + }); + })(jQuery);/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();/** @license + * SoundManager 2: Javascript Sound for the Web + * -------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20101010 + */ + +/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: true, newcap: true, immed: true, regexp: false */ +/*global window, SM2_DEFER, sm2Debugger, alert, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ + +(function(window) { + +var soundManager = null; + +function SoundManager(smURL, smID) { + + this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9. + this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available+configured) + this.debugFlash = false; // enable debugging output inside SWF, troubleshoot Flash/browser issues + this.useConsole = true; // use firebug/safari console.log()-type debug console if available + this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug + this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload() + this.nullURL = 'about:blank'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only) + this.allowPolling = true; // allow flash to poll for status update (required for whileplaying() events, peak, sound spectrum functions to work.) + this.useFastPolling = false; // uses lower flash timer interval for higher callback frequency, best combined with useHighPerformance + this.useMovieStar = true; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio formats (AAC, M4V, FLV, MOV etc.) + this.bgColor = '#ffffff'; // movie (.swf) background color, eg. '#000000' + this.useHighPerformance = false; // position:fixed flash movie can help increase js/flash speed, minimize lag + this.flashLoadTimeout = 1000; // msec to wait for flash movie to load before failing (0 = infinity) + this.wmode = null; // string: flash rendering mode - null, transparent, opaque (last two allow layering of HTML on top) + this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), either 'always' or 'sameDomain' + this.useFlashBlock = false; // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. + this.useHTML5Audio = false; // Beta feature: Use HTML 5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. + this.html5Test = /^probably$/i; // HTML5 Audio().canPlayType() test. /^(probably|maybe)$/i if you want to be more liberal/risky. + this.ondebuglog = false; // callback made with each log message, regardless of debugMode + + this.audioFormats = { + // determines HTML5 support, flash requirements + // eg. if MP3 or MP4 required, Flash fallback is used if HTML5 can't play it + // shotgun approach to MIME testing due to browser variance + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"','audio/mpeg','audio/mp3','audio/MPA','audio/mpa-robust'], + 'required': true + }, + 'mp4': { + 'related': ['aac','m4a'], // additional formats under the MP4 container + 'type': ['audio/mp4; codecs="mp4a.40.2"','audio/aac','audio/x-m4a','audio/MP4A-LATM','audio/mpeg4-generic'], + 'required': true + }, + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + 'wav': { + 'type': ['audio/wav; codecs="1"','audio/wav','audio/wave','audio/x-wav'], + 'required': false + } + }; + + this.defaultOptions = { + 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) + 'stream': true, // allows playing before entire file has loaded (recommended) + 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) + 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) + 'onid3': null, // callback function for "ID3 data is added/available" + 'onload': null, // callback function for "load finished" + 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) + 'onplay': null, // callback for "play" start + 'onpause': null, // callback for "pause" + 'onresume': null, // callback for "resume" (pause toggle) + 'whileplaying': null, // callback during play (position update) + 'onstop': null, // callback for "user stop" + 'onfailure': null, // callback function for when playing fails + 'onfinish': null, // callback function for "sound finished playing" + 'onbeforefinish': null, // callback for "before sound finished playing (at [time])" + 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second) + 'onbeforefinishcomplete': null,// function to call when said sound finishes playing + 'onjustbeforefinish': null, // callback for [n] msec before end of current sound + 'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire. + 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time + 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled + 'position': null, // offset (milliseconds) to seek to within loaded sound data. + 'pan': 0, // "pan" settings, left-to-right, -100 to 100 + 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 + 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) + 'volume': 100 // self-explanatory. 0-100, the latter being the max. + }; + + this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used + 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL + 'usePeakData': false, // enable left/right channel peak (level) data + 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire. + 'useEQData': false, // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive. + 'onbufferchange': null, // callback for "isBuffering" property change + 'ondataerror': null, // callback for waveform/eq data access error (flash playing audio in other tabs/domains) + 'onstats': null // callback for when connection & play times have been measured + }; + + this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio options, merged into defaultOptions if flash 9+movieStar mode is enabled + 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) + 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants + 'onconnect': null, // rtmp: callback for connection to flash media server + 'bufferTimes': null, // array of buffer sizes to use. Size increases as buffer fills up. + 'duration': null // rtmp: song duration (msec) + }; + + this.version = null; + this.versionNumber = 'V2.97a.20101010'; + this.movieURL = null; + this.url = (smURL || null); + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.o = null; + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + this.swfCSS = { + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) + 'swfTimedout': 'swf_timedout', + 'swfUnblocked': 'swf_unblocked', // or loaded OK + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + }; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + this.specialWmodeCase = false; + this.didFlashBlock = false; + + this.filePattern = null; + this.filePatterns = { + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + }; + + this.baseMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3 + this.netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3, mp4, aac etc. + this.netStreamTypes = ['aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2']; // Flash v9.0r115+ "moviestar" formats + this.netStreamPattern = new RegExp('\\.(' + this.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + this.mimePattern = this.baseMimeTypes; + + this.features = { + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + }; + + this.sandbox = { + // <d> + 'type': null, + 'types': { + 'remote': 'remote (domain-based) rules', + 'localWithFile': 'local with file access (no internet access)', + 'localWithNetwork': 'local with network (internet access only, no local access)', + 'localTrusted': 'local, trusted (local+internet access)' + }, + 'description': null, + 'noRemote': null, + 'noLocal': null + // </d> + }; + + this.hasHTML5 = null; // switch for handling logic + this.html5 = { // stores canPlayType() results, etc. treat as read-only. + // mp3: boolean + // mp4: boolean + 'usingFlash': null // set if/when flash fallback is needed + }; + this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?) + + // --- private SM2 internals --- + + var SMSound, + _s = this, _sm = 'soundManager', _id, _ua = navigator.userAgent, _wl = window.location.href.toString(), _fV = this.flashVersion, _doc = document, _win = window, _doNothing, _init, _onready = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnReady, _processOnReady, _initUserOnload, _go, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _beginInit, _strings, _initMovie, _dcLoaded, _didDCLoaded, _getDocument, _createMovie, _die, _mobileFlash, _setPolling, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _needsFlash = null, _featureCheck, _html5OK, _html5Only = false, _html5CanPlay, _html5Ext, _dcIE, _testHTML5, _addEvt, _removeEvt, _slice = Array.prototype.slice, + _is_pre = _ua.match(/pre\//i), + _iPadOrPhone = _ua.match(/(ipad|iphone)/i), + _isMobile = (_ua.match(/mobile/i) || _is_pre || _iPadOrPhone), + _isIE = (_ua.match(/MSIE/i)), + _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), + _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), + _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), + _tryInitOnFocus = (typeof _doc.hasFocus === 'undefined' && _isSafari), + _okToDisable = !_tryInitOnFocus; + + this._use_maybe = (_wl.match(/sm2\-useHTML5Maybe\=1/i)); // temporary feature: #sm2-useHTML5Maybe=1 forces loose canPlay() check + this._overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null); + this.useAltURL = !this._overHTTP; // use altURL if not "online" + + if (_iPadOrPhone || _is_pre) { + // might as well force it on Apple + Palm, flash support unlikely + _s.useHTML5Audio = true; + _s.ignoreFlash = true; + } + + if (_is_pre || this._use_maybe) { + // less-strict canPlayType() checking option + _s.html5Test = /^(probably|maybe)$/i; + } + + // Temporary feature: allow force of HTML5 via URL: #sm2-usehtml5audio=0 or 1 + // <d> + (function(){ + var a = '#sm2-usehtml5audio=', l = _wl, b = null; + if (l.indexOf(a) !== -1) { + b = (l.substr(l.indexOf(a)+a.length) === '1'); + if (typeof console !== 'undefined' && typeof console.log !== 'undefined') { + console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); + } + _s.useHTML5Audio = b; + } + }()); + // </d> + + // --- public API methods --- + + this.supported = function() { + return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); + }; + + this.getMovie = function(smID) { + return _isIE?_win[smID]:(_isSafari?_id(smID) || _doc[smID]:_id(smID)); + }; + + this.loadFromXML = function(sXmlUrl) { + try { + _s.o._loadFromXML(sXmlUrl); + } catch(e) { + _failSafely(); + } + return true; + }; + + this.createSound = function(oOptions) { + var _cs = 'soundManager.createSound(): ', + thisOptions = null, oSound = null, _tO = null; + if (!_didInit || !_s.supported()) { + _complain(_cs + _str(!_didInit?'notReady':'notOK')); + return false; + } + if (arguments.length === 2) { + // function overloading in JS! :) ..assume simple createSound(id,url) use case + oOptions = { + 'id': arguments[0], + 'url': arguments[1] + }; + } + thisOptions = _mixin(oOptions); // inherit from defaultOptions + _tO = thisOptions; // alias + // <d> + if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) { + _s._wD(_cs + _str('badID', _tO.id), 2); + } + _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1); + // </d> + if (_idCheck(_tO.id, true)) { + _s._wD(_cs + _tO.id + ' exists', 1); + return _s.sounds[_tO.id]; + } + + function make() { + thisOptions = _loopFix(thisOptions); + _s.sounds[_tO.id] = new SMSound(_tO); + _s.soundIDs.push(_tO.id); + return _s.sounds[_tO.id]; + } + + if (_html5OK(_tO)) { + oSound = make(); + _s._wD('Loading sound '+_tO.id+' from HTML5'); + oSound._setup_html5(_tO); + } else { + if (_fV > 8 && _s.useMovieStar) { + if (_tO.isMovieStar === null) { + _tO.isMovieStar = ((_tO.serverURL || (_tO.type?_tO.type.match(_s.netStreamPattern):false)||_tO.url.match(_s.netStreamPattern))?true:false); + } + if (_tO.isMovieStar) { + _s._wD(_cs + 'using MovieStar handling'); + } + if (_tO.isMovieStar) { + if (_tO.usePeakData) { + _wDS('noPeak'); + _tO.usePeakData = false; + } + if (_tO.loops > 1) { + _wDS('noNSLoop'); + } + } + } + _tO = _policyFix(_tO, _cs); + oSound = make(); + if (_fV === 8) { + _s.o._createSound(_tO.id, _tO.onjustbeforefinishtime, _tO.loops||1, _tO.usePolicyFile); + } else { + _s.o._createSound(_tO.id, _tO.url, _tO.onjustbeforefinishtime, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.bufferTimes, _tO.onstats ? true : false, _tO.autoLoad, _tO.usePolicyFile); + if (!_tO.serverURL) { + // We are connected immediately + oSound.connected = true; + if (_tO.onconnect) { + _tO.onconnect.apply(oSound); + } + } + } + } + if (_tO.autoLoad || _tO.autoPlay) { + if (oSound) { + if (_s.isHTML5) { + oSound.autobuffer = 'auto'; // early HTML5 implementation (non-standard) + oSound.preload = 'auto'; // standard + } else { + oSound.load(_tO); + } + } + } + if (_tO.autoPlay) { + oSound.play(); + } + return oSound; + }; + + this.destroySound = function(sID, _bFromSound) { + // explicitly destroy a sound before normal page unload, etc. + if (!_idCheck(sID)) { + return false; + } + var oS = _s.sounds[sID], i; + oS._iO = {}; // Disable all callbacks while the sound is being destroyed + oS.stop(); + oS.unload(); + for (i = 0; i < _s.soundIDs.length; i++) { + if (_s.soundIDs[i] === sID) { + _s.soundIDs.splice(i, 1); + break; + } + } + if (!_bFromSound) { + // ignore if being called from SMSound instance + oS.destruct(true); + } + oS = null; + delete _s.sounds[sID]; + return true; + }; + + this.load = function(sID, oOptions) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].load(oOptions); + }; + + this.unload = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].unload(); + }; + + this.play = function(sID, oOptions) { + var fN = 'soundManager.play(): '; + if (!_didInit || !_s.supported()) { + _complain(fN + _str(!_didInit?'notReady':'notOK')); + return false; + } + if (!_idCheck(sID)) { + if (!(oOptions instanceof Object)) { + oOptions = { + url: oOptions + }; // overloading use case: play('mySound','/path/to/some.mp3'); + } + if (oOptions && oOptions.url) { + // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'}); + _s._wD(fN + 'attempting to create "' + sID + '"', 1); + oOptions.id = sID; + return _s.createSound(oOptions).play(); + } else { + return false; + } + } + return _s.sounds[sID].play(oOptions); + }; + + this.start = this.play; // just for convenience + + this.setPosition = function(sID, nMsecOffset) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPosition(nMsecOffset); + }; + + this.stop = function(sID) { + if (!_idCheck(sID)) { + return false; + } + _s._wD('soundManager.stop(' + sID + ')', 1); + return _s.sounds[sID].stop(); + }; + + this.stopAll = function() { + _s._wD('soundManager.stopAll()', 1); + for (var oSound in _s.sounds) { + if (_s.sounds[oSound] instanceof SMSound) { + _s.sounds[oSound].stop(); // apply only to sound objects + } + } + }; + + this.pause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].pause(); + }; + + this.pauseAll = function() { + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].pause(); + } + }; + + this.resume = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].resume(); + }; + + this.resumeAll = function() { + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].resume(); + } + }; + + this.togglePause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].togglePause(); + }; + + this.setPan = function(sID, nPan) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPan(nPan); + }; + + this.setVolume = function(sID, nVol) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setVolume(nVol); + }; + + this.mute = function(sID) { + var fN = 'soundManager.mute(): ', + i = 0; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + _s._wD(fN + 'Muting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].mute(); + } + _s.muted = true; + } else { + if (!_idCheck(sID)) { + return false; + } + _s._wD(fN + 'Muting "' + sID + '"'); + return _s.sounds[sID].mute(); + } + return true; + }; + + this.muteAll = function() { + _s.mute(); + }; + + this.unmute = function(sID) { + var fN = 'soundManager.unmute(): ', i; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + _s._wD(fN + 'Unmuting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].unmute(); + } + _s.muted = false; + } else { + if (!_idCheck(sID)) { + return false; + } + _s._wD(fN + 'Unmuting "' + sID + '"'); + return _s.sounds[sID].unmute(); + } + return true; + }; + + this.unmuteAll = function() { + _s.unmute(); + }; + + this.toggleMute = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].toggleMute(); + }; + + this.getMemoryUse = function() { + if (_fV === 8) { + return 0; + } + if (_s.o) { + return parseInt(_s.o._getMemoryUse(), 10); + } + }; + + this.disable = function(bNoDisable) { + // destroy all functions + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled) { + return false; + } + _disabled = true; + _wDS('shutdown', 1); + for (var i = _s.soundIDs.length; i--;) { + _disableObject(_s.sounds[_s.soundIDs[i]]); + } + _initComplete(bNoDisable); // fire "complete", despite fail + _removeEvt(_win, 'load', _initUserOnload); + return true; + }; + + this.canPlayMIME = function(sMIME) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay({type:sMIME}); + } + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + return (sMIME?(sMIME.match(_s.mimePattern)?true:false):null); + } + }; + + this.canPlayURL = function(sURL) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay(sURL); + } + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + return (sURL?(sURL.match(_s.filePattern)?true:false):null); + } + }; + + this.canPlayLink = function(oLink) { + if (typeof oLink.type !== 'undefined' && oLink.type) { + if (_s.canPlayMIME(oLink.type)) { + return true; + } + } + return _s.canPlayURL(oLink.href); + }; + + this.getSoundById = function(sID, suppressDebug) { + if (!sID) { + throw new Error('SoundManager.getSoundById(): sID is null/undefined'); + } + var result = _s.sounds[sID]; + if (!result && !suppressDebug) { + _s._wD('"' + sID + '" is an invalid sound ID.', 2); + } + return result; + }; + + this.onready = function(oMethod, oScope) { + if (oMethod && oMethod instanceof Function) { + if (_didInit) { + _wDS('queue'); + } + if (!oScope) { + oScope = _win; + } + _addOnReady(oMethod, oScope); + _processOnReady(); + return true; + } else { + throw _str('needFunction'); + } + }; + + this.getMoviePercent = function() { + return (_s.o && typeof _s.o.PercentLoaded !== 'undefined'?_s.o.PercentLoaded():null); + }; + + this._writeDebug = function(sText, sType, bTimestamp) { + // If the debug log callback is set, always call it, regardless of debugMode + if (_s.ondebuglog) { + _s.ondebuglog(sText, sType, bTimestamp); + } + // pseudo-private console.log()-style output + // <d> + var sDID = 'soundmanager-debug', o, oItem, sMethod; + if (!_s.debugMode) { + return false; + } + if (typeof bTimestamp !== 'undefined' && bTimestamp) { + sText = sText + ' | ' + new Date().getTime(); + } + if (_hasConsole && _s.useConsole) { + sMethod = _debugLevels[sType]; + if (typeof console[sMethod] !== 'undefined') { + console[sMethod](sText); + } else { + console.log(sText); + } + if (_s.useConsoleOnly) { + return true; + } + } + try { + o = _id(sDID); + if (!o) { + return false; + } + oItem = _doc.createElement('div'); + if (++_wdCount % 2 === 0) { + oItem.className = 'sm2-alt'; + } + if (typeof sType === 'undefined') { + sType = 0; + } else { + sType = parseInt(sType, 10); + } + oItem.appendChild(_doc.createTextNode(sText)); + if (sType) { + if (sType >= 2) { + oItem.style.fontWeight = 'bold'; + } + if (sType === 3) { + oItem.style.color = '#ff3333'; + } + } + // o.appendChild(oItem); // top-to-bottom + o.insertBefore(oItem, o.firstChild); // bottom-to-top + } catch(e) { + // oh well + } + o = null; + // </d> + return true; + }; + this._wD = this._writeDebug; // alias + + this._debug = function() { + // <d> + _wDS('currentObj', 1); + for (var i = 0, j = _s.soundIDs.length; i < j; i++) { + _s.sounds[_s.soundIDs[i]]._debug(); + } + // </d> + }; + + this.reboot = function() { + // attempt to reset and init SM2 + _s._wD('soundManager.reboot()'); + if (_s.soundIDs.length) { + _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...'); + } + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].destruct(); + } + // trash ze flash + try { + if (_isIE) { + _oRemovedHTML = _s.o.innerHTML; + } + _oRemoved = _s.o.parentNode.removeChild(_s.o); + _s._wD('Flash movie removed.'); + } catch(e) { + // uh-oh. + _wDS('badRemove', 2); + } + // actually, force recreate of movie. + _oRemovedHTML = _oRemoved = null; + _s.enabled = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; + _s.soundIDs = _s.sounds = []; + _s.o = null; + for (i = _onready.length; i--;) { + _onready[i].fired = false; + } + _s._wD(_sm + ': Rebooting...'); + _win.setTimeout(function() { + _s.beginDelayedInit(); + }, 20); + }; + + this.destruct = function() { + _s._wD('soundManager.destruct()'); + _s.disable(true); + }; + + this.beginDelayedInit = function() { + // _s._wD('soundManager.beginDelayedInit()'); + _windowLoaded = true; + _dcLoaded(); + setTimeout(_beginInit, 20); + _delayWaitForEI(); + }; + + // --- SMSound (sound object) instance --- + + SMSound = function(oOptions) { + var _t = this, _resetProperties, _add_html5_events, _stop_html5_timer, _start_html5_timer, _get_html5_duration, _a; + this.sID = oOptions.id; + this.url = oOptions.url; + this.options = _mixin(oOptions); + this.instanceOptions = this.options; // per-play-instance-specific options + this._iO = this.instanceOptions; // short alias + // assign property defaults + this.pan = this.options.pan; + this.volume = this.options.volume; + this._lastURL = null; + this.isHTML5 = false; + + // --- public methods --- + + this.id3 = {}; + + this._debug = function() { + // <d> + // pseudo-private console.log()-style output + if (_s.debugMode) { + var stuff = null, msg = [], sF, sfBracket, maxLength = 64; + for (stuff in _t.options) { + if (_t.options[stuff] !== null) { + if (_t.options[stuff] instanceof Function) { + // handle functions specially + sF = _t.options[stuff].toString(); + sF = sF.replace(/\s\s+/g, ' '); // normalize spaces + sfBracket = sF.indexOf('{'); + msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }'); + } else { + msg.push(' ' + stuff + ': ' + _t.options[stuff]); + } + } + } + _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}'); + } + // </d> + }; + + this._debug(); + + this.load = function(oOptions) { + var oS = null; + if (typeof oOptions !== 'undefined') { + _t._iO = _mixin(oOptions); + _t.instanceOptions = _t._iO; + } else { + oOptions = _t.options; + _t._iO = oOptions; + _t.instanceOptions = _t._iO; + if (_t._lastURL && _t._lastURL !== _t.url) { + _wDS('manURL'); + _t._iO.url = _t.url; + _t.url = null; + } + } + _s._wD('soundManager.load(): ' + _t._iO.url, 1); + if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { + _wDS('onURL', 1); + return _t; + } + _t._lastURL = _t.url; + _t.loaded = false; + _t.readyState = 1; + _t.playState = 0; + if (_html5OK(_t._iO)) { + _s._wD('HTML 5 load: '+_t._iO.url); + oS = _t._setup_html5(_t._iO); + oS.load(); + if (_t._iO.autoPlay) { + _t.play(); + } + } else { + try { + _t.isHTML5 = false; + _t._iO = _policyFix(_loopFix(_t._iO)); + if (_fV === 8) { + _s.o._load(_t.sID, _t._iO.url, _t._iO.stream, _t._iO.autoPlay, (_t._iO.whileloading?1:0), _t._iO.loops||1, _t._iO.usePolicyFile); + } else { + _s.o._load(_t.sID, _t._iO.url, _t._iO.stream?true:false, _t._iO.autoPlay?true:false, _t._iO.loops||1, _t._iO.autoLoad?true:false, _t._iO.usePolicyFile); + } + } catch(e) { + _wDS('smError', 2); + _debugTS('onload', false); + _die(); + } + } + return _t; + }; + + this.unload = function() { + // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3 + // Flash 9/AS3: Close stream, preventing further load + if (_t.readyState !== 0) { + _s._wD('SMSound.unload(): "' + _t.sID + '"'); + if (!_t.isHTML5) { + if (_fV === 8) { + _s.o._unload(_t.sID, _s.nullURL); + } else { + _s.o._unload(_t.sID); + } + } else { + _stop_html5_timer(); + if (_a) { + // abort()-style method here, stop loading? (doesn't exist?) + _a.pause(); + _a.src = _s.nullURL; // needed? does nulling object work? any better way to cancel/unload/abort? + _a.load(); + _t._audio = null; + _a = null; + // delete _t._audio; + } + } + // reset load/status flags + _resetProperties(); + } + return _t; + }; + + this.destruct = function(_bFromSM) { + _s._wD('SMSound.destruct(): "' + _t.sID + '"'); + if (!_t.isHTML5) { + // kill sound within Flash + // Disable the onfailure handler + _t._iO.onfailure = null; + _s.o._destroySound(_t.sID); + } else { + _stop_html5_timer(); + if (_a) { + _a.pause(); + _a.src = 'about:blank'; + _a.load(); + _t._audio = null; + _a = null; + // delete _t._audio; + } + } + if (!_bFromSM) { + _s.destroySound(_t.sID, true); // ensure deletion from controller + } + }; + + this.play = function(oOptions, _updatePlayState) { + var fN = 'SMSound.play(): ', allowMulti; + _updatePlayState = (typeof _updatePlayState === 'undefined' ? true : _updatePlayState); + if (!oOptions) { + oOptions = {}; + } + _t._iO = _mixin(oOptions, _t._iO); + _t._iO = _mixin(_t._iO, _t.options); + _t.instanceOptions = _t._iO; + if (_t._iO.serverURL) { + if (!_t.connected) { + if (!_t.getAutoPlay()) { + _s._wD(fN+' Netstream not connected yet - setting autoPlay'); + _t.setAutoPlay(true); + } + return _t; + } + } + if (_html5OK(_t._iO)) { + _t._setup_html5(_t._iO); + _start_html5_timer(); + } + // KJV paused sounds have playState 1. We want these sounds to play. + if (_t.playState === 1 && !_t.paused) { + allowMulti = _t._iO.multiShot; + if (!allowMulti) { + _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1); + return _t; + } else { + _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1); + if (_t.isHTML5) { + // TODO: BUG? + _t.setPosition(_t._iO.position); + } + } + } + if (!_t.loaded) { + if (_t.readyState === 0) { + _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1); + // try to get this sound playing ASAP + if (!_t.isHTML5) { + if (!_t._iO.serverURL) { + _t._iO.autoPlay = true; + _t.load(_t._iO); + } + } else { + _t.load(_t._iO); + _t.readyState = 1; + } + } else if (_t.readyState === 2) { + _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2); + return _t; + } else { + _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1); + } + } else { + _s._wD(fN + '"' + _t.sID + '"'); + } + // Streams will pause when their buffer is full if they are not auto-playing. + // In this case paused is true, but the song hasn't started playing yet. If + // we just call resume() the onplay() callback will never be called. + + // Also, if we just call resume() in this case and the sound has been muted + // (volume is 0), it will never have its volume set so sound will be heard + // when it shouldn't. + if (_t.paused && _t.position && _t.position > 0) { // https://gist.github.com/37b17df75cc4d7a90bf6 + _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1); + _t.resume(); + } else { + _s._wD(fN+'"'+ _t.sID+'" is starting to play'); + _t.playState = 1; + _t.paused = false; + if (!_t.instanceCount || _t._iO.multiShotEvents || (_fV > 8 && !_t.isHTML5 && !_t.getAutoPlay())) { + _t.instanceCount++; + } + _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0); + _t._iO = _policyFix(_loopFix(_t._iO)); + if (_t._iO.onplay && _updatePlayState) { + _t._iO.onplay.apply(_t); + } + _t.setVolume(_t._iO.volume, true); + _t.setPan(_t._iO.pan, true); + if (!_t.isHTML5) { + _s.o._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t.position:_t.position / 1000)); + } else { + _start_html5_timer(); + _t._setup_html5().play(); + } + } + return _t; + }; + + this.start = this.play; // just for convenience + + this.stop = function(bAll) { + if (_t.playState === 1) { + _t._onbufferchange(0); + _t.resetOnPosition(0); + if (!_t.isHTML5) { + _t.playState = 0; + } + _t.paused = false; + if (_t._iO.onstop) { + _t._iO.onstop.apply(_t); + } + if (!_t.isHTML5) { + _s.o._stop(_t.sID, bAll); + // hack for netStream: just unload + if (_t._iO.serverURL) { + _t.unload(); + } + } else { + if (_a) { + _t.setPosition(0); // act like Flash, though + _a.pause(); // html5 has no stop() + _t.playState = 0; + _t._onTimer(); // and update UI + _stop_html5_timer(); + _t.unload(); + } + } + _t.instanceCount = 0; + _t._iO = {}; + } + return _t; + }; + + this.setAutoPlay = function(autoPlay) { + _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off')); + _t._iO.autoPlay = autoPlay; + _s.o._setAutoPlay(_t.sID, autoPlay); + if (autoPlay) { + // KJV Only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) + if (!_t.instanceCount && _t.readyState === 1) { + _t.instanceCount++; + _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount); + } + } + }; + + this.getAutoPlay = function() { + return _t._iO.autoPlay; + }; + + this.setPosition = function(nMsecOffset, bNoDebug) { + if (nMsecOffset === undefined) { + nMsecOffset = 0; + } + // KJV Use the duration from the instance options, if we don't have a track duration yet. + // Auto-loading streams with a starting position in their options will start playing + // as soon as they connect. In the start() call we set the position on the stream, + // but because the stream hasn't played _t.duration won't have been set (that is + // done in whileloading()). So if we don't have a duration yet, use the duration + // from the instance options, if available. + var position, offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); // position >= 0 and <= current available (loaded) duration + _t.position = offset; + _t.resetOnPosition(_t.position); + if (!_t.isHTML5) { + position = _fV === 9 ? _t.position : _t.position / 1000; + // KJV We want our sounds to play on seek. A progressive download that + // is loaded has paused = false so resume() does nothing and the sound + // doesn't play. Handle that case here. + if (_t.playState === 0) { + _t.play({ position: position }); + } else { + _s.o._setPosition(_t.sID, position, (_t.paused || !_t.playState)); // if paused or not playing, will not resume (by playing) + // if (_t.paused) { + // _t.resume(); + // } + } + } else if (_a) { + _s._wD('setPosition(): setting position to '+(_t.position / 1000)); + if (_t.playState) { + // DOM/JS errors/exceptions to watch out for: + // if seek is beyond (loaded?) position, "DOM exception 11" + // "INDEX_SIZE_ERR": DOM exception 1 + try { + _a.currentTime = _t.position / 1000; + } catch(e) { + _s._wD('setPosition('+_t.position+'): WARN: Caught exception: '+e.message, 2); + } + } else { + _s._wD('HTML 5 warning: cannot set position while playState == 0 (not playing)',2); + } + if (_t.paused) { // if paused, refresh UI right away + _t._onTimer(true); // force update + if (_t._iO.useMovieStar) { + _t.resume(); + } + } + } + return _t; + }; + + this.pause = function(bCallFlash) { + if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { + return _t; + } + _s._wD('SMSound.pause()'); + _t.paused = true; + if (!_t.isHTML5) { + if (bCallFlash || bCallFlash === undefined) { + _s.o._pause(_t.sID); + } + } else { + _t._setup_html5().pause(); + _stop_html5_timer(); + } + if (_t._iO.onpause) { + _t._iO.onpause.apply(_t); + } + return _t; + }; + + this.resume = function() { + // When auto-loaded streams pause on buffer full they have a playState of 0. + // We need to make sure that the playState is set to 1 when these streams "resume". + if (!_t.paused) { + return _t; + } + _s._wD('SMSound.resume()'); + _t.paused = false; + _t.playState = 1; // TODO: verify that this is needed. + if (!_t.isHTML5) { + _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume) + } else { + _t._setup_html5().play(); + _start_html5_timer(); + } + if (_t._iO.onresume) { + _t._iO.onresume.apply(_t); + } + return _t; + }; + + this.togglePause = function() { + _s._wD('SMSound.togglePause()'); + if (_t.playState === 0) { + _t.play({ + position: (_fV === 9 && !_t.isHTML5 ? _t.position:_t.position / 1000) + }); + return _t; + } + if (_t.paused) { + _t.resume(); + } else { + _t.pause(); + } + return _t; + }; + + this.setPan = function(nPan, bInstanceOnly) { + if (typeof nPan === 'undefined') { + nPan = 0; + } + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + if (!_t.isHTML5) { + _s.o._setPan(_t.sID, nPan); + } // else { no HTML5 pan? } + _t._iO.pan = nPan; + if (!bInstanceOnly) { + _t.pan = nPan; + } + return _t; + }; + + this.setVolume = function(nVol, bInstanceOnly) { + if (typeof nVol === 'undefined') { + nVol = 100; + } + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); + } else if (_a) { + _a.volume = nVol/100; + } + _t._iO.volume = nVol; + if (!bInstanceOnly) { + _t.volume = nVol; + } + return _t; + }; + + this.mute = function() { + _t.muted = true; + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, 0); + } else if (_a) { + _a.muted = true; + } + return _t; + }; + + this.unmute = function() { + _t.muted = false; + var hasIO = typeof _t._iO.volume !== 'undefined'; + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); + } else if (_a) { + _a.muted = false; + } + return _t; + }; + + this.toggleMute = function() { + return (_t.muted?_t.unmute():_t.mute()); + }; + + this.onposition = function(nPosition, oMethod, oScope) { + // TODO: allow for ranges, too? eg. (nPosition instanceof Array) + _t._onPositionItems.push({ + position: nPosition, + method: oMethod, + scope: (typeof oScope !== 'undefined'?oScope:_t), + fired: false + }); + return _t; + }; + + this.processOnPosition = function() { + var i, item, j = _t._onPositionItems.length; + if (!j || !_t.playState || _t._onPositionFired >= j) { + return false; + } + for (i=j; i--;) { + item = _t._onPositionItems[i]; + if (!item.fired && _t.position >= item.position) { + item.method.apply(item.scope,[item.position]); + item.fired = true; + _s._onPositionFired++; + } + } + return true; + }; + + this.resetOnPosition = function(nPosition) { + // reset "fired" for items interested in this position + var i, item, j = _t._onPositionItems.length; + if (!j) { + return false; + } + for (i=j; i--;) { + item = _t._onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + _s._onPositionFired--; + } + } + return true; + }; + + // pseudo-private soundManager reference + + this._onTimer = function(bForce) { + // HTML 5-only _whileplaying() etc. + var time, x = {}; + if (_t._hasTimer || bForce) { + if (_a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { // TODO: May not need to track readyState (1 = loading) + _t.duration = _get_html5_duration(); + _t.durationEstimate = _t.duration; + time = _a.currentTime?_a.currentTime*1000:0; + _t._whileplaying(time,x,x,x,x); + return true; + } else { + _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK')); + return false; + } + } + }; + + // --- private internals --- + + _get_html5_duration = function() { + var d = (_a?_a.duration*1000:undefined); + return (d && !isNaN(d)?d:null); + }; + + _start_html5_timer = function() { + if (_t.isHTML5) { + _startTimer(_t); + } + }; + + _stop_html5_timer = function() { + if (_t.isHTML5) { + _stopTimer(_t); + } + }; + + _resetProperties = function(bLoaded) { + _t._onPositionItems = []; + _t._onPositionFired = 0; + _t._hasTimer = null; + _t._added_events = null; + _t._audio = null; + _a = null; + _t.bytesLoaded = null; + _t.bytesTotal = null; + _t.position = null; + _t.duration = (_t._iO && _t._iO.duration?_t._iO.duration:null); + _t.durationEstimate = null; + _t.failures = 0; + _t.loaded = false; + _t.playState = 0; + _t.paused = false; + _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success + _t.muted = false; + _t.didBeforeFinish = false; + _t.didJustBeforeFinish = false; + _t.isBuffering = false; + _t.instanceOptions = {}; + _t.instanceCount = 0; + _t.peakData = { + left: 0, + right: 0 + }; + _t.waveformData = { + left: [], + right: [] + }; + _t.eqData = []; // legacy: 1D array + _t.eqData.left = []; + _t.eqData.right = []; + }; + + _resetProperties(); + + // pseudo-private methods used by soundManager + + this._setup_html5 = function(oOptions) { + var _iO = _mixin(_t._iO, oOptions); + if (_a) { + if (_t.url !== _iO.url) { + _s._wD('setting new URL on existing object: '+_iO.url); + _a.src = _iO.url; + } + } else { + _s._wD('creating HTML 5 audio element with URL: '+_iO.url); + _t._audio = new Audio(_iO.url); + _a = _t._audio; + _t.isHTML5 = true; + _add_html5_events(); + } + _a.loop = (_iO.loops>1?'loop':''); + return _t._audio; + }; + + // related private methods + + _add_html5_events = function() { + if (_t._added_events) { + return false; + } + _t._added_events = true; + + function _add(oEvt, oFn, bCapture) { + return (_a ? _a.addEventListener(oEvt, oFn, bCapture||false) : null); + } + + _add('load', function(e) { + _s._wD('HTML5::load: '+_t.sID); + if (_a) { + _t._onbufferchange(0); + _t._whileloading(_t.bytesTotal, _t.bytesTotal, _get_html5_duration()); + _t._onload(true); + } + }, false); + + _add('canplay', function(e) { + _s._wD('HTML5::canplay: '+_t.sID); + // enough has loaded to play + _t._onbufferchange(0); + },false); + + _add('waiting', function(e) { + _s._wD('HTML5::waiting: '+_t.sID); + // playback faster than download rate, etc. + _t._onbufferchange(1); + },false); + + _add('progress', function(e) { // not supported everywhere yet.. + _s._wD('HTML5::progress: '+_t.sID+': loaded/total: '+(e.loaded||0)+'/'+(e.total||1)); + if (!_t.loaded && _a) { + _t._onbufferchange(0); // if progress, likely not buffering + _t._whileloading(e.loaded||0, e.total||1, _get_html5_duration()); + } + }, false); + + _add('error', function(e) { + if (_a) { + _s._wD('HTML5::error: '+_a.error.code); + // call load with error state? + _t._onload(false); + } + }, false); + + _add('loadstart', function(e) { + _s._wD('HTML5::loadstart: '+_t.sID); + // assume buffering at first + _t._onbufferchange(1); + }, false); + + _add('play', function(e) { + _s._wD('HTML5::play: '+_t.sID); + // once play starts, no buffering + _t._onbufferchange(0); + }, false); + + // TODO: verify if this is actually implemented anywhere yet. + _add('playing', function(e) { + _s._wD('HTML5::playing: '+_t.sID); + // once play starts, no buffering + _t._onbufferchange(0); + }, false); + + _add('timeupdate', function(e) { + _t._onTimer(); + }, false); + + // avoid stupid premature event-firing bug in Safari(?) + setTimeout(function(){ + if (_t && _a) { + _add('ended',function(e) { + _s._wD('HTML5::ended: '+_t.sID); + _t._onfinish(); + }, false); + } + }, 250); + return true; + }; + + // --- "private" methods called by Flash --- + + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + _t.bytesLoaded = nBytesLoaded; + _t.bytesTotal = nBytesTotal; + _t.duration = Math.floor(nDuration); + _t.bufferLength = nBufferLength; + if (!_t._iO.isMovieStar) { + if (_t._iO.duration) { + // use options, if specified and larger + _t.durationEstimate = (_t.duration > _t._iO.duration) ? _t.duration : _t._iO.duration; + } else { + _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); + } + if (_t.durationEstimate === undefined) { + _t.durationEstimate = _t.duration; + } + _t.bufferLength = nBufferLength; + if (_t.readyState !== 3 && _t._iO.whileloading) { + _t._iO.whileloading.apply(_t); + } + } else { + _t.durationEstimate = _t.duration; + if (_t.readyState !== 3 && _t._iO.whileloading) { + _t._iO.whileloading.apply(_t); + } + } + }; + + this._onid3 = function(oID3PropNames, oID3Data) { + // oID3PropNames: string array (names) + // ID3Data: string array (data) + _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.'); + var oData = [], i, j; + for (i = 0, j = oID3PropNames.length; i < j; i++) { + oData[oID3PropNames[i]] = oID3Data[i]; + } + _t.id3 = _mixin(_t.id3, oData); + if (_t._iO.onid3) { + _t._iO.onid3.apply(_t); + } + }; + + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + if (isNaN(nPosition) || nPosition === null) { + return false; // Flash may return NaN at times + } + if (_t.playState === 0 && nPosition > 0) { + // invalid position edge case for end/stop + nPosition = 0; + } + _t.position = nPosition; + _t.processOnPosition(); + if (_fV > 8 && !_t.isHTML5) { + if (_t._iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { + _t.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + if (_t._iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { + _t.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + if (_t._iO.useEQData) { + if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { + var eqLeft = oEQData.leftEQ.split(','); + _t.eqData = eqLeft; + _t.eqData.left = eqLeft; + if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { + _t.eqData.right = oEQData.rightEQ.split(','); + } + } + } + } + if (_t.playState === 1) { + // special case/hack: ensure buffering is false if loading from cache (and not yet started) + if (!_t.isHTML5 && _s.flashVersion === 8 && !_t.position && _t.isBuffering) { + _t._onbufferchange(0); + } + if (_t._iO.whileplaying) { + _t._iO.whileplaying.apply(_t); // flash may call after actual finish + } + if ((_t.loaded || (!_t.loaded && _t._iO.isMovieStar)) && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration - _t.position <= _t._iO.onbeforefinishtime) { + _t._onbeforefinish(); + } + } + return true; + }; + + this._onconnect = function(bSuccess) { + var fN = 'SMSound._onconnect(): '; + bSuccess = (bSuccess === 1); + _s._wD(fN+'"'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2)); + _t.connected = bSuccess; + if (bSuccess) { + _t.failures = 0; + if (_t._iO.onconnect) { + _t._iO.onconnect.apply(_t,[bSuccess]); + } + // don't play if the sound is being destroyed + if (_idCheck(_t.sID) && (_t.options.autoLoad || _t.getAutoPlay())) { + _t.play(undefined, _t.getAutoPlay()); // only update the play state if auto playing + } + } + }; + + this._onload = function(nSuccess) { + var fN = 'SMSound._onload(): ', loadOK = (nSuccess?true:false); + _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2)); + // <d> + if (!loadOK && !_t.isHTML5) { + if (_s.sandbox.noRemote === true) { + _s._wD(fN + _str('noNet'), 1); + } + if (_s.sandbox.noLocal === true) { + _s._wD(fN + _str('noLocal'), 1); + } + } + // </d> + _t.loaded = loadOK; + _t.readyState = loadOK?3:2; + _t._onbufferchange(0); + if (_t._iO.onload) { + _t._iO.onload.apply(_t, [loadOK]); + } + return true; + }; + + // fire onfailure() only once at most + // at this point we just recreate failed sounds rather than trying to reconnect. + this._onfailure = function(msg, level, code) { + _t.failures++; + _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures); + if (_t._iO.onfailure && _t.failures === 1) { + _t._iO.onfailure(_t, msg, level, code); + } else { + _s._wD('SMSound._onfailure(): ignoring'); + } + }; + + this._onbeforefinish = function() { + if (!_t.didBeforeFinish) { + _t.didBeforeFinish = true; + if (_t._iO.onbeforefinish) { + _s._wD('SMSound._onbeforefinish(): "' + _t.sID + '"'); + _t._iO.onbeforefinish.apply(_t); + } + } + }; + + this._onjustbeforefinish = function(msOffset) { + if (!_t.didJustBeforeFinish) { + _t.didJustBeforeFinish = true; + if (_t._iO.onjustbeforefinish) { + _s._wD('SMSound._onjustbeforefinish(): "' + _t.sID + '"'); + _t._iO.onjustbeforefinish.apply(_t); + } + } + }; + + // KJV - connect & play time callback from Flash + this._onstats = function(stats) { + if (_t._iO.onstats) { + _t._iO.onstats(_t, stats); + } + }; + + this._onfinish = function() { + // _s._wD('SMSound._onfinish(): "' + _t.sID + '" got instanceCount '+_t.instanceCount); + _t._onbufferchange(0); + _t.resetOnPosition(0); + if (_t._iO.onbeforefinishcomplete) { + _t._iO.onbeforefinishcomplete.apply(_t); + } + // reset some state items + _t.didBeforeFinish = false; + _t.didJustBeforeFinish = false; + if (_t.instanceCount) { + _t.instanceCount--; + if (!_t.instanceCount) { + // reset instance options + _t.playState = 0; + _t.paused = false; + _t.instanceCount = 0; + _t.instanceOptions = {}; + _stop_html5_timer(); + } + if (!_t.instanceCount || _t._iO.multiShotEvents) { + // fire onfinish for last, or every instance + if (_t._iO.onfinish) { + _s._wD('SMSound._onfinish(): "' + _t.sID + '"'); + _t._iO.onfinish.apply(_t); + } + } + } + }; + + this._onbufferchange = function(nIsBuffering) { + var fN = 'SMSound._onbufferchange()'; + if (_t.playState === 0) { + // ignore if not playing + return false; + } + if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { + return false; + } + _t.isBuffering = (nIsBuffering === 1); + if (_t._iO.onbufferchange) { + _s._wD(fN + ': ' + nIsBuffering); + _t._iO.onbufferchange.apply(_t); + } + return true; + }; + + this._ondataerror = function(sError) { + // flash 9 wave/eq data handler + if (_t.playState > 0) { // hack: called at start, and end from flash at/after onfinish() + _s._wD('SMSound._ondataerror(): ' + sError); + if (_t._iO.ondataerror) { + _t._iO.ondataerror.apply(_t); + } + } + }; + + }; // SMSound() + + // --- private SM2 internals --- + + _getDocument = function() { + return (_doc.body?_doc.body:(_doc._docElement?_doc.documentElement:_doc.getElementsByTagName('div')[0])); + }; + + _id = function(sID) { + return _doc.getElementById(sID); + }; + + _mixin = function(oMain, oAdd) { + // non-destructive merge + var o1 = {}, i, o2, o; + for (i in oMain) { // clone c1 + if (oMain.hasOwnProperty(i)) { + o1[i] = oMain[i]; + } + } + o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); + for (o in o2) { + if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { + o1[o] = o2[o]; + } + } + return o1; + }; + + (function() { + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + function getArgs(oArgs) { + var args = _slice.call(oArgs), len = args.length; + if (old) { + args[1] = 'on' + args[1]; // prefix + if (len > 3) { + args.pop(); // no capture + } + } else if (len === 3) { + args.push(false); + } + return args; + } + + function apply(args, sType) { + var oFunc = args.shift()[evt[sType]]; + if (old) { + oFunc(args[0], args[1]); + } else { + oFunc.apply(this, args); + } + } + + _addEvt = function() { + apply(getArgs(arguments), 'add'); + }; + + _removeEvt = function() { + apply(getArgs(arguments), 'remove'); + }; + }()); + + _html5OK = function(iO) { + return ((iO.type?_html5CanPlay({type:iO.type}):false)||_html5CanPlay(iO.url)); + }; + + _html5CanPlay = function(sURL) { + // try to find MIME, test and return truthiness + if (!_s.useHTML5Audio || !_s.hasHTML5) { + return false; + } + var result, mime, fileExt, item, aF = _s.audioFormats; + if (!_html5Ext) { + _html5Ext = []; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + _html5Ext.push(item); + if (aF[item].related) { + _html5Ext = _html5Ext.concat(aF[item].related); + } + } + } + _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')','i'); + } + mime = (typeof sURL.type !== 'undefined'?sURL.type:null); + fileExt = (typeof sURL === 'string'?sURL.toLowerCase().match(_html5Ext):null); // TODO: Strip URL queries, etc. + if (!fileExt || !fileExt.length) { + if (!mime) { + return false; + } + } else { + fileExt = fileExt[0].substr(1); // "mp3", for example + } + if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { + // result known + return _s.html5[fileExt]; + } else { + if (!mime) { + if (fileExt && _s.html5[fileExt]) { + return _s.html5[fileExt]; + } else { + // best-case guess, audio/whatever-dot-filename-format-you're-playing + mime = 'audio/'+fileExt; + } + } + result = _s.html5.canPlayType(mime); + _s.html5[fileExt] = result; + // _s._wD('canPlayType, found result: '+result); + return result; + } + }; + + _testHTML5 = function() { + if (!_s.useHTML5Audio || typeof Audio === 'undefined') { + return false; + } + var a = (typeof Audio !== 'undefined' ? new Audio():null), item, support = {}, aF, i; + function _cp(m) { + var canPlay, i, j, isOK = false; + if (!a || typeof a.canPlayType !== 'function') { + return false; + } + if (m instanceof Array) { + // iterate through all mime types, return any successes + for (i=0, j=m.length; i<j && !isOK; i++) { + if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) { + isOK = true; + _s.html5[m[i]] = true; + } + } + return isOK; + } else { + canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false); + return (canPlay && (canPlay.match(_s.html5Test)?true:false)); + } + } + // test all registered formats + codecs + aF = _s.audioFormats; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + support[item] = _cp(aF[item].type); + // assign result to related formats, too + if (aF[item] && aF[item].related) { + for (i=0; i<aF[item].related.length; i++) { + _s.html5[aF[item].related[i]] = support[item]; + } + } + } + } + support.canPlayType = (a?_cp:null); + _s.html5 = _mixin(_s.html5, support); + return true; + }; + + _strings = { + // <d> + notReady: 'Not loaded yet - wait for soundManager.onload()/onready()', + notOK: 'Audio support is not available.', + appXHTML: _sm + '::createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.', + spcWmode: _sm + '::createMovie(): Removing wmode, preventing win32 below-the-fold SWF loading issue', + swf404: _sm + ': Verify that %s is a valid path.', + tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)', + checkSWF: 'See SWF output for more debug info.', + localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', + waitFocus: _sm + ': Special case: Waiting for focus-related event..', + waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...', + waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...', + needFunction: _sm + '.onready(): Function object expected', + badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character', + noMS: 'MovieStar mode not enabled. Exiting.', + currentObj: '--- ' + _sm + '._debug(): Current sound objects ---', + waitEI: _sm + '::initMovie(): Waiting for ExternalInterface call from Flash..', + waitOnload: _sm + ': Waiting for window.onload()', + docLoaded: _sm + ': Document already loaded', + onload: _sm + '::initComplete(): calling soundManager.onload()', + onloadOK: _sm + '.onload() complete', + init: '-- ' + _sm + '::init() --', + didInit: _sm + '::init(): Already called?', + flashJS: _sm + ': Attempting to call Flash from JS..', + noPolling: _sm + ': Polling (whileloading()/whileplaying() support) is disabled.', + secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', + badRemove: 'Warning: Failed to remove flash movie.', + noPeak: 'Warning: peakData features unsupported for movieStar formats', + shutdown: _sm + '.disable(): Shutting down', + queue: _sm + '.onready(): Queueing handler', + smFail: _sm + ': Failed to initialise.', + smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', + fbTimeout: 'No flash response, applying .'+_s.swfCSS.swfTimedout+' CSS..', + fbLoaded: 'Flash loaded', + fbHandler: 'soundManager::flashBlockHandler()', + manURL: 'SMSound.load(): Using manually-assigned URL', + onURL: _sm + '.load(): current URL already assigned.', + badFV: 'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', + as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', + noNSLoop: 'Note: Looping not implemented for MovieStar formats', + needfl9: 'Note: Switching to flash 9, required for MP4 formats.', + mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', + mfOn: 'mobileFlash::enabling on-screen flash repositioning', + policy: 'Enabling usePolicyFile for data access' + // </d> + }; + + _id = function(sID) { + return _doc.getElementById(sID); + }; + + _str = function() { // o [,items to replace] + // <d> + var args = _slice.call(arguments), // real array, please + o = args.shift(), // first arg + str = (_strings && _strings[o]?_strings[o]:''), i, j; + if (str && args && args.length) { + for (i = 0, j = args.length; i < j; i++) { + str = str.replace('%s', args[i]); + } + } + return str; + // </d> + }; + + _loopFix = function(sOpt) { + // flash 8 requires stream = false for looping to work + if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) { + _wDS('as2loop'); + sOpt.stream = false; + } + return sOpt; + }; + + _policyFix = function(sOpt, sPre) { + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + _s._wD((sPre?sPre+':':'') + _str('policy')); + sOpt.usePolicyFile = true; + } + return sOpt; + }; + + _complain = function(sMsg) { + if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { + console.warn(sMsg); + } else { + _s._wD(sMsg); + } + }; + + _doNothing = function() { + return false; + }; + + _disableObject = function(o) { + for (var oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = _doNothing; + } + } + oProp = null; + }; + + _failSafely = function(bNoDisable) { + // general failure exception handler + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled || bNoDisable) { + _wDS('smFail', 2); + _s.disable(bNoDisable); + } + }; + + _normalizeMovieURL = function(smURL) { + var urlParams = null; + if (smURL) { + if (smURL.match(/\.swf(\?\.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + return smURL; // assume user knows what they're doing + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + smURL = smURL + '/'; + } + } + return (smURL && smURL.lastIndexOf('/') !== - 1?smURL.substr(0, smURL.lastIndexOf('/') + 1):'./') + _s.movieURL; + }; + + _setVersionInfo = function() { + if (_fV !== 8 && _fV !== 9) { + _s._wD(_str('badFV', _fV, _defaultFlashVersion)); + _s.flashVersion = _defaultFlashVersion; + } + var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); // debug flash movie, if applicable + if (_s.flashVersion < 9 && _s.useHTML5Audio && _s.audioFormats.mp4.required) { + _s._wD(_str('needfl9')); + _s.flashVersion = 9; + } + _fV = _s.flashVersion; // short-hand for internal use + _s.version = _s.versionNumber + (_html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + // set up default options + if (_fV > 8) { + _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); + _s.features.buffering = true; + } + if (_fV > 8 && _s.useMovieStar) { + // flash 9+ support for movieStar formats as well as MP3 + _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); + _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _s.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + _s.mimePattern = _s.netStreamMimeTypes; + _s.features.movieStar = true; + } else { + _s.features.movieStar = false; + } + _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; + _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf',isDebug); + _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); + }; + + _setPolling = function(bPolling, bHighPerformance) { + if (!_s.o || !_s.allowPolling) { + return false; + } + _s.o._setPolling(bPolling, bHighPerformance); + }; + + (function() { + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + function getArgs(oArgs) { + var args = _slice.call(oArgs), len = args.length; + if (old) { + args[1] = 'on' + args[1]; // prefix + if (len > 3) { + args.pop(); // no capture + } + } else if (len === 3) { + args.push(false); + } + return args; + } + + function apply(args, sType) { + var oFunc = args.shift()[evt[sType]]; + if (old) { + oFunc(args[0], args[1]); + } else { + oFunc.apply(this, args); + } + } + + _addEvt = function() { + apply(getArgs(arguments), 'add'); + }; + + _removeEvt = function() { + apply(getArgs(arguments), 'remove'); + }; + }()); + + function _initDebug() { + if (_s.debugURLParam.test(_wl)) { + _s.debugMode = true; // allow force of debug mode via URL + } + // <d> + if (_id(_s.debugID)) { + return false; + } + var oD, oDebug, oTarget, oToggle, tmp; + if (_s.debugMode && !_id(_s.debugID) && ((!_hasConsole || !_s.useConsole) || (_s.useConsole && _hasConsole && !_s.consoleOnly))) { + oD = _doc.createElement('div'); + oD.id = _s.debugID + '-toggle'; + oToggle = { + 'position': 'fixed', + 'bottom': '0px', + 'right': '0px', + 'width': '1.2em', + 'height': '1.2em', + 'lineHeight': '1.2em', + 'margin': '2px', + 'textAlign': 'center', + 'border': '1px solid #999', + 'cursor': 'pointer', + 'background': '#fff', + 'color': '#333', + 'zIndex': 10001 + }; + oD.appendChild(_doc.createTextNode('-')); + oD.onclick = _toggleDebug; + oD.title = 'Toggle SM2 debug console'; + if (_ua.match(/msie 6/i)) { + oD.style.position = 'absolute'; + oD.style.cursor = 'hand'; + } + for (tmp in oToggle) { + if (oToggle.hasOwnProperty(tmp)) { + oD.style[tmp] = oToggle[tmp]; + } + } + oDebug = _doc.createElement('div'); + oDebug.id = _s.debugID; + oDebug.style.display = (_s.debugMode?'block':'none'); + if (_s.debugMode && !_id(oD.id)) { + try { + oTarget = _getDocument(); + oTarget.appendChild(oD); + } catch(e2) { + throw new Error(_str('appXHTML')); + } + oTarget.appendChild(oDebug); + } + } + oTarget = null; + // </d> + } + + _mobileFlash = (function(){ + + var oM = null; + + function resetPosition() { + if (oM) { + oM.left = oM.top = '-9999px'; + } + } + + function reposition() { + oM.left = _win.scrollX+'px'; + oM.top = _win.scrollY+'px'; + } + + function setReposition(bOn) { + _s._wD('mobileFlash::flash on-screen hack: '+(bOn?'ON':'OFF')); + var f = _win[(bOn?'add':'remove')+'EventListener']; + f('resize', reposition, false); + f('scroll', reposition, false); + } + + function check(inDoc) { + // mobile flash (Android for starters) check + oM = _s.oMC.style; + if (_ua.match(/android/i)) { + if (inDoc) { + if (_s.flashLoadTimeout) { + _s._wDS('mfTimeout'); + _s.flashLoadTimeout = 0; + } + return false; + } + _s._wD('mfOn'); + oM.position = 'absolute'; + oM.left = oM.top = '0px'; + setReposition(true); + _s.onready(function(){ + setReposition(false); // detach + resetPosition(); // restore when OK/timed out + }); + reposition(); + } + return true; + } + + return { + 'check': check + }; + + }()); + + _createMovie = function(smID, smURL) { + + var specialCase = null, + remoteURL = (smURL?smURL:_s.url), + localURL = (_s.altURL?_s.altURL:remoteURL), + oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), s, x, sClass, side = '100%', isRTL = null, html = _doc.getElementsByTagName('html')[0]; + isRTL = (html && html.dir && html.dir.match(/rtl/i)); + smID = (typeof smID === 'undefined'?_s.id:smID); + + if (_didAppend && _appendSuccess) { + return false; // ignore if already succeeded + } + + function _initMsg() { + _s._wD('-- SoundManager 2 ' + _s.version + (!_html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (_s.useMovieStar?', MovieStar mode':'') + (_s.useHighPerformance?', high performance mode, ':', ') + ((_s.useFastPolling?'fast':'normal') + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') + ' --', 1); + } + + if (_html5Only) { + _setVersionInfo(); + _initMsg(); + _s.oMC = _id(_s.movieID); + _init(); + // prevent multiple init attempts + _didAppend = true; + _appendSuccess = true; + return false; + } + + _didAppend = true; + + // safety check for legacy (change to Flash 9 URL) + _setVersionInfo(); + _s.url = _normalizeMovieURL(this._overHTTP?remoteURL:localURL); + smURL = _s.url; + + _s.wmode = (!_s.wmode && _s.useHighPerformance && !_s.useMovieStar?'transparent':_s.wmode); + + if (_s.wmode !== null && !_isIE && !_s.useHighPerformance && navigator.platform.match(/win32/i)) { + _s.specialWmodeCase = true; + // extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here + // does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout + _wDS('spcWmode'); + _s.wmode = null; + } + + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'width': side, + 'height': side, + 'quality': 'high', + 'allowScriptAccess': _s.allowScriptAccess, + 'bgcolor': _s.bgColor, + 'pluginspage': 'http://www.macromedia.com/go/getflashplayer', + 'type': 'application/x-shockwave-flash', + 'wmode': _s.wmode + }; + + if (_s.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + + if (!_s.wmode) { + delete oEmbed.wmode; // don't write empty attribute + } + + if (_isIE) { + // IE is "special". + oMovie = _doc.createElement('div'); + movieHTML = '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" width="' + oEmbed.width + '" height="' + oEmbed.height + '"><param name="movie" value="' + smURL + '" /><param name="AllowScriptAccess" value="' + _s.allowScriptAccess + '" /><param name="quality" value="' + oEmbed.quality + '" />' + (_s.wmode?'<param name="wmode" value="' + _s.wmode + '" /> ':'') + '<param name="bgcolor" value="' + _s.bgColor + '" />' + (_s.debugFlash?'<param name="FlashVars" value="' + oEmbed.FlashVars + '" />':'') + '<!-- --></object>'; + } else { + oMovie = _doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + } + + _initDebug(); + extraClass = _getSWFCSS(); + oTarget = _getDocument(); + + if (oTarget) { + _s.oMC = _id(_s.movieID)?_id(_s.movieID):_doc.createElement('div'); + if (!_s.oMC.id) { + _s.oMC.id = _s.movieID; + _s.oMC.className = _s.swfCSS.swfDefault + ' ' + extraClass; + // "hide" flash movie + s = null; + oEl = null; + if (!_s.useFlashBlock) { + if (_s.useHighPerformance) { + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + if (_ua.match(/webkit/i)) { + _s.oMC.style.zIndex = 10000; // soundcloud-reported render/crash fix, safari 5 + } + if (!_s.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + _s.oMC.style[x] = s[x]; + } + } + } + try { + if (!_isIE) { + _s.oMC.appendChild(oMovie); + } + oTarget.appendChild(_s.oMC); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _s.swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + } catch(e) { + throw new Error(_str('appXHTML')); + } + _mobileFlash.check(); + } else { + // it's already in the document. + sClass = _s.oMC.className; + _s.oMC.className = (sClass?sClass+' ':_s.swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + _s.oMC.appendChild(oMovie); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _s.swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + _mobileFlash.check(true); + } + } + + if (specialCase) { + _s._wD(specialCase); + } + + _initMsg(); + _s._wD('soundManager::createMovie(): Trying to load ' + smURL + (!this._overHTTP && _s.altURL?' (alternate URL)':''), 1); + + return true; + }; + + _idCheck = this.getSoundById; + + _initMovie = function() { + if (_html5Only) { + _createMovie(); + return false; + } + // attempt to get, or create, movie + if (_s.o) { + return false; // may already exist + } + _s.o = _s.getMovie(_s.id); // inline markup + if (!_s.o) { + if (!_oRemoved) { + // try to create + _createMovie(_s.id, _s.url); + } else { + // try to re-append removed movie after reboot() + if (!_isIE) { + _s.oMC.appendChild(_oRemoved); + } else { + _s.oMC.innerHTML = _oRemovedHTML; + } + _oRemoved = null; + _didAppend = true; + } + _s.o = _s.getMovie(_s.id); + } + if (_s.o) { + _s._wD('soundManager::initMovie(): Got '+_s.o.nodeName+' element ('+(_didAppend?'created via JS':'static HTML')+')'); + _wDS('waitEI'); + } + if (_s.oninitmovie instanceof Function) { + setTimeout(_s.oninitmovie, 1); + } + return true; + }; + + _go = function(sURL) { + // where it all begins. + if (sURL) { + _s.url = sURL; + } + _initMovie(); + }; + + _delayWaitForEI = function() { + setTimeout(_waitForEI, 500); + }; + + _waitForEI = function() { + if (_waitingForEI) { + return false; + } + _waitingForEI = true; + _removeEvt(_win, 'load', _delayWaitForEI); + if (_tryInitOnFocus && !_isFocused) { + _wDS('waitFocus'); + return false; + } + var p; + if (!_didInit) { + p = _s.getMoviePercent(); + _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':'')))); + } + setTimeout(function() { + p = _s.getMoviePercent(); + if (!_didInit) { + _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2); + if (!this._overHTTP && p) { + _wDS('localFail', 2); + if (!_s.debugFlash) { + _wDS('tryDebug', 2); + } + } + if (p === 0) { + // if 0 (not null), probably a 404. + _s._wD(_str('swf404', _s.url)); + } + _debugTS('flashtojs', false, ': Timed out' + this._overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); + } + // give up / time-out, depending + if (!_didInit && _okToDisable) { + if (p === null) { + // SWF failed. Maybe blocked. + if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _wDS('waitForever'); + } else { + // old SM2 behaviour, simply fail + _failSafely(true); + } + } else { + // flash loaded? Shouldn't be a blocking issue, then. + if (_s.flashLoadTimeout === 0) { + _wDS('waitForever'); + } else { + _failSafely(true); + } + } + } + }, _s.flashLoadTimeout); + }; + + _go = function(sURL) { + // where it all begins. + if (sURL) { + _s.url = sURL; + } + _initMovie(); + }; + + // <d> + _wDS = function(o, errorLevel) { + if (!o) { + return ''; + } else { + return _s._wD(_str(o), errorLevel); + } + }; + + if (_wl.indexOf('debug=alert') + 1 && _s.debugMode) { + _s._wD = function(sText) {alert(sText);}; + } + + _toggleDebug = function() { + var o = _id(_s.debugID), + oT = _id(_s.debugID + '-toggle'); + if (!o) { + return false; + } + if (_debugOpen) { + // minimize + oT.innerHTML = '+'; + o.style.display = 'none'; + } else { + oT.innerHTML = '-'; + o.style.display = 'block'; + } + _debugOpen = !_debugOpen; + }; + + _debugTS = function(sEventType, bSuccess, sMessage) { + // troubleshooter debug hooks + if (typeof sm2Debugger !== 'undefined') { + try { + sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); + } catch(e) { + // oh well + } + } + return true; + }; + // </d> + + _getSWFCSS = function() { + var css = []; + if (_s.debugMode) { + css.push(_s.swfCSS.sm2Debug); + } + if (_s.debugFlash) { + css.push(_s.swfCSS.flashDebug); + } + if (_s.useHighPerformance) { + css.push(_s.swfCSS.highPerf); + } + return css.join(' '); + }; + + _flashBlockHandler = function() { + // *possible* flash block situation. + var name = _str('fbHandler'), p = _s.getMoviePercent(); + if (!_s.supported()) { + if (_needsFlash) { + // make the movie more visible, so user can fix + _s.oMC.className = _getSWFCSS() + ' ' + _s.swfCSS.swfDefault + ' ' + (p === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError); + _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':'')); + } + _s.didFlashBlock = true; + _processOnReady(true); // fire onready(), complain lightly + if (_s.onerror instanceof Function) { + _s.onerror.apply(_win); + } + } else { + // SM2 loaded OK (or recovered) + if (_s.didFlashBlock) { + _s._wD(name+': Unblocked'); + } + if (_s.oMC) { + _s.oMC.className = _getSWFCSS() + ' ' + _s.swfCSS.swfDefault + (' '+_s.swfCSS.swfUnblocked); + } + } + }; + + _handleFocus = function() { + function cleanup() { + _removeEvt(_win, 'focus', _handleFocus); + _removeEvt(_win, 'load', _handleFocus); + } + if (_isFocused || !_tryInitOnFocus) { + cleanup(); + return true; + } + _okToDisable = true; + _isFocused = true; + _s._wD('soundManager::handleFocus()'); + if (_isSafari && _tryInitOnFocus) { + // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event + _removeEvt(_win, 'mousemove', _handleFocus); + } + // allow init to restart + _waitingForEI = false; + cleanup(); + return true; + }; + + _initComplete = function(bNoDisable) { + if (_didInit) { + return false; + } + if (_html5Only) { + // all good. + _s._wD('-- SoundManager 2: loaded --'); + _didInit = true; + _processOnReady(); + _initUserOnload(); + return true; + } + var sClass = _s.oMC.className, + wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()); + if (!wasTimeout) { + _didInit = true; + } + _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1); + if (_disabled || bNoDisable) { + if (_s.useFlashBlock) { + _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError); + } + _processOnReady(); + _debugTS('onload', false); + if (_s.onerror instanceof Function) { + _s.onerror.apply(_win); + } + return false; + } else { + _debugTS('onload', true); + } + if (_s.waitForWindowLoad && !_windowLoaded) { + _wDS('waitOnload'); + _addEvt(_win, 'load', _initUserOnload); + return false; + } else { + if (_s.waitForWindowLoad && _windowLoaded) { + _wDS('docLoaded'); + } + _initUserOnload(); + } + return true; + }; + + _addOnReady = function(oMethod, oScope) { + _onready.push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + }; + + _processOnReady = function(ignoreInit) { + if (!_didInit && !ignoreInit) { + // not ready yet. + return false; + } + var status = { + success: (ignoreInit?_s.supported():!_disabled) + }, + queue = [], i, j, + canRetry = (!_s.useFlashBlock || (_s.useFlashBlock && !_s.supported())); + for (i = 0, j = _onready.length; i < j; i++) { + if (_onready[i].fired !== true) { + queue.push(_onready[i]); + } + } + if (queue.length) { + _s._wD(_sm + ': Firing ' + queue.length + ' onready() item' + (queue.length > 1?'s':'')); + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, [status]); + } else { + queue[i].method(status); + } + if (!canRetry) { // flashblock case doesn't count here + queue[i].fired = true; + } + } + } + return true; + }; + + _initUserOnload = function() { + _win.setTimeout(function() { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _processOnReady(); + _wDS('onload', 1); + // call user-defined "onload", scoped to window + if (_s.onload instanceof Function) { + _s.onload.apply(_win); + } + _wDS('onloadOK', 1); + if (_s.waitForWindowLoad) { + _addEvt(_win, 'load', _initUserOnload); + } + },1); + }; + + _featureCheck = function() { + var needsFlash, item, + isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && _ua.match(/OS X 10_6_(3|4)/i)), // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Known Apple "radar" bug. https://bugs.webkit.org/show_bug.cgi?id=32159 + isSpecial = (_ua.match(/iphone os (1|2|3_0|3_1)/i)?true:false); // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works. + if (isSpecial) { + _s.hasHTML5 = false; // has Audio(), but is broken; let it load links directly. + _html5Only = true; // ignore flash case, however + if (_s.oMC) { + _s.oMC.style.display = 'none'; + } + return false; + } + if (_s.useHTML5Audio) { + if (!_s.html5 || !_s.html5.canPlayType) { + _s._wD('SoundManager: No HTML5 Audio() support detected.'); + _s.hasHTML5 = false; + return true; + } else { + _s.hasHTML5 = true; + } + if (isBadSafari) { + _s._wD('SoundManager::Note: Buggy HTML5 Audio in Safari on OS X 10.6.[3|4], see https://bugs.webkit.org/show_bug.cgi?id=32159 - disabling HTML5 audio',1); + _s.useHTML5Audio = false; + _s.hasHTML5 = false; + return true; + } + } else { + // flash required. + return true; + } + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item) && _s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) { + // may need flash for this format? + needsFlash = true; + } + } + // sanity check.. + if (_s.ignoreFlash) { + needsFlash = false; + } + _html5Only = (_s.useHTML5Audio && _s.hasHTML5 && !needsFlash); + return needsFlash; + }; + + _init = function() { + var item, tests = []; + _wDS('init'); + + // called after onload() + if (_didInit) { + _wDS('didInit'); + return false; + } + + function _cleanup() { + _removeEvt(_win, 'load', _s.beginDelayedInit); + } + + if (_s.hasHTML5) { + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + tests.push(item+': '+_s.html5[item]); + } + } + _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1); + } + + if (_html5Only) { + if (!_didInit) { + // we don't need no steenking flash! + _cleanup(); + _s.enabled = true; + _initComplete(); + } + return true; + } + + // flash path + _initMovie(); + try { + _wDS('flashJS'); + _s.o._externalInterfaceTest(false); // attempt to talk to Flash + if (!_s.allowPolling) { + _wDS('noPolling', 1); + } else { + _setPolling(true, _s.useFastPolling?true:false); + } + if (!_s.debugMode) { + _s.o._disableDebug(); + } + _s.enabled = true; + _debugTS('jstoflash', true); + } catch(e) { + _s._wD('js/flash exception: ' + e.toString()); + _debugTS('jstoflash', false); + _failSafely(true); // don't disable, for reboot() + _initComplete(); + return false; + } + _initComplete(); + // event cleanup + _cleanup(); + return true; + }; + + _beginInit = function() { + if (_initPending) { + return false; + } + _createMovie(); + _initMovie(); + _initPending = true; + return true; + }; + + _dcLoaded = function() { + if (_didDCLoaded) { + return false; + } + _didDCLoaded = true; + _initDebug(); + _testHTML5(); + _s.html5.usingFlash = _featureCheck(); + _needsFlash = _s.html5.usingFlash; + _didDCLoaded = true; + if (_doc.removeEventListener) { + _doc.removeEventListener('DOMContentLoaded', _dcLoaded, false); + } + _go(); + return true; + }; + + _startTimer = function(oSound) { + if (!oSound._hasTimer) { + oSound._hasTimer = true; + } + }; + + _stopTimer = function(oSound) { + if (oSound._hasTimer) { + oSound._hasTimer = false; + } + }; + + _die = function() { + if (_s.onerror instanceof Function) { + _s.onerror(); + } + _s.disable(); + }; + + // pseudo-private methods called by Flash + + this._setSandboxType = function(sandboxType) { + // <d> + var sb = _s.sandbox; + sb.type = sandboxType; + sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')]; + _s._wD('Flash security sandbox type: ' + sb.type); + if (sb.type === 'localWithFile') { + sb.noRemote = true; + sb.noLocal = false; + _wDS('secNote', 2); + } else if (sb.type === 'localWithNetwork') { + sb.noRemote = false; + sb.noLocal = true; + } else if (sb.type === 'localTrusted') { + sb.noRemote = false; + sb.noLocal = false; + } + // </d> + }; + + this._externalInterfaceOK = function(flashDate) { + // flash callback confirming flash loaded, EI working etc. + // flashDate = approx. timing/delay info for JS/flash bridge + if (_s.swfLoaded) { + return false; + } + var eiTime = new Date().getTime(); + _s._wD('soundManager::externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':'')); + _debugTS('swf', true); + _debugTS('flashtojs', true); + _s.swfLoaded = true; + _tryInitOnFocus = false; + if (_isIE) { + // IE needs a timeout OR delay until window.onload - may need TODO: investigating + setTimeout(_init, 100); + } else { + _init(); + } + }; + + _dcIE = function() { + if (_doc.readyState === 'complete') { + _dcLoaded(); + _doc.detachEvent('onreadystatechange', _dcIE); + } + return true; + }; + + // focus and window load, init + if (!_s.hasHTML5 || _needsFlash) { + // only applies to Flash mode + _addEvt(_win, 'focus', _handleFocus); + _addEvt(_win, 'load', _handleFocus); + _addEvt(_win, 'load', _delayWaitForEI); + if (_isSafari && _tryInitOnFocus) { + _addEvt(_win, 'mousemove', _handleFocus); // massive Safari focus hack + } + } + + if (_doc.addEventListener) { + _doc.addEventListener('DOMContentLoaded', _dcLoaded, false); + } else if (_doc.attachEvent) { + _doc.attachEvent('onreadystatechange', _dcIE); + } else { + // no add/attachevent support - safe to assume no JS -> Flash either + _debugTS('onload', false); + _die(); + } + + if (_doc.readyState === 'complete') { + setTimeout(_dcLoaded,100); + } + +} // SoundManager() + +// var SM2_DEFER = true; +// details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading + +if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { + soundManager = new SoundManager(); +} + +// public interfaces +window.SoundManager = SoundManager; // constructor +window.soundManager = soundManager; // public instance: API, Flash callbacks etc. + +}(window)); +var d = + { + DEBUG: false, + act: function (s) + { + // $('#msg').append('<strong>'+s+'</strong><br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + joy: function (s) + { + // $('#msg').append('<b>'+s+'</b><br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + warn: function (s) + { + // $('#msg').append(s+'<br/>') + // d.scrollToBottom("#msg") + // if (d.DEBUG) + // console.log(s) + return false + }, + error: function (s) + { + // $('#msg').append('<em>ERROR: '+s+'</em><br/>') + // d.scrollToBottom("#msg") + // console.log(s) + return false + }, + noop: function () {}, + scrollToTop: function (elem) + { + $(elem).scrollTop( 0 ) + }, + scrollToBottom: function (elem) + { + try + { + $(elem).scrollTop( $(elem)[0].scrollHeight ) + } + catch (err) + { + } + }, + pageUp: function (div) + { + var st = $(div).scrollTop() + var h = $(window).height() + d.warn("PAGEUP: "+st+" "+h) + $(div).scrollTop( st - (2/3) * h ) + var st = $(div).scrollTop() + d.warn("ST NOW: "+st+" "+h) + }, + pageDown: function (div) + { + var st = $(div).scrollTop() + var h = $(window).height() + $(div).scrollTop( st + (2/3) * h ) + }, + choice: function (list) + { + return list[Math.floor (Math.random () * list.length)] + }, + trim: function (s) + { + if (s) + return s.replace(/^\s+|\s+$/g,"") + else + return "" + }, + sanitizeWithNewlines: function (s) + { + if (s) + return d.trim( s ).replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/\0/g,"") + return "" + }, + sanitize: function (s) + { + if (s) + return d.trim( s ).replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/\n/g,"").replace(/\r/g,"").replace(/\0/g,"") + return "" + }, + linkify: function (s) + { + var words = s.split(" ") + var checked = [] + for (i in words) + { + var word = words[i] + if (words[i].indexOf("http") === 0) + { + var poffset = word.indexOf('//') + var linktext = word.substr(poffset+2, word.indexOf('/', poffset+2)) + checked.push('<a href="'+word+'" target="_blank">'+linktext+'</a>') + } + else + checked.push(word) + } + return checked.join(" ") + }, + enableStylesheet: function (style) + { + $("link[@rel*=style][title]").each(function (i) + { + if (this.getAttribute('title') == style) + this.disabled = false + }) + }, + disableStylesheet: function (style) + { + $("link[@rel*=style][title]").each(function (i) + { + if (this.getAttribute('title') == style) + this.disabled = true + }) + }, + buildLookup: function (list) + { + var lookup = {} + for (var i = 0; i < list.length; i++) + lookup[list[i]] = true + return lookup + } + } + +var API = + { + HEADER: "#@scanjam 0.2", + BASE_URL: "http://"+serverHost+":"+serverPort, + URL: + { + auth: + { + login: "/api/auth/login", + logout: "/api/auth/logout", + checkin: "/api/auth/checkin", + sneakin: "/api/auth/sneakin", + }, + room: + { + join: "/api/room/join", + list: "/api/room/list", + view: "/api/room/view", + poll: "/api/room/poll", + watch: "/api/room/watch", + say: "/api/room/say", + settings: "/api/room/settings", + stats: "/stats", + }, + video: + { + date: "/api/video/date", + like: "/api/video/like", + unlike: "/api/video/unlike", + remove: "/api/video/remove", + search: "/api/video/search", + }, + user: + { + settings: "/api/user/settings", + videos: "/api/user/videos", + likes: "/api/user/likes", + }, + }, + error: function (s) + { + d.error("API: "+s) + return false + }, + parse: function (api, raw) + { + if (! raw) + return API.error("no result") + var lines = raw.split("\n") + if (lines.shift() !== API.HEADER) + return API.error("bad header") + if (! lines.length) + return API.error("no content") + return lines + }, + init: function () + { + d.warn("INIT API") + for (type in API.URL) + { + for (name in API.URL[type]) + { + API.URL[type][name] = API.BASE_URL + API.URL[type][name] + } + } + // $.ajaxSetup({ timeout: 1000 }) + } + } +var Local = + { + support: false, + hash: null, + get: null, + set: null, + _html5_get: function (key) + { + var val = localStorage["scanjam."+key] + if (val === "true") return true + if (val === "false") return false + if (val === "undefined") return undefined + return val + }, + _html5_set: function (key, val) + { + if (val === undefined) + localStorage["scanjam."+key] = "" + else + localStorage["scanjam."+key] = val + }, + _hash_get: function (key) + { + if (key in Local.hash) + return Local.hash[key] + }, + _hash_set: function (key, val) + { + Local.hash[key] = val + }, + _supports_html5_storage: function () + { + try + { return 'localStorage' in window && window['localStorage'] !== null; } + catch (e) + { return false } + }, + like: function (videoid) + { Local.set("like."+videoid, true) }, + unlike: function (videoid) + { Local.set("like."+videoid, false) }, + isLiked: function (videoid) + { return Local.get("like."+videoid) }, + init: function () + { + Local.support = Local._supports_html5_storage() + if (Local.support) + { + d.warn("SUPPORTS LOCAL STORAGE") + Local.get = Local._html5_get + Local.set = Local._html5_set + } + else + { + d.error("NO LOCAL STORAGE") + Local.hash = {} + Local.get = Local._hash_get + Local.set = Local._hash_set + } + } + } +API.init() +Local.init() + +var Auth = + { + userid: false, + username: false, + session: false, + loaded: false, + access: 0, + login: function () + { + d.warn("LOG IN") + var username = d.trim( $("#login-username").val() ) + var password = d.trim( $("#login-password").val() ) + var pwhash = $.md5("scanjam"+password) + if (! username || ! password) return + Main.enter = false + d.warn("LOGGING IN") + $.post(API.URL.auth.login, {'username':username, 'password': pwhash}, Auth.loginCallback) + $("#chat").hide() + }, + loginCallback: function (raw) + { + var lines = API.parse("/auth/login", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + u = lines[1].split("\t") + + Auth.userid = u[0] + Auth.username = u[1] + Auth.session = u[2] + Auth.access = u[3] + + document.cookie = "session="+Auth.session+";path=/;domain=.scannerjammer.com;max-age=1086400" + Auth.success() + }, + checkin: function () + { + d.warn("CHECK IN") + $.post(API.URL.auth.checkin, {'session':Auth.session}, Auth.checkinCallback) + }, + checkinCallback: function (raw) + { + var lines = API.parse("/auth/checkin", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + u = lines[1].split("\t") + Auth.userid = u[0] + Auth.username = u[1] + Auth.success() + }, + sneakin: function (userid,username) + { + d.warn("SNEAK IN") + $.post(API.URL.auth.sneakin, {'userid':userid,'username':username}).success(Auth.sneakinCallback) + }, + sneakinCallback: function (raw) + { + var lines = API.parse("/auth/sneakin", raw) + if (! lines.length) return + if (lines[0] !== "OK") + { + alert(lines[0].split("\t")[1]) + return Auth.error() + } + d.joy("snuck in!") + u = lines[1].split("\t") + + Auth.userid = u[0] + Auth.username = u[1] + Auth.session = u[2] + Auth.access = u[3] + + d.warn(lines[1]) + if (! Auth.session) + return + document.cookie = "session="+Auth.session+";path=/;domain=.scannerjammer.com;max-age=1086400" + Auth.success() + }, + logout: function () + { + d.warn("LOG OUT") + clearTimeout(Room.timer) + Room.unload() + Auth.userid = false + Auth.username = false + Local.set('userid', false) + Local.set('username', false) + document.cookie = "session=false;path=/;domain=.scannerjammer.com;max-age=0" + Auth.session = "" + Auth.load() + }, + error: function () + { + Auth.load() + }, + success: function () + { + d.joy("logged in as "+Auth.username) + Auth.unload() + Room.load() + }, + unload: function () + { + d.warn("AUTH UNLOAD") + $("#login").hide() + $("#loading").show() + Keyboard.enter = false + Auth.loaded = false + }, + load: function () + { + d.warn("AUTH LOAD") + $("#loading").hide() + $("#login").show() + $("#login-username").focus() + $("#login-username").keydown(Keyboard.textareaMap) + $("#login-password").keydown(Keyboard.textareaMap) + $("#login-password").val("") + $("#login-go").click(Auth.login) + Keyboard.enter = Auth.login + $("#bg").show() + Auth.loaded = true + }, + init: function () + { + d.warn("INIT AUTH") + if (document.cookie) + { + d.warn("got a cookie") + d.warn(document.cookie) + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("session") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Auth.session = cookie[1] + break + } + } + } + d.warn("got sessionid "+Auth.session) + if (Auth.session) + return true + } + var userid = Local.get('userid') + var username = Local.get('username') + if (userid && username) + { + d.warn("attempting to sneak in "+username) + Auth.sneakin(userid,username) + return true + } + return false + } + } + +var Like = + { + timeout: false, + likeVideoDelay: 1000, + likeMessageDelay: 10000, + favewords: + [ + 'dazzled', 'dangled', 'amazed', 'shocked', 'wowed', + 'spangled', 'glittered', 'blinged', 'jazzed', 'smoked', + 'rocked', 'jammed', 'stoked', 'blazed', 'pringled', 'engulfed', + ], + colors: + [ + "#ffa1b8","#ffb9a1","#ffe8a1","#ffa1e7","#a1a4ff","#cda1ff","#fca1ff","#a1d3ff","#e8a1ff","#a1f6ff","#a1ffaa","#c7ffa1" + ], + enqueue: function (username) + { + d.joy("liked by "+username) + $("#likereport").append( + $("<a>").attr("href","/profile/"+username).html(username+" was "+d.choice(Like.favewords)+"!").attr("style","color:"+d.choice(Like.colors))) + if (Viewport.focused) + Like.fire() + else + Like.pending = true + }, + fire: function () + { + d.joy("LIKE ANIMATION GO") + Like.pending = false + $("#likereport").stop(false,false).show() + d.scrollToBottom("#likereport") + $("#plant").stop(true, true).show() + $("#flower").stop(true, true).show() + if (Like.timeout) + clearTimeout(Like.timeout) + Like.timeout = setTimeout(Like.queueFade, 1000) + }, + queueFade: function timeout() + { + d.joy("LIKE ANIMATION FADE") + Like.timeout = false + $("#plant").fadeOut(Like.likeVideoDelay) + $("#flower").fadeOut(Like.likeVideoDelay) + $("#likereport").fadeOut(Like.likeMessageDelay, function(){$("#likereport").html("")}) + }, + likeVideo: function (video) + { + if (! Auth.session) + return d.error("like: not logged in") + if (video.username === Auth.username) + return d.error("like: that's you") + var data = { video: video.id, session: Auth.session, } + if (Local.isLiked(video.id)) + { + d.joy("unliking "+video.key) + if (Player.currentKey === video.key) + $("#like").removeClass("liked") + $("#like_"+video.id).removeClass("liked").html(" like") + video.liked = false + Local.unlike(video.id) + if (video.score) + { + video.score -= 1 + if (video.score < 0) + { + video.score = 0 + $("#score_"+video.id).html(' ') + } + else + { + $("#score_"+video.id).html(video.score) + } + } + $.post(API.URL.video.unlike, data) + } + else + { + d.joy("liking "+video.key) + if (Player.currentKey === video.key) + $("#like").addClass("liked") + $("#like_"+video.id).addClass("liked").html("liked") + $("#flower").show().fadeOut(Like.likeVideoDelay) + video.liked = true + Local.like(video.id) + if (video.score) + { + video.score += 1 + $("#score_"+video.id).html(video.score) + } + $.post(API.URL.video.like, data) + } + }, + init: function () + { + } + } + +YOUTUBE_SEARCH_URL = "https://gdata.youtube.com/feeds/api/videos" +YOUTUBE_URL_PREFIX = "http://youtube.com/watch?v=" +function courtesy_s (quantity, noun) + { + if (quantity > 1) + return quantity + " " + noun + "s" + return quantity + " " + noun + } +var Search = + { + start: 0, + limit: 20, + sj: function () + { + Search.start = 0 + Search.terms = $("#search-terms").val() + Search.sjSearch (Search.terms, Search.start) + }, + sjSearch: function (terms, start) + { + var params = + { + "q": terms, + "start": Search.start, + "limit": Search.limit, + "session": Auth.session, + } + $.post(API.URL.video.search, params, Search.sjCallback) + $("#search-instructions").hide() + $("#search-results").html("").hide() + $("#search-loading").show() + $("#search-results-container").show() + }, + sjCallback: function (raw) + { + var lines = API.parse ("/video/search", raw) + var items = [] + for (var i = 0; i < lines.length; i++) + { + // 0 id 1 score 2 user 3 usercount 4 title 5 url 6 thumbnail + var line = lines[i].split("\t") + if (line.length < 7) + continue + var video = + { + url: line[5], + thumbnail: line[6], + title: line[4], + user: line[2], + quantify: "", + } + if (parseInt(line[3]) > 1) + video['user'] += " + " + courtesy_s (parseInt(line[3])-1, "other") + if (parseInt(line[1]) > 0) + video['quantify'] = courtesy_s (parseInt(line[1]), "like") + var tag = Search.resultTag (video) + items.push(tag) + } + if (items.length === Search.limit) + { + Search.start += Search.limit + $("#search-next-page").show() + } + else + { + $("#search-next-page").hide() + } + $("#search-loading").hide() + $("#search-results").html(items.join("")).show() + $("#search-instructions").show() + $("#curtain").bind("click", Search.close).css({"background-color": "transparent", "z-index": 99}).show() + }, + youtube: function () + { + var terms = $("#search-terms").val() + var params = + { + "q": terms, + "v": 2, + "alt": "jsonc", + } + $.get(YOUTUBE_SEARCH_URL, params, Search.youtubeCallback, "jsonp") + $("#search-results-container").show() + $("#search-results").html("").hide() + $("#search-loading").show() + }, + durationToString: function (duration) + { + return Math.floor(duration / 60) + ":" + (duration % 60) + }, + viewCountToString: function (viewCount) + { + if (! viewCount) + return '0' + var vc = viewCount.toString () + var commas = /(\d+)(\d{3})/; + while (commas.test(vc)) + { + vc = vc.replace(commas, '$1' + ',' + '$2'); + } + return vc + }, + resultTag: function (video) + { + var tag = "<li data-url='"+video['url']+"'>" + tag += "<div class='thumb' style='background-image: url(" + video['thumbnail'] + ")'></div>" + tag += "<h4>" + video['title'] + "</h4>" + tag += "<span class='metadata'>" + tag += video['user'] + tag += "<br/>" + tag += video['quantify'] + tag += "</span>" + tag += "<a href='"+video['url']+"' target='_blank' class='preview'>Preview</a>" + tag += "</li>" + return tag + }, + youtubeCallback: function (data) + { + var items = [] + for (var i = 0; i < data['data']['items'].length; i++) + { + var item = data['data']['items'][i] + var video = + { + url: YOUTUBE_URL_PREFIX+item['id'], + thumbnail: item['thumbnail']['sqDefault'], + title: item['title'], + user: item['uploader'], + quantify: Search.viewCountToString(item['viewCount']) + "views", + } + var tag = Search.resultTag (video) + items.push(tag) + } + $("#search-loading").hide() + $("#search-results").html(items.join("")).show() + }, + keydown: function (e) + { + if (e.keyCode === 13) + { + Search.sj () + } + if (e.keyCode === 27) + { + Search.close () + Keyboard.focusTextarea () + } + }, + nextPage: function () + { + Search.sjSearch (Search.terms, Search.start) + }, + loadResult: function () + { + var url = $(this).parent().data("url") + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: url}) + Search.close () + }, + close: function () + { + $("#curtain").unbind("click", Search.close).hide() + $("#search-results-container").hide() + $("#search-terms").val("") + }, + blurSearchTextarea: function () + { + $(window).unbind("keydown") + $("#chat-message").unbind("keydown").bind("keydown", Keyboard.textareaMap) + $("#chat-message").unbind("focus").focus().bind("focus", Keyboard.focusTextarea) + if ($("#chat-message").val().length === 0) + Keyboard.enteredText = false + }, + focusSearchTextarea: function () + { + $(window).unbind("keydown") + $("#chat-message").unbind("keydown") + }, + init: function () + { + $("#search-results li div").live("click", Search.loadResult) + $("#search-results li h4").live("click", Search.loadResult) + $("#search-results li span").live("click", Search.loadResult) + $("#search-terms").bind("keydown", Search.keydown) + $("#search-terms").bind("focus", Search.focusSearchTextarea) + $("#search-terms").bind("blur", Search.blurSearchTextarea) + // $("#search-terms").val("glock n my hand") + // Search.sj () + } + } +Search.init () + +var VIMEOregexp = /^(\bhttps?:\/\/)(www.)?vimeo.com\/([0-9]+).*$/i +var PLAY_BUTTONS = + { + prev: "<div class='arrow-prev'></div> <div class='arrow-prev'></div>", + next: "<div class='arrow-next'></div> <div class='arrow-next'></div>", + pause: "<div class='arrow-pause'></div> <div class='arrow-pause'></div>", + play: "<div class='arrow-play'></div>", + } +var Player = + { + videos: {}, + queue: [], + projectors: {}, + projector: null, + newVideos: false, + currentIdx: 0, + video: false, + errors: 0, + width: '100%', + height: '100%', + playlistOffset: 30, + queueOffset: 60, + paused: false, + muted: false, + enqueue: function (video) + { + if (! (video.type in Player.projectors)) + return d.error("unknown video type "+video.type) + var key = video.type+"_"+video.name + if (key in Player.videos) + { + Player.videos[key].idx = Player.queue.length + Player.videos[key].seen = false + if (video.offset) + Player.videos[key].offset = video.offset + d.warn("bumped "+key) + } + else + { + video.key = key + video.idx = Player.queue.length + Player.videos[key] = video + Player.newVideos = true + d.warn("enqueued "+key) + } + $("#"+video.key).html(video.title) + Player.queue.push(key) + return true + }, + clearQueue: function () + { + Player.queue = [] + Player.currentIdx = 0 + Playlist.count = 0 + }, + register: function (projector) + { + d.warn("registered "+projector.type) + Player.projectors[projector.type] = projector + }, + unregister: function (projectortype) + { + d.warn("unregistered "+projectortype) + delete Player.projectors[projectortype] + }, + start: function () + { + d.warn("PLAYER START") + Player.currentIdx = Player.queue.length - 1 + if (! Player.queue.length) + return d.error("empty queue") + Player.playLatest() + }, + finish: function () + { + d.warn("PLAYER FINISH") + d.warn("____________") + Player.playLatest() + }, + error: function (s) + { + if (s) + d.error(Player.errors+" "+s) + else + d.error("PLAYER ERROR "+Player.errors) + $("li#queue_"+Player.video.idx+" span.title").html("<i>This video cannot be embedded</i>") + Player.video.error = true + }, + playLatest: function () + { + d.warn("PLAY LATEST") + var idx = Player.currentIdx + var len = Player.queue.length + if (Player.newVideos) + { + for (i = idx; i < len; i++) + { + var video = Player.videos[Player.queue[i]] + d.warn("check "+Player.queue[i]) + if (video.seen) + continue + Player.currentIdx = i + d.joy("new video! "+video.key+" at "+i) + Player.queueJumpToCurrentVideo(Player.currentIdx) + Player.playVideo(video) + return + } + for (i = idx - 1; i >= 0; i--) + { + var video = Player.videos[Player.queue[i]] + d.warn("check "+Player.queue[i]) + if (video.seen) + continue + Player.currentIdx = i + d.joy("new video! "+video.key+" at "+i) + Player.queueJumpToCurrentVideo(Player.currentIdx) + Player.playVideo(video) + return + } + Player.newVideos = false + d.warn("no new videos") + } + Player.playNext() + }, + playNext: function () + { + d.warn("____________") + d.warn("PLAY NEXT") + var idx = Player.currentIdx + do + { + idx -= 1 + if (Player.queue[idx] === Player.video.key) + idx -= 1 + if (idx < 0) + idx = Player.queue.length - 1 + } + while (Player.videos[ Player.queue[idx] ].error === true) + Player.queueJumpToCurrentVideo(idx) + Player.playIdx(idx) + }, + playPrev: function () + { + d.warn("____________") + d.warn("PLAY PREV") + var idx = Player.currentIdx + do + { + idx = (idx + 1) % Player.queue.length + if (Player.queue[idx] === Player.video.key) + continue + } + while (Player.videos[ Player.queue[idx] ].error === true) + Player.queueJumpToCurrentVideo(idx) + Player.playIdx(idx) + }, + playKey: function (key) + { + Player.playVideo( Player.videos[key] ) + }, + playIdx: function (idx) + { + d.warn("play idx: "+idx) + Player.currentIdx = idx + Player.playVideo( Player.videos[Player.queue[idx]] ) + }, + throttle: function () + { + d.error("THROTTLED") + Player.stop() + Player.errors = 0 + }, + stop: function () + { + Player.projector.stop() + }, + playVideo: function (video) + { + if (! video) + { + d.error("GOT EMPTY VIDEO") + d.warn(Player.currentIdx) + d.warn(Player.queue[ Player.currentIdx ]) + d.warn(Player.videos[ Player.queue[ Player.currentIdx ] ]) + return + } + if (video.error === true) + { + Player.errors += 1 + d.error(video.key) + if (Player.errors > Player.queue.length) + return Player.throttle() + return Player.finish() + } + d.warn("PLAY VIDEO: "+video.key) + if (video.type !== Player.projector.type) + { + d.warn("SWITCHING PROJECTORS") + d.warn([Player.projector.type, video.type].join(" → ")) + Player.projector.unload() + Player.projector = Player.projectors[video.type] + Player.projector.load() + if (Player.muted) + Player.projector.setVolume(0) + } + video.seen = true + if (! Player.fullscreenMode) + { + $("#video-title").hide().html(video.title).fadeIn(100, function () { + setTimeout("$('#video-title').fadeOut(2000)", 4000) + }) + } + + Player.errors = 0 + Player.video = video + Player.projector.play(video) + Player.linkUpdate(video) + Player.currentIdx = video.idx + $("#queue li.playing").removeClass("playing") + $("#chat a.ytlink.playing").removeClass("playing") + $("#queue li").removeClass("playing") + $("li#queue_"+video.idx).addClass("playing") + $("#"+video.key).addClass("playing") + $("#"+video.key).html(video.title) + $("#like").removeClass("liked").html("LIKE") + $("#pause").html(PLAY_BUTTONS.pause) + if (Local.isLiked(video.id)) + { + $("#like").addClass("liked").html("LIKED") + } + }, + queueJumpToCurrentVideo: function (idx) + { + $("#playlist").scrollTop( $("li#queue_"+idx)[0].offsetTop - Player.playlistOffset ) + $("#queue").scrollTop( $("li#queue_"+idx)[0].offsetTop - Player.queueOffset ) + }, + toggle: function () + { + Player.projector.toggle() + }, + pause: function () + { + Player.projector.pause() + $("#pause").html(PLAY_BUTTONS.play) + }, + mute: function () + { + if (Player.projector) + { + if (Player.muted) + Player.projector.setVolume(100) + else + Player.projector.setVolume(0) + } + Player.muted = ! Player.muted + }, + muteClick: function () + { + if (Player.muted) + $("#mute").removeClass("muted") + else + $("#mute").addClass("muted") + Player.mute() + }, + prevClick: function () + { + d.act("+ clicked prev") + Player.playPrev() + }, + pauseClick: function () + { + d.act("+ clicked pause") + Player.errors = 0 + if (Player.projector.toggle()) + { + $("#pause").html(PLAY_BUTTONS.play) + d.warn("set to play") + } + else + { + $("#pause").html(PLAY_BUTTONS.pause) + d.warn("set to pause") + } + }, + nextClick: function () + { + d.act("+ clicked next") + Player.playNext() + }, + scanClick: function () + { + d.act("+ clicked scan") + Scanner.scan() + }, + likeClick: function () + { + d.act("+ clicked player like") + Like.likeVideo(Player.video) + }, + linkClick: function () + { + d.act("+ clicked permalink") + Player.pause() + }, + linkUpdate: function (video) + { + d.warn("UPDATING LINK") + $("#video-link").attr("href", video.src) + var vidurl = "http://scannerjammer.com/" + if (Room.name !== "main") + vidurl += Room.name+"/" + vidurl += "#v="+video.id + $("#sharebutton").attr("st_url", vidurl).attr("st_title", video.title) +/* + stWidget.addEntry({ + service: "sharethis", + element: document.getElementById("sharebutton"), + url: vidurl, + title: video.title, + summary: "ScannerJammer: Youtube video chat", + }) +*/ + }, + + fullscreenClick: function () + { + d.act("+ clicked fullscreen") + }, + setVolume: function (vol) + { + if (Player.projector && Player.projector.type !== 'null') + { + // alert(Player.projector.type) + Player.projector.setVolume(vol) + } + }, + init: function () + { + d.warn("PLAYER INIT") + $("#prev").html(PLAY_BUTTONS.prev) + $("#pause").html(PLAY_BUTTONS.play) + $("#next").html(PLAY_BUTTONS.next) + $("#prev").bind("click", Player.prevClick) + $("#pause").bind("click", Player.pauseClick) + $("#next").bind("click", Player.nextClick) + $("#scan").bind("click", Player.scanClick) + $("#like").bind("click", Player.likeClick) + $("#video-link").bind("click", Player.linkClick) + $("#fullscreen").bind("click", Viewport.fullscreenOn) + Player.projector = {type:"null",load:d.noop,unload:Youtube.unload,} + for (i in Player.projectors) + Player.projectors[i].init() + if (Player.queue.length > 0) + Player.currentIdx = Player.queue.length + Playlist.init() + } + } + +var Playlist = + { + count: 0, + showScores: false, + enqueue: function (videos) + { + if (! (videos instanceof Array)) + videos = [videos] + // d.warn("PLAYLIST ENQUEUE "+videos.length) + var rows = [] + var clickables = [] + for (i in videos) + { + var video = videos[i] + $("#"+video.key).html(video.title) + if (Player.enqueue(video)) + { + rows.push(Playlist.display(video)) + Playlist.count += 1 + } + } + $("#queue").prepend(rows.reverse().join("")) + }, + enqueueOldVideoFormat: function (videos) + { + // d.warn("ENQUEUING "+videos.length+" OLD FORMAT") + for (i in videos) + { + // 0 id 1 date 2 userid 3 user 4 url 5 title + var row = videos[i] + var video = + { + id: row[0], + date: row[1], + userid: row[2], + username: row[3], + src: row[4], + title: row[5] || '___', + seen: false, + error: false, + } + if (row.length > 6) + { + video.score = parseInt(row[6]) || 0 + // block video if it's a duplicate + } + var url = row[4] + if (url.indexOf("youtube.com") !== -1) + { + var ytid = Youtube.getYtid(url) + video.type = "youtube" + video.name = ytid + } + else if (url.indexOf("vimeo.com") !== -1) + { + var vimeoid = url.replace(VIMEOregexp, "$3") + video.type = "vimeo" + video.name = vimeoid + } + else if (url.indexOf("soundcloud.com") !== -1) + { + video.type = "soundcloud" + video.name = $.md5(video.src) + } + else if (url.indexOf("mp3") !== -1) + { + video.type = "audio" + video.name = $.md5(video.src) + } + else + { + d.error("bad video id in "+url) + continue + } + video.key = video.type + "_" + video.name + Playlist.enqueue(video) + // d.joy("GOT VIDEO: "+key) + } + }, + clickTitle: function (e) + { + var id = $(this).parent().attr("id") + var idx = id.substr(id.indexOf("_")+1) + d.act("+ clicked playlist "+idx) + Player.playIdx(parseInt(idx)) + }, + clickLike: function (e) + { + var id = $(this).parent().attr("id") + var idx = id.substr(id.indexOf("_")+1) + var videokey = Player.queue[idx] + var video = Player.videos[videokey] + d.act("+ clicked playlist like "+video.key) + Like.likeVideo(video) + }, + clickChatlink: function (e) + { + e.preventDefault() + var key = $(this).attr("id") + var video = Player.videos[key] + d.act("+ clicked link "+video.key) + Player.playVideo(video) + }, + display: function (video) + { + var likeClass = '' + var likeWord = " like" + if (video.username === Auth.username) + { + likeClass = "you" + } + else if (Local.isLiked(video.id)) + { + likeClass = 'liked' + likeWord = 'liked' + } + var s = "<li id='queue_"+Playlist.count+"'>" + if (Playlist.showScores) + { + score = video.score + if (score < 1) + score = ' ' + s += "<span class='score' id='score_"+video.id+"'>"+score+"</span>" + } + s += "<span id='like_"+video.id+"' class='like "+likeClass+"'>"+likeWord+"</span>" + s += "<a class='user' href='/profile/"+video.username+"'>"+video.username+"</a>" + s += "<span class='title'>"+video.title+"</span>" + s += "</li>" + return s + }, + init: function () + { + d.warn("PLAYLIST INIT") + $("#queue li span.title").live("click", Playlist.clickTitle) + $("#queue li span.like").live("click", Playlist.clickLike) + $("#chat a.ytlink").live("click", Playlist.clickChatlink) + } + } + +var Scanner = + { + scanMode: false, + scanTimeout: false, + scanBlinkTimeout: false, + scanBlinkState: false, + scanBlinkRate: 200, + scanRate: 9000, + scanBlink: function () + { + if (Scanner.scanBlinkState) + { + $("#scan").addClass("blinkOff") + $("#scan").removeClass("blinkOn") + Scanner.scanBlinkState = false + } + else + { + $("#scan").addClass("blinkOn") + $("#scan").removeClass("blinkOff") + Scanner.scanBlinkState = true + } + Scanner.scanBlinkTimeout = setTimeout(Scanner.scanBlink, Scanner.scanBlinkRate) + }, + scanGo: function () + { + Player.playNext() + Scanner.scanTimeout = setTimeout(Scanner.scanGo, Scanner.scanRate) + }, + scan: function () + { + if (Scanner.scanMode) + { + d.warn("SCANNER ON") + Scanner.scanMode = false + clearTimeout(Scanner.scanTimeout) + clearTimeout(Scanner.scanBlinkTimeout) + $("#scan").removeClass("blinkOn") + $("#scan").removeClass("blinkOff") + } + else + { + d.warn("SCANNER OFF") + Scanner.scanMode = true + Scanner.scanBlink() + Scanner.scanGo() + } + } + } +var Vimeo = + { + type: "vimeo", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 1,//from 100...some sort of error + play: function (video) + { + d.warn("VIMEO PLAY "+video.key) + if (video.error) + return Vimeo.error() + if (Vimeo.playing) + Vimeo.stop() + $("#screen").html("<div id='vimeo'></div>") + Vimeo.video = video + Vimeo.playing = true + var params = { allowScriptAccess: "always", wmode: "opaque", } + var atts = { id: "vimeo" } + var flashvars = { api: 1 } + swfobject.embedSWF("http://vimeo.com/moogaloop.swf?clip_id="+video.name+"&server=vimeo.com&color=00adef&api=1", + "vimeo", "100%","100%", "8", null, flashvars, params, atts) + // $("#vimeo").html('<iframe src="http://player.vimeo.com/video/'+video.name+'?api=1" width="100%" height="100%" frameborder="0"></iframe>') + }, + toggle: function () + { + if (Vimeo.player.api_paused()) + return Vimeo.resume() + else + return Vimeo.pause() + }, + error: function (s) + { + Player.error("VIMEO "+s) + Vimeo.finish() + }, + setVolume: function (vol) + { + Vimeo.volume = vol + Vimeo.player.api_setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Vimeo.playing = false + Vimeo.player.api_pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Vimeo.playing = true + Vimeo.player.api_play() + return false + }, + stop: function () + { + d.warn("VIMEO STOP") + Vimeo.playing = false + }, + finish: function () + { + d.warn("VIMEO FINISH") + Vimeo.playing = false + swfobject.removeSWF("vimeo") + Player.finish() + }, + load: function () + { + d.warn("LOADING VIMEO") + Vimeo.loaded = true + }, + unload: function () + { + d.warn("VIMEO UNLOADED") + swfobject.removeSWF("vimeo") + Vimeo.loaded = false + }, + init: function () + { + d.warn("VIMEO INIT") + } + } +function vimeo_player_loaded() + { + d.warn("VIMEO LOADED") + Vimeo.player = document.getElementById('vimeo') + Vimeo.player.api_play() + // Vimeo.player.addEventListener("finish", "Vimeo.finish") + Vimeo.player.api_addEventListener("finish", "Vimeo.finish") + Vimeo.player.api_setVolume(Vimeo.volume) + } +Player.register(Vimeo) + +var Youtube = + { + type: "youtube", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + getYtid: function (url) + { + if (! url) return + var ytid = url.substr(url.indexOf("v=")+2,11) + if (ytid.indexOf("&") !== -1) + ytid = ytid.substr(0, ytid.indexOf("&")) + if (ytid.indexOf("#") !== -1) + ytid = ytid.substr(0, ytid.indexOf("#")) + return ytid + }, + play: function (video) + { + d.warn("YOUTUBE PLAY "+video.key) + if (video.error) + return Youtube.error() + if (Youtube.playing) + Youtube.stop() + Youtube.video = video + Youtube.playing = true + if (Youtube.ready) + { + d.warn("ORDERING VIDEO LOAD "+video.name) + Youtube.player.loadVideoById(video.name) + Youtube.pending = false + } + else + { + d.error("YOUTUBE PLAYER NOT READY") + Youtube.pending = true + } + }, + toggle: function () + { + if (Youtube.playing) + return Youtube.pause() + else + return Youtube.resume() + }, + error: function (s) + { + Player.error("YOUTUBE "+s) + $("li#queue_"+Youtube.video.idx+" span.title").html("<i>This video cannot be embedded</i>") + setTimeout(Youtube.finish, 1000) + }, + onStateChange: function (state) + { + Youtube.state = state + if (state === -1) + { + d.warn("YOUTUBE: UNSTARTED") + Youtube.playing = false + } + else if (state === 0) + { + d.warn("YOUTUBE: ENDED") + Youtube.playing = false + return Youtube.finish() + } + else if (state === 1) + { + d.warn("YOUTUBE: PLAYING") + Youtube.playing = true + if (! Youtube.loaded) + return Youtube.unload() + } + else if (state === 2) + { + d.warn("YOUTUBE: PAUSED") + Youtube.playing = false + } + else if (state === 3) + { + d.warn("YOUTUBE: BUFFERING") + } + else if (state === 5) + { + d.warn("YOUTUBE: CUED") + } + else + { + d.error("YOUTUBE: UNKNOWN") + } + }, + onError: function (error) + { + var errorStr = 'UNKNOWN' + if (error === 2) + errorStr = "INVALID PARAMETER" + if (error === 100) + errorStr = "NOT FOUND" + if (error === 101 || error === 150) + errorStr = "EMBED FORBIDDEN" + Youtube.error(errorStr) + }, + setVolume: function (vol) + { + Youtube.player.setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Youtube.playing = false + Youtube.player.pauseVideo() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Youtube.playing = true + Youtube.player.playVideo() + return false + }, + stop: function () + { + d.warn("YOUTUBE STOP") + Youtube.player.stopVideo() + Youtube.playing = false + }, + finish: function () + { + d.warn("YOUTUBE FINISH") + Youtube.playing = false + Player.finish() + }, + load: function () + { + d.warn("LOADING YOUTUBE") + $("#ytscreen").css("z-index", 19) + Youtube.loaded = true + }, + unload: function () + { + d.warn("YOUTUBE UNLOADED") + $("#ytscreen").css("z-index", -3) + if (Youtube.player) + Youtube.player.stopVideo() + Youtube.playing = false + Youtube.loaded = false + Youtube.pending = false + }, + init: function () + { + d.warn("YOUTUBE INIT") + var params = { allowScriptAccess: "always", wmode: "opaque" } + var atts = { id: "ytscreen" } + swfobject.embedSWF("http://www.youtube.com/apiplayer?enablejsapi=1&version=3&playerapiid=ytscreen", + "ytscreen", Player.width, Player.height, "8", null, null, params, atts) + } + } +function onYouTubePlayerReady (playerId) + { + d.warn("YOUTUBE READY") + Youtube.player = document.getElementById(playerId) + Youtube.playerId = playerId + Youtube.player.addEventListener("onStateChange", "Youtube.onStateChange") + Youtube.player.addEventListener("onError", "Youtube.onError") + Youtube.ready = true + if (! Youtube.loaded) + return Youtube.unload() + if (Youtube.pending) + Youtube.player.loadVideoById(Youtube.video.name) + Youtube.pending = false + } +Player.register(Youtube) + +var Soundcloud = + { + type: "soundcloud", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 100, + play: function (video) + { + d.warn("SOUNDCLOUD PLAY "+video.key) + if (video.error) + return Soundcloud.error() + if (Soundcloud.playing) + Soundcloud.stop() + $("#screen").html("<div id='soundcloud'></div><div id='soundcloud-img'></div><div id='soundcloud-dl'></div>") + Soundcloud.video = video + Soundcloud.playing = false + + if (Soundcloud.player) + { + Soundcloud.player = null + swfobject.removeSWF("soundcloud") + } + + var flashvars = { enable_api: true, object_id: "soundcloud", url: video.src, theme_color: "#657b83", } + var attributes = { id: "soundcloud", name: "soundcloud" } + var params = { allowscriptaccess: "always", wmode: "opaque", } + + swfobject.embedSWF("http://player.soundcloud.com/player.swf", "soundcloud", "81", "81", "9.0.0", + "expressInstall.swf", flashvars, params, attributes, Soundcloud.playerDidLoad); + }, + playerDidLoad: function (e) + { + if (e.success === false) + return Soundcloud.error("failed to load") + d.warn("LOADED") + Soundcloud.player = swfobject.getObjectById('soundcloud') + $("#ytscreen").css("z-index", -2) + // instead of raising events, the soundcloud swf calls it's js api directly + window.soundcloud = { onPlayerReady: Soundcloud.ready, onMediaEnd: Soundcloud.finish } + }, + ready: function () + { + d.warn("READY") + Soundcloud.playing = true + Soundcloud.player = swfobject.getObjectById('soundcloud') + if (Soundcloud.player) + { + Soundcloud.player.api_play() + Soundcloud.player.api_setVolume(Soundcloud.volume) + } + Soundcloud.report() + }, + report: function () + { + if (! Soundcloud.player) + return Soundcloud.error() + var track = Soundcloud.player.api_getCurrentTrack() + $("#video-title").html(track.title) + if (track.downloadable && track.download_url !== "undefined" && track.download_url !== undefined) + $("#soundcloud-dl").html('<a href="'+track.download_url+'" target="_parent">download</a>') + else + $("#soundcloud-dl").html("") + var art = '' + if (track.artwork) + art = track.artwork.split("?")[0].replace('large','original') + else if (track.user && track.user.avatarUrl) + art = track.user.avatarUrl.split("?")[0].replace('large','crop') + if (art.length) + { + $("#soundcloud-img").html("<img src='"+art+"' id='sc-art' />") + $("#sc-art").bind("error", function(){$("#sc-art").hide()}) + } + return + d.warn("____________") + for (i in track) + d.warn("<b>"+i+":</b> "+track[i]) + d.warn("____________") + var user = track.user + for (i in user) + d.warn("<b>"+i+":</b> "+user[i]) + d.warn("____________") + }, + toggle: function () + { + d.warn("TOGGLE PLAYBACK") + if (Soundcloud.player) + return Soundcloud.player.api_toggle() + return false + }, + error: function (s) + { + Player.error("SOUNDCLOUD "+s) + Soundcloud.finish() + }, + setVolume: function (vol) + { + Soundcloud.volume = vol + if (Soundcloud.player) + Soundcloud.player.api_setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Soundcloud.playing = false + if (Soundcloud.player) + Soundcloud.player.api_pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Soundcloud.playing = true + if (Soundcloud.player) + Soundcloud.player.api_play() + return false + }, + stop: function () + { + d.warn("SOUNDCLOUD STOP") + if (Soundcloud.player) + Soundcloud.player.api_stop() + Soundcloud.playing = false + }, + finish: function () + { + d.warn("SOUNDCLOUD FINISH") + Soundcloud.playing = false + swfobject.removeSWF("soundcloud") + Player.finish() + }, + load: function () + { + d.warn("LOADING SOUNDCLOUD") + Soundcloud.loaded = true + }, + unload: function () + { + d.warn("SOUNDCLOUD UNLOADED") + swfobject.removeSWF("soundcloud") + Soundcloud.loaded = false + Soundcloud.playing = false + }, + init: function () + { + d.warn("SOUNDCLOUD INIT") + window.soundcloud = Soundcloud + } + } +Player.register(Soundcloud) + +var Audio = + { + type: "audio", + loaded: false, + pending: false, + playing: false, + paused: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 100, + play: function (video) + { + d.warn("AUDIO PLAY "+video.key) + if (video.error) + return Audio.error() + if (Audio.playing) + Audio.stop() + $("#screen").html("<div id='audio'></div><div id='audio-img'></div><div id='audio-dl'></div>") + $("#ytscreen").css("z-index", -2) + Audio.video = video + Audio.playing = false + + var partz = video.src.split(" ") + var img = partz[0] + var url = partz[1] + var title = partz.slice(2).join(" ") + + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Audio.player = soundManager.createSound + ({ + id: "player-"+video.id, + url: url, + volume: Audio.volume, + onfinish: Audio.finish, + onerror: Audio.error, + onload: Audio.onload, + }) + if (! Audio.player) + return Audio.error("no player") + Audio.player.play() + + $("#video-title").html(title) + $("#video-link").attr("href", url) + $("#audio-dl").html('<a href="'+url+'" target="_parent">download</a>') + $("#audio-img").html("<img src='"+img+"' id='audio-art' />") + $("#audio-art").bind("error", function(){$("#audio-art").hide()}) + }, + onload: function (success) + { + if (! success) + return Audio.error("failed to load") + }, + toggle: function () + { + d.warn("TOGGLE PLAYBACK") + if (Audio.paused) + return Audio.resume() + else + return Audio.pause() + }, + error: function (s) + { + if (! s) + s = "unspecified error" + Player.error("AUDIO "+s) + Audio.finish() + }, + setVolume: function (vol) + { + Audio.volume = vol + if (Audio.player) + Audio.player.setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Audio.paused = true + Audio.playing = false + if (Audio.player) + Audio.player.pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Audio.paused = false + Audio.playing = true + if (Audio.player) + Audio.player.resume() + return false + }, + stop: function () + { + d.warn("AUDIO STOP") + if (Audio.player) + Audio.player.stop() + Audio.playing = false + }, + finish: function () + { + d.warn("AUDIO FINISH") + Audio.playing = false + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Player.finish() + }, + load: function () + { + d.warn("LOADING AUDIO") + Audio.loaded = true + }, + unload: function () + { + d.warn("AUDIO UNLOADED") + if (Audio.player) + { + Audio.player.stop() + Audio.player.destruct() + } + Audio.loaded = false + Audio.playing = false + }, + init: function () + { + d.warn("AUDIO INIT") + } + } +Player.register(Audio) +soundManager.url = '/swf/' +soundManager.useFlashBlock = false +soundManager.debugMode = false + +function Toggler (div, on, off) + { + var state = false + function activate () + { + $(div).addClass("on").html("ON") + on () + } + function deactivate () + { + $(div).removeClass("on").html("off") + off () + } + function toggle () + { + state = ! state + if (state) + activate () + else + deactivate () + } + function destroy () + { + $(div).unbind("click") + } + $(div).bind("click", toggle) + } + +var Tokbox = + { + height: 150, + width: null, + token_url: "/cgi-bin/tokbox_room.cgi", + sessionid: null, + token: null, + togglers: [], + + session: null, + publisher: null, + subscribers: [], + + subscribeToStreams: function (streams) + { + for (var i = 0; i < streams.length; i++) + { + var stream = streams[i] + if (stream.connection.connectionId != Tokbox.session.connection.connectionId) + { + var parentDiv = document.getElementById("tokbox-subscribers") + var stubDiv = document.createElement("div") + stubDiv.id = "opentok_subscriber_"+stream.connection.connectionId + parentDiv.appendChild(stubDiv) + + var subscriberProps = {width: Tokbox.width, height: Tokbox.height, audioEnabled: true} + var subscriber = Tokbox.session.subscribe(stream, stubDiv.id, subscriberProps) + Tokbox.subscribers.push(subscriber) + } + } + }, + sessionConnectedHandler: function (event) + { + Tokbox.height = $("#tokbox-embed").height() + Tokbox.width = Math.floor( Tokbox.height / 1.618 ) + $("#tokbox-loading").hide() + + Tokbox.subscribeToStreams(event.streams) + + var parentDiv = document.getElementById("tokbox-publisher") + var stubDiv = document.createElement("div") + stubDiv.id = "opentok_publisher" + parentDiv.appendChild(stubDiv) + + var publisherProps = {width: Tokbox.width, height: Tokbox.height, microphoneEnabled: false} + Tokbox.publisher = Tokbox.session.publish(stubDiv.id, publisherProps) + $("#tokbox-loading").hide() + $("#tokbox-settings").fadeIn(1000) + }, + streamCreatedHandler: function (event) + { + Tokbox.subscribeToStreams(event.streams) + }, + tokenCallback: function (raw) + { + var lines = API.parse("/tokbox", raw) + if (! lines) + return d.error("API ERROR") + for (i in lines) + { + pair = lines[i].split("\t") + if (pair[0] === "ERROR") + return d.error(pair[1]) + else if (pair[0] === "SESSION") + Tokbox.sessionid = d.trim(pair[1]) + else if (pair[0] === "TOKEN") + Tokbox.token = d.trim(pair[1]) + } + if (Tokbox.sessionid && Tokbox.token) + Tokbox.activate() + }, + activate: function () + { + Tokbox.session = TB.initSession(Tokbox.sessionid) + Tokbox.session.addEventListener("sessionConnected", Tokbox.sessionConnectedHandler) + Tokbox.session.addEventListener("streamCreated", Tokbox.streamCreatedHandler) + Tokbox.session.connect(626221, Tokbox.token) + }, + microphoneOn: function () + { + Tokbox.publisher.publishAudio(true) + d.warn(">>>> MICROPHONE ON") + }, + microphoneOff: function () + { + Tokbox.publisher.publishAudio(false) + d.warn(">>>> MICROPHONE OFF") + }, + mute: function () + { + for (var i = 0; i < Tokbox.subscribers.length; i++) + { + try + { + Tokbox.subscribers[i].subscribeToAudio(false) + d.warn("MUTED "+i) + } + catch (err) + { + d.warn("UNMUTE ERROR "+i+" "+ err.description) + } + } + d.warn(">>>> MUTE ALL") + }, + unmute: function () + { + for (var i = 0; i < Tokbox.subscribers.length; i++) + { + try + { + Tokbox.subscribers[i].subscribeToAudio(true) + d.warn("UNMUTED "+i) + } + catch (err) + { + d.warn("UNMUTE ERROR "+i+" "+ err.description) + } + } + d.warn(">>>> UNMUTE ALL") + }, + load: function () + { + $("#tokbox-embed").show() + $("#tokbox-settings").hide() + $("#tokbox-loading").show() + $(window).trigger("resize") + $.get(Tokbox.token_url, {room:Room.name}).success(Tokbox.tokenCallback) + Tokbox.togglers.push( new Toggler ("#tokbox-microphone", Tokbox.microphoneOn, Tokbox.microphoneOff) ) + Tokbox.togglers.push( new Toggler ("#tokbox-mute-all", Tokbox.mute, Tokbox.unmute) ) + }, + unload: function () + { + $("#tokbox-embed").hide() + $(window).trigger("resize") + if (Tokbox.session) + { + if (Tokbox.publisher) + Tokbox.session.unpublish(Tokbox.publisher) + Tokbox.session.disconnect() + } + Tokbox.publisher = null + Tokbox.session = null + $("#tokbox-publisher").html("") + $("#tokbox-subscriber").html("") + for (t in Tokbox.togglers) + Tokbox.togglers[i].destroy () + Tokbox.togglers = [] + }, + init: function () + { + } + } +var VIMEOregexp = /^(\bhttps?:\/\/)(www.)?vimeo.com\/([0-9]+).*$/i +var Chat = + { + timer: null, + oldChat: {}, + oldVideo: {}, + lastPoll: 0, + delay: 1000, + delayShort: 1000, + delayLong: 5000, + messages: {}, + callback: false, + parse: function (row) + { + var s = '<a href="/profile/' + row[2] + '" class="u">' + row[2] + "</a> <span>" + s += Chat.parseWords(row[3]) + s += "</span><br />" + return s + }, + parseWords: function (raw) + { + if (! raw) + return "" + var words = raw.split(" ") + var s = "" + for (i in words) + { + var word = words[i] + if (word.indexOf("http") !== -1) + { + if (word.indexOf("youtube.com/watch?") !== -1) + { + var ytid = "youtube_"+Youtube.getYtid(word) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtube.com/v/") !== -1) + { + var index = word.indexOf("/v/") + var ytid = "youtube_"+word.substr(index+3,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("youtu.be") !== -1) + { + var ytid = "youtube_"+word.substr(16,11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + // http://www.youtube.com/user/ahchachachacha#p/f/28/1GSBekxLR1E + else if (word.indexOf("youtube.com/user") !== -1) + { + var ytid = "youtube_"+word.substr(-11) + var txt + if (ytid in Player.videos) + txt = Player.videos[ytid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+ytid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("vimeo.com") !== -1) + { + var vimeoid = word.replace(VIMEOregexp, "vimeo_$3") + if (vimeoid in Player.videos) + txt = Player.videos[vimeoid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+vimeoid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf("soundcloud.com") !== -1) + { + var scid = "soundcloud_" + $.md5(word) + if (scid in Player.videos) + txt = Player.videos[scid].title + else + txt = word + s += '<a href="'+word+'" class="ytlink" id="'+scid+'" target="_parent">'+txt+'</a> ' + } + else if (word.indexOf(".jpeg") !== -1 || + word.indexOf(".JPG") !== -1 || + word.indexOf(".GIF") !== -1 || + word.indexOf(".PNG") !== -1 || + word.indexOf(".JPEG") !== -1 || + word.indexOf(".jpg") !== -1 || + word.indexOf(".gif") !== -1 || + word.indexOf(".png") !== -1) + { + s += '<a href="'+word+'" target="_blank" class="pic"><img src="'+word+'" /></a>' + } + else if (word.indexOf("scannerjammer.com/profile") !== -1) + { + var username = word.substr( word.indexOf("profile")+8 ).replace("/","") + s += '<a href="'+word+'">@'+username+'</a>' + } + // else if (word.indexOf("@") === 0 && word.length > 2) + // { + // } + else + { + var poffset = word.indexOf('//') + var linktext = word.substr(poffset+2, word.indexOf('/', poffset+2) - 2).replace("www.","").replace(/\/+$/,"") + s += '<a href="'+word+'" target="_blank">'+linktext+'</a> ' + } + } + else if (word.indexOf(".com") !== -1 || + word.indexOf(".net") !== -1 || + word.indexOf(".org") !== -1 || + word.indexOf(".us") !== -1 || + word.indexOf(".nu") !== -1 || + word.indexOf(".uk") !== -1 || + word.indexOf(".fr") !== -1 || + word.indexOf(".de") !== -1 || + word.indexOf(".fm") !== -1) + { + var txt = word.replace("www.","") + s += '<a href="http://'+word+'" target="_blank">'+txt+'</a> ' + } + else + s += word + " " + } + return s + }, + store: function (lines) + { + var newVideos = [] + var newChat = [] + var postponeScroll = false + for (i in lines) + { + if (! lines[i]) + continue + row = lines[i].split("\t") + if (row[0] === 'VIDEO') + { + row.shift() + if (row[0] in Chat.oldVideo) + continue + Chat.oldVideo[row[0]] = row + Playlist.enqueueOldVideoFormat([row]) + } + else if (row[0] === 'ROOM') + { + Room.updateSetting(row[1],row[2]) + } + else if (row[0] === 'LIKE') + { + username = row[1] + Like.enqueue(username) + } + else if (row[0] === 'CAM') + { + VideoChat.updateCount(row[1]) + } + else + { + // 0 id 1 date 2 user 3 msg + if (row[0] in Chat.oldChat) + continue + Chat.oldChat[row[0]] = row + var c = Chat.parse(row) + if (c.indexOf("<img") !== -1) + { + postponeScroll = true + d.joy(">> POSTPONING") + } + if (row[2] === Auth.username && $.md5(row[3]) in Chat.messages) + continue + newChat.push(c) + } + } + if (newChat.length) + { + $("#chat").append(newChat.join("")) + if (postponeScroll) + setTimeout('d.scrollToBottom("#chat")', 2000) + else + d.scrollToBottom("#chat") + } + }, + say: function () + { + d.act("+ sent message") + var msg = d.sanitize( $("#chat-message").val() ) + $("#chat-message").val("") + if (! msg) return + if (msg === "debug=1") { $("#msg").show(); d.scrollToBottom("#msg"); return } + if (msg === "debug=0") { $("#msg").hide(); return } + if (msg === "poll=0") { d.error("+ DISABLED POLLING"); clearTimeout(Chat.timer); return} + var hash = $.md5(msg) + Chat.messages[hash] = true + var newrow = [0, 0, Auth.username, msg] + var newdiv = Chat.parse(newrow) + $("#chat").append(newdiv) + // if (Chat.callback) + // Chat.callback(1) + if (newdiv.indexOf("<img") !== -1) + setTimeout('d.scrollToBottom("#chat")', 2000) + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: msg}, Room.sayCallback) + d.scrollToBottom("#chat") + }, + send: function (msg) + { + $.post(API.URL.room.say, {room: Room.name, session: Auth.session, msg: msg}, Room.sayCallback) + // var hash = $.md5(msg) + // Chat.messages[hash] = true + // var newrow = [0, 0, Auth.username, msg] + // var newdiv = Chat.parse(newrow) + // $("#chat").append(newdiv) + // if (newdiv.indexOf("<img") !== -1) + // setTimeout('d.scrollToBottom("#chat")', 2000) + // d.scrollToBottom("#chat") + }, + sayCallback: function (raw) + { + var lines = API.parse("/room/say", raw) + if (! lines) return + var newid = lines.split("\t")[0] + Chat.oldChat[newid] = true + // Room.store(lines) + d.joy("MESSAGE SENT") + }, + poll: function () + { + // d.warn("Polling") + $.post(API.URL.room.poll, + { + room: Room.name, + session: Auth.session, + last: Chat.lastPoll, + cam: VideoChat.isOpen, + }).success(Chat.pollCallback).error(Chat.pollErrorCallback) + }, + pollErrorCallback: function () + { + d.error("Poll failed, waiting "+Math.floor(Chat.delayLong)+"s...") + Chat.timer = setTimeout(Chat.poll, Chat.delayLong) + }, + pollCallback: function (raw) + { + // d.warn("Poll successful") + Chat.timer = setTimeout(Chat.poll, Chat.delay) + var lines = API.parse("/room/poll", raw) + if (! lines) + return d.error("Poll failed") + Chat.lastPoll = parseInt(lines.shift()) - 1 + Lastlog.update(lines.shift()) + Chat.store(lines) + } + } + +var Lastlog = + { + old: "", + update: function (lastlog) + { + if (Lastlog.old === lastlog) + return + Lastlog.old = lastlog + var names = lastlog.split("\t") + var s = "" + for (i in names.sort()) + { + s += "<li class='ll'><a href='/profile/"+names[i]+"'>"+names[i]+"</a></li>" + } + $("#lastlog").html(s) + $("#lastlogbg").css("height", $("#lastlogbox").height()) + } + } +var Menu = {} +var Room = + { + loaded: false, + ops: {}, + settings: {}, + settingsButtonBound: false, + updateSettingMethods: + { + bg: function (url) + { + if (url === Room.settings.bg) + return + d.warn("clearing bg") + $("#bg").fadeOut(500, function () + { + if (url) + { + d.warn("updating bg to "+url) + $("#bg img").attr('src', url).bind("load", function(){$("#bg").fadeIn(2000);d.warn("bg updated")}) + } + }) + }, + title: function (s) + { + if (s.length === 0) + s = " " + $("#heading").html( s.replace(">",">").replace("<","<") ) + }, + topic: function (s) + { + if (s.length === 0) + s = " " + $("#topic").html( d.linkify(s.replace(">",">").replace("<","<")) ) + }, + phase: function (s) + { + if (s === 'light') + { + // turn on lookit stylesheet + } + else + { + // turn off lookit stylesheet + } + }, + bgcolor: function (s) + { + if (s) + $('body').css("background-color", s) + } + }, + updateSetting: function (k, v) + { + d.warn( "update setting: "+k ) + $("room-"+k).val(v) + if (k in Room.updateSettingMethods) + var f = Room.updateSettingMethods[k](v) + Room.settings[k] = v + }, + settingsOpen: function () + { + d.warn("ROOM SETTINGS LOAD") + $("#room-id").html(Room.id) + $("#room-name").html(Room.name) + $("#room-path").html(Room.path) + $("#room-title").val(Room.settings['title']) + $("#room-topic").val(Room.settings['topic']) + $("#room-phase").val(Room.settings['phase']) + $("#room-bg").val(Room.settings['bg']) + $("#room-bgcolor").val(Room.settings['bgcolor']) + $("#room-plant").val(Room.settings['plant']) + $("#room-flower").val(Room.settings['flower']) + $("#room-updater").html(Room.settings['updater']) + if (! Room.settingsButtonBound) + { + Room.settingsButtonBound = true + $("#room-settings-save").bind("click", Room.settingsSaveClick) + } + $("#room-settings-unload").bind("click", Room.settingsClose) + if (Auth.access > 0) + $("#room-mod-tag").html("<a href='/"+Room.name+"/admin'>Moderate room</a>") + else + $("#room-mod-tag").html("") + d.warn("LOADED") + }, + settingsClose: function () + { + d.warn("ROOM SETTINGS UNLOAD") + Room.settingsButtonBound = false + $("#room-settings-save").unbind("click") + }, + settingsKeys: ["title","topic","bg"], + last_bg: "", + settingsSaveClick: function () + { + $("#room-settings-save").unbind("click") + var set = [] + if (Room.ops !== false) + { + if (Auth.access < 1 && !(Auth.username in Room.ops)) + { + Menu.settings.close() + return + } + } + Room.last_bg = Room.settingsKeys['bg'] + for (i in Room.settingsKeys) + { + var k = Room.settingsKeys[i] + var v = d.sanitize( $("#room-"+k).val() ) + Room.updateSetting(k, v) + set.push(k+"\t"+v) + } + set.push("updater\t"+Auth.username) + var s = set.join("\n") + $.post(API.URL.room.settings, {room: Room.name, session: Auth.session, settings: s}, Room.settingsCallback) + Menu.settings.close() + }, + settingsCallback: function (raw) + { + var lines = API.parse("/room/say", raw) + if (! lines) + return + if (lines[0].indexOf("OK") !== -1) + { + d.warn("settings updated: "+lines.shift()) + $("#room-updater").hide().html("you!").fadeIn(500) + } + else if (lines[0].indexOf("BG_SIZE") !== -1) + { + var partz = lines[0].split("\t") + setTimeout('Room.updateSettingMethods.bg(Room.last_bg)', 2000) + alert("Background too large!\n\nYour image: "+ partz[2]+" bytes\nMax size: " + partz[3] + " bytes") + } + else if (lines[0].indexOf("BG_DATA") !== -1) + { + setTimeout('Room.updateSettingMethods.bg(Room.last_bg)', 2000) + alert("Unable to retrieve background image") + } + $("#room-settings-save").bind("click", Room.settingsSaveClick) + }, + connect: function () + { + var videoKey = '' + var hash = document.location.hash + if (hash.indexOf("#") !== -1) + hash = hash.substr(1) + var partz = hash.split("&") + for (i in partz) + { + var pair = partz[i].split("=") + if (pair[0] === "v") + videoKey = pair[1] + } + d.warn("JOINING ROOM "+Room.name) + $.ajax({ + type: 'POST', + url: API.URL.room.join, + data: {'room':Room.name,'session':Auth.session,'enqueue':videoKey}, + timeout: 2000, + }).success(Room.joinCallback).error(Room.joinErrorCallback) + }, + joinErrorCallback: function (jqXHR, textStatus, errorThrown) + { + d.warn("JOIN ERROR") + if (Room.loaded) + return + if (textStatus === "timeout") + Room.connect() + else + Auth.load() + }, + joinCallback: function (raw) + { + var lines = API.parse("/room/join", raw) + if (!lines){ + d.error("UNABLE TO LOAD ROOM"); + setTimeout(Room.load, 500); + return; + } + var u = lines.shift().split("\t") + + if (u[0] === '0') + return Auth.load() + d.warn("JOINED ROOM") + Auth.unload() + Auth.userid = u[0] + Auth.username = u[1] + Auth.access = u[2] + d.joy("logged in as "+Auth.username) + + Lastlog.update(lines.shift()) + Chat.store(lines) + + d.warn("__________") + d.warn("__________") + d.warn("__________") + Room.load() + d.warn("__________") + d.warn("__________") + d.warn("__________") + }, + load: function () + { + d.warn("LOAD ROOM") + $("#loading").fadeOut(500, function() + { + Background.load() + Player.init() + VideoChat.init() + Chat.poll() + }) + $("#loading").fadeOut(1500, Room.loadFinish) + }, + loadFinish: function () + { + setTimeout("d.scrollToBottom('#chat')", 500) + $("#logo").show() + $("#logobg,#logobar").show() + $("#likebutton").css("display", "inline-block") + + $("#player").show() + $("#playlist").show() + $("#playlistbg").show() + + $("#form").show() + $("#formbg").show() + $("#chat").fadeIn(200) + d.scrollToBottom("#chat") + $("#chatbg").show() + $("#lastlogbox").show() + $("#lastlogbg").show() + + Keyboard.enter = Chat.say + $("#chat-message").bind("focus", Keyboard.focusTextarea) + $("#chat-message").bind("blur", Keyboard.blurTextarea) + $("#chat-message").focus() + Keyboard.focusTextarea() + $("#chat-send").bind("click", Chat.say) + $("#fullscreen").bind("click", Viewport.fullscreenOn) + $("#sitez").show() + $("#logout").click(Auth.logout) + if (Room.name === "feederbleeder") + { + $("#heading").css({ "color": "#ff3333" }) + // Viewport.fullscreenOn() + } + //else + Viewport.standardResize() + // $(".ytlink").live("click", Player.ytLinkClick, false) + + if (Auth.access > 0) + { + // var div = $("<div>").addClass("modhello").html("Congratulations new moderator! Click on the cube icon in the upper right corner and you will see the MODERATE ROOM link.").click(function(){$(this).fadeOut(1000)}) + // $("#chat").append(div) + } + // var div = $("<div>").addClass("modhello").html("Hey! You can now use the LEFT AND RIGHT ARROW KEYS to browse the playlist, and the L key to like a video!").click(function(){$(this).fadeOut(1000)}) + // $("#chat").append(div) + setTimeout(Player.start, 2000) + Room.loaded = true + document.cookie = "room="+Room.name+";path=/;domain=.scannerjammer.com;max-age=86400" + if (Room.loadCallback) + Room.loadCallback() + }, + loadCallback: false, + unload: function () + { + $("#logo,#logobg,#player,#playlist,#playlistbg,#form,#formbg,#chat,#chatbg,#lastlogbox,#lastlogbg,#sitez").hide() + Menu.close() + }, + init: function () + { + d.warn("INIT ROOM") + if (roomName !== undefined) + Room.name = roomName + else + Room.name = "main" + d.warn("room: "+Room.name) + // $("#chat").show() + } + } + +var Rooms = + { + loaded: false, + queue: [ + [0, "rooms", "/", "http://scannerjammer.com/bgz/gridzy9.jpg", "<span style='color: #fff;'>→ SEE ALL <span style='text-decoration: underline;'>OPEN ROOMS</span></span>"], + [1, "main", "/main", "http://scannerjammer.com/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif", "MAIN ROOM"], + [12, "FEEDERBLEEDER", "/feederbleeder", "http://scannerjammer.com/img/Tropic_Of_Cancer__The_Sorrow_Of_Two_Blooms_1308602037.jpg", "FEEDERBLEEDER"], + [2, "avatar", "/avatar", "http://scannerjammer.com/img/avatar2.png", "avatar"], + [3, "glitter", "/glitter", "http://scannerjammer.com/bgz/argus.gif", "glitter"], + [10, 'jono', '/jonomilo', 'http://scannerjammer.com/bgz/whitesquare.gif', 'jònò mì lò'], + //[11, 'SJD', 'http://lolz.biz/sjd', 'http://scannerjammer.com/img/idgiguy2.png', 'SJD'], + [4, "waterfall", "/waterfall", "http://i.imgur.com/QEZRF.gif", "waterfall"], + ], + list: function () + { + if (Rooms.loaded) + return + Rooms.listDisplay(Rooms.queue) + // $.post(API.URL.room.list, {session:Auth.session}).success(Rooms.listCallback).error(Rooms.listError) + }, + listCallback: function (raw) + { + // parse API + Rooms.listDisplay(lines) + }, + listError: function () + { + Rooms.listDisplay(Rooms.queue) + }, + listDisplay: function (rooms) + { + $("#rooms-loading").hide() + var divz = [] + for (i in rooms) + { + var r = rooms[i] + var s = "<a href='"+r[2]+"'><li style='background-image: url("+r[3]+")'>"+r[4] + if (r[1] === Room.name) + s += " < YOU ARE HERE" + s += "</li></a>" + divz.push(s) + } + $("#rooms-list").html(divz.join('')) + Rooms.loaded = true + } + } +var About = + { + loaded: false, + init: function () + { + $("#your-profile").attr('href', 'http://scannerjammer.com/profile/'+Auth.username) + About.loaded = true + } + } +function menu (key, loadCallback) + { + d.warn("MENU INIT "+key) + this.appear = function () + { + if (! Menu.isOpen) + { + $("#"+key+"-container").show() + Menu.current = key + loadCallback() + $("#chat-message").blur() + Keyboard.blurTextarea() + } + } + this.disappear = function () + { + if (! Menu.isOpen) + $("#"+key+"-container").hide() + } + this.close = function () + { + $("#"+key+"-container").hide() + $(".opened").removeClass("opened") + Menu.isOpen = false + } + this.click = function () + { + for (i in Menu.keys) + { + $("#"+Menu.keys[i]+"-container").hide() + } + $("#"+key+"-container").show() + if (Menu.current !== key) + loadCallback() + Menu.current = key + $(".opened").removeClass("opened") + $("#"+key+"-hook").addClass("opened") + Menu.isOpen = true + } + $("#"+key+"-hook").hover(this.appear, this.disappear).click(this.click) + $("#"+key+"-close").click(this.close) + $("#"+key+"-container").hover(this.click, this.close) + } +var VideoChat = + { + isOpen: false, + badgePositioned: false, + suppressBadge: 0, + updateCount: function (count) + { + /* + if (VideoChat.suppressBadge > 0) + { + VideoChat.suppressBadge -= 1 + return + } + */ + if (parseInt(count) > 0) + { + if (! VideoChat.badgePositioned) + { + VideoChat.badgePositioned = true + $("#videochat-badge").css({ + right: 5, + top: 5, + }).show() + } + $("#videochat-badge").html(count).show() + } + else + { + $("#videochat-badge").hide() + } + }, + open: function () + { + // $("#tokbox-embed").html('<iframe id="tokbox-embedded" src="http://scannerjammer.com/tokbox/" style="border:none"></iframe>') + // $("#tokbox-embed").show() + // $(window).trigger('resize') + VideoChat.isOpen = true + // Webcam.load() + Tokbox.load() + }, + close: function () + { + // $("#tokbox-embed").hide().html("") + // $("#tokbox-close").hide() + // $(window).trigger('resize') + VideoChat.isOpen = false + VideoChat.suppressBadge = 20 + // Webcam.unload() + Tokbox.unload() + }, + toggle: function () + { + if (VideoChat.isOpen) + VideoChat.close() + else + VideoChat.open() + }, + init: function () + { + // Webcam.init() + $("#tokbox").show() + $("#videochat-toggle").click(VideoChat.toggle) + } + } +var Menu = + { + isOpen: false, + current: false, + keys: ["settings","about","rooms"], + close: function () + { + if (Menu.current) + Menu[Menu.current].close() + }, + settings: new menu("settings", Room.settingsOpen), + rooms: new menu("rooms", Rooms.list), + about: new menu("about", About.init), + } +var Keyboard = + { + enter: false, + enteredText: false, + altMode: false, + focusTextarea: function () + { + // $("#chat").append("TEXTAREA FOCUS") + $(window).unbind("keydown") + $("#chat-message").unbind("keydown").bind("keydown", Keyboard.textareaMap) + $("#chat-message").unbind("focus").focus().bind("focus", Keyboard.focusTextarea) + Search.close () + if ($("#chat-message").val().length === 0) + Keyboard.enteredText = false + }, + blurTextarea: function () + { + // $("#chat").append("TEXTAREA BLUR") + $(window).unbind("keydown") + if (Viewport.fullscreenMode && Viewport.fullscreenInterface) + $(window).bind("keydown", Keyboard.fullscreenInterfaceMap) + else if (Viewport.fullscreenMode) + $(window).bind("keydown", Keyboard.fullscreenMap) + else + $(window).bind("keydown", Keyboard.standardMap) + $("#chat-message").unbind("keydown") + }, + textareaMap: function (event) + { + var kc = event.keyCode + if (kc === 8) + { + var v = $("#chat-message").val() + if (v.length < 2) + Keyboard.enteredText = false + return true + } + if (kc === 13) + { + Keyboard.enteredText = false + if (Keyboard.enter) + Keyboard.enter() + if (Chat.callback) + { + Chat.callback(1) + } + return false + } + if (kc === 27) + { + Menu.close() + if (Viewport.fullscreenMode && Viewport.fullscreenInterface) + Viewport.fullscreenHideInterface() + else if (Viewport.fullscreenMode) + Viewport.fullscreenOff() + else + Viewport.fullscreenOn() + return false + } + if (! Keyboard.enteredText) + { + if (kc === 37) + { + Player.playPrev() + return + } + else if (kc === 39) + { + Player.playNext() + return + } + } + if (kc === 33) + return d.pageUp("#chat") + if (kc === 34) + return d.pageDown("#chat") + Keyboard.enteredText = true + return true + }, + standardMap: function (event) + { + kc = event.keyCode + if (kc === 91) + { + Keyboard.altMode = true + return true + } + else if (kc === 27) // && Room.loaded) + { + Menu.close() + Viewport.fullscreenOn() + return false + } + else if (! Menu.isOpen) + { + if (kc === 37 || kc === 177) + Player.playPrev() + else if (kc === 39 || kc === 176) + Player.playNext() + else if (kc === 32 || kc === 179) + Player.pause() + else if (! Keyboard.altMode && kc === 76) + Player.likeClick() + } + Keyboard.altMode = false + return true + }, + fullscreenInterfaceMap: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenHideInterface() + if (kc === 33) + d.pageUp("#chat") + if (kc === 34) + d.pageDown("#chat") + if (kc === 32 || kc === 179) + Player.pause() + if (kc === 37 || kc === 177) + Player.playPrev() + else if (kc === 39 || kc === 176) + Player.playNext() + if (! Keyboard.altMode && kc === 76) + Player.likeClick() + return false + }, + fullscreenMap: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenOff() + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.pause() + if (kc === 76) + Player.likeClick() + return false + } + } +var Viewport = + { + focused: true, + fullscreenMode: false, + fullscreenInterface: false, + fullscreenFocusTimer: false, + fullscreenOn: function () + { + var msg = $("#chat-message").val() + $(window).unbind("resize") + $(window).bind("resize", Viewport.fullscreenResize) + $("#chat").unbind("mouseover").unbind("mouseout") + $("#chat-message").focus() + Keyboard.focusTextarea() + $("#chat,#playlist").addClass("fullscreen") + $("#bg,#chatbg,#playlistbg,#playlist").hide() + $("#faqlink").hide() + $("#logobg").css("width",$("#logo").width()+60) + $("#like").show() + $("#controls").css("position", "fixed") + Menu.close () + Search.close () + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Viewport.fullscreenOff) + $("#video-title").addClass("fullscreen") + Viewport.fullscreenInterface = true + Viewport.fullscreenMode = true + Viewport.fullscreenResize() + Viewport.chatMouseOut() + $("#chat-message").val(msg) + d.scrollToBottom("#chat") + }, + fullscreenOff: function () + { + $("#logobg").css("width","100%") + $(window).unbind("keydown") + // $(window).bind("keydown", Keyboard.standardMap) + $(window).unbind("resize") + $(window).bind("resize", Viewport.standardResize) + $("#chat").bind("mouseover", Viewport.chatMouseOver) + $("#chat").bind("mouseout", Viewport.chatMouseLaave) + $("#bg,#logo,#logobg,#form,#formbg,#chat,#chatbg,#playlist,#playlistbg,#lastlogbox,#lastlogbg,#sitez,#controls").show() + $("#controls").css("position", "absolute") + $("#controls").css("min-width", "auto").css('top','auto').css('bottom', 'auto').css('left','auto').css('right','auto') + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Main.fullscreenOn) + $("#video-title").removeClass("fullscreen") + $("#chat,#playlist").removeClass("fullscreen") + $("#controls").css("padding", 0) + Viewport.standardResize() + setTimeout('d.scrollToBottom("#chat")', 500) + Keyboard.focusTextarea() + Viewport.fullscreenMode = false + clearInterval(Viewport.fullscreenFocusTimer) + Viewport.fullscreenFocusTimer = false + }, + fullscreenHideInterface: function () + { + Viewport.fullscreenInterface = false + Keyboard.blurTextarea() + $("#form,#formbg,#chat,#playlist,#lastlogbox,#lastlogbg,#sitez,#controls,#logo,#logobg").hide() + }, + fullscreenResize: function () + { + var w = $(window).width() + var h = $(window).height() + var fw = 4 * w / 7 - 40 + var ph = h / 3 - 30 + var ch = 2 * h / 3 + var fh = 50 + var clh = ch - fh - 50 + + var pw = w * 2 / 3 - 20 + + var chatwidth = (4*w)/5 - 20 + + var chatheight = h-fh-5 + var fbot = 20 + var chatbot = Viewport.chatBottom + + if (VideoChat.isOpen) + { + var vch = 150 + $("#tokbox-embed").css("width", fw-20) + chatheight -= vch + chatbot += vch + fbot += vch + } + + $("#player").css("top", -10).css("left", -10) + $("#screen,#ytscreen").css("width",w).css("height",h) + + $("#chat").css("left", 0).css("bottom", chatbot).css("width", chatwidth).css("height", chatheight) + d.scrollToBottom("#chat") + + var sendw = $("#chat-send").width() + var camw = $("#videochat-toggle").width() + $("#chat-message").css("width", fw-sendw-camw-50) + $("#form,#formbg").css("left", 0) + $("#form").css("bottom", fbot) + $("#form,#formbg").css("width", fw) + + var controlsw = $("#controls").width() + var controlsoffset = ( w - fw - controlsw ) / 2 + $("#controls").css({ "top": "auto", "bottom": fbot+2, "right": controlsoffset, "background": "black", "padding": 10, }) + + $("#lastlogbox,#lastlogbg").css("top", h/3).css("left", w*(7/8)-10) + $("#lastlogbg").css("height", $("#lastlogbox").height()) + }, + playerTop: 94, + chatWidth: 500, + chatBottom: 75, + formHeight: 50, + standardResize: function () + { + var w = $(window).width() + var h = $(window).height() + var ytw = 1 * w / 2 - 90 + if (ytw > 500) + ytw = 500 + var yth = ytw * 9/ 16 + + var fh = Viewport.formHeight + + var cw = w - ytw - 80 + var ch = 2 * h / 3 + var chatheight = h-fh-5 + Viewport.chatWidth = cw + + var pw = cw - 20 + var ph = h / 3 - 30 + + var fbot = 20 + var chatbot = Viewport.chatBottom + + var clw = cw*3/4 + var clh = ch - fh - 50 + + var llw = cw / 4 - 30 + var llh = ch - fh - 30 + + var sendw = $("#chat-send").width() + var camw = $("#videochat-toggle").width() + $("#chat-message").css("width", pw-sendw-camw-30) + + if (VideoChat.isOpen) + { + var vch = chatheight * 1 / 2 + if (vch < 280) + vch = 280 + $("#tokbox-embed").css({"width": cw+20, "height": vch}) + $("#tokbox-embedded").css({"height": vch}) + chatheight -= vch + chatbot += vch + fbot += vch + } + + var msgw = 0 + var buttonheight = $("#fullscreen").height() + + $("#bg img").css("width", w) + $("#bg img").css("height", h) + + $("#logo").css("left", 20) + + if (retrograde) + { + // PLAYER ON LEFT + $("#player").css("left", 20) + $("#player").css("top", Viewport.playerTop) + $("#player").css("height", yth+buttonheight+20) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + Player.width = ytw + Player.height = yth + + $("#controls").css("top", yth+10+10) + var playerHeight = yth+buttonheight+Viewport.playerTop + 10 + + $("#playlist,#playlistbg").css("left", 20) + $("#playlist,#playlistbg").css("top", playerHeight+30) + $("#playlist,#playlistbg").css("width", ytw+19) + $("#playlist,#playlistbg,#queue").css("height", h-playerHeight-50) + + $("#chat,#chatbg").css("left", 60+ytw) + $("#chat,#chatbg").css("bottom", chatbot) + $("#chat,#chatbg").css("width", cw) + $("#chat,#chatbg").css("height", chatheight) + // $("#chat").css("overflow-y", "scroll") + // $("#chat").css("overflow-x", "hidden") + + $("#form,#formbg").css("left", 60+ytw) + $("#form,#formbg").css("bottom", fbot) + $("#form,#formbg").css("width", cw) + $("#form,#formbg").css("height", fh-15) + $("#formbg").css("opacity", 0.7) + + $("#lastlogbox,#lastlogbg").css("top", 90) + $("#lastlogbox,#lastlogbg").css("left", ytw+60+clw) + $("#lastlogbox,#lastlogbg").css("width", llw) + $("#lastlogbox").css("max-height", (h-fh-70-40)*3/4) + $("#lastlogbox").css("overflow-y", "auto") + $("#lastlogbox").css("overflow-x", "hidden") + + $("#likereport").css("bottom", 90) + $("#likereport").css("left", ytw+60+clw) + $("#likereport").css("width", llw-20) + $("#likereport").css("height", (h-fh-70-40)*1/4) + + $("#msg").css("max-height", h-130) + } + + else + { + // PLAYER ON RIGHT + $("#player").css("left", 40+pw+20) + $("#player").css("top", Viewport.playerTop) + $("#player").css("height", yth+buttonheight+20) + $("#player,#projector,#screen,#ytscreen").width(ytw) + $("#projector,#screen,#ytscreen").height(yth) + + $("#controls").css("top", yth+10+10) + var playerHeight = yth+buttonheight+Viewport.playerTop+10 + + $("#playlist,#playlistbg").css("left", 40+pw+20) + $("#playlist,#playlistbg").css("top", playerHeight+30) + $("#playlist,#playlistbg").css("width", ytw+19) + $("#playlist,#playlistbg,#queue").css("height", h-playerHeight-50) + + $("#chat,#chatbg").css("left", 0) + $("#chat,#chatbg").css("bottom", chatbot) + $("#chat,#chatbg").css("width", cw) + $("#chat,#chatbg").css("height", chatheight) + // $("#chat").css("overflow-y", "scroll") + // $("#chat").css("overflow-x", "hidden") + + $("#plant").css("left", cw-300) + + $("#form,#formbg").css("left", 0) + $("#form").css("bottom", fbot) + $("#form,#formbg").css("width", cw) + $("#form,#formbg").css("height", fh-15) + $("#formbg").css("opacity", 0.7) + + $("#lastlogbox,#lastlogbg").css("top", 90) + $("#lastlogbox,#lastlogbg").css("left", 10+clw) + $("#lastlogbox,#lastlogbg").css("width", llw) + $("#lastlogbox").css("max-height", (h-fh-70-40)*3/4) + $("#lastlogbox").css("overflow-y", "auto") + $("#lastlogbox").css("overflow-x", "hidden") + + var lrwidth = llw-20 + if (lrwidth < 150) lrwidth = 150 + $("#likereport").css("bottom", 90) + $("#likereport").css("left", cw-lrwidth-90) + $("#likereport").css("width", lrwidth) + $("#likereport").css("max-height", (h-fh-70-40)*1/4) + + $("#msg").css("max-height", h-130) + } + $("#lastlogbg").css("height", $("#lastlogbox").height()) + d.scrollToBottom("#chat") + }, + scrollbarWidth: 16, + getScrollbarWidth: function () + { + var initial = document.body.style.overflow + document.body.style.overflow = 'hidden'; + var width = document.body.clientWidth; + document.body.style.overflow = 'scroll' + width -= document.body.clientWidth + if (! width) + width = document.body.offsetWidth - document.body.clientWidth + document.body.style.overflow = initial + return width + }, + focus: function () + { + d.warn("VIEWPORT FOCUS") + if (! Viewport.fullscreenMode || Viewport.fullscreenInterface) + Keyboard.focusTextarea() + document.body.tabIndex = 0 + document.body.focus() + Viewport.focused = true + // Chat.delay = 1000 + if (Like.pending) + Like.fire() + // Chat.delay = Chat.delayShort + }, + blur: function () + { + d.warn("VIEWPORT BLUR") + Viewport.focused = false + // Chat.delay = Chat.delayLong + }, + chatMouseOver: function () + { + $("#chat").css({"overflow-y": "scroll", "width": Viewport.chatWidth + Viewport.scrollbarWidth }) + $("#chat").scrollTop( $("#chat").scrollTop() ) + }, + chatMouseOut: function () + { + $("#chat").css({"overflow-y": "hidden", "width": Viewport.chatWidth}) + }, + init: function () + { + Viewport.scrollbarWidth = Viewport.getScrollbarWidth () + $("#chat").bind("mouseover", Viewport.chatMouseOver) + $("#chat").bind("mouseout", Viewport.chatMouseOut) + } + } +var Background = + { + src: "http://lalalizard.com/bgz/jupiteraurora.jpg", + srcReset: "http://lalalizard.com/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif", + load: function () + { + $("#bg").show() + //setTimeout(function(){$("#bg img").attr("src", Background.src)}, 2000) + }, + init: function () + { + } + } +var Include = + { + glitter: function () + { + Room.ops = {} + $("body").append("<script type='text/javascript' src='/js/glitter.js'></script>") + $("body").append("<script type='text/javascript' src='/js/glitter-data.js'></script>") + d.enableStylesheet("glitter") + }, + avatar: function () + { + Room.ops = {} + $("body").append("<script type='text/javascript' src='/js/avatar-data.js'></script>") + $("body").append("<script type='text/javascript' src='/js/avatar.js'></script>") + d.enableStylesheet("avatar") + }, + jonomilo: function () + { + Room.ops = d.buildLookup(["daytimetelevision"]) + d.enableStylesheet("white") + $("#heading").remove() + $("#topic").remove() + $("#likebutton").before("<h1 id='heading'></h1><h2 id='topic'></h2>") + Include.middleColumn () + }, + middleColumn: function () + { + Chat.previousName = false + Chat.containsImage = function (s) + { + if (s.indexOf("http") === -1) + return false + var suffixes = ["jpg","jpeg","gif","png"] + for (var i = 0; i < suffixes.length; i++) + { + if (s.indexOf(suffixes[i]) !== -1) + { + // console.log(suffixes[i] + " " + s) + return true + } + } + return false + } + Chat.parse = function (row) + { + if (Chat.containsImage(row[3])) + { + var s = "<div class='chatimg'>" + s += "<span>" + s += Chat.parseWords(row[3]) + s += "</span>" + s += "</div>" + return s + } + else + { + Chat.previousName = row[2] + var s = "<div class='chatline'>" + s += '<a href="/profile/' + row[2] + '" class="u">' + row[2] + "</a>" + s += "<span>" + s += Chat.parseWords(row[3]) + s += "</span>" + s += "</div>" + return s + } + } + }, + diornights: function () + { + $("#logo").append("<h2 class='radio'><a href='http://diornights.com/radio/'>OPEN RADIO</a></h2>") + }, + disaro: function () + { + $("#logo").append("<h2 class='radio'><a href='/disaro/radio/'>OPEN RADIO</a></h2>") + }, + sewergreats: function () + { + $("#logo").append("<h2 class='radio'><a href='/sewergreats/radio/'>OPEN RADIO</a></h2>") + }, + dump: function () + { + Room.ops = d.buildLookup([""]) + $("body").append("<script type='text/javascript' src='/js/dump.js'></script>") + }, + yhvh: function () + { + Room.ops = d.buildLookup(["greta"]) + }, +/* + icons: function () + { + $("#bg").html('<iframe style="border-width:0; height:100%; width:100%; background:#fff;" scrolling=no src="http://asdf.us/strobe"></iframe>'); + }, +*/ + feederbleeder: function () + { + Room.ops = {} + $("#preamblewords").remove() + $("#topic").remove() + $("#heading").after("<h2 id='topic' class='preamblish'></h2>") + d.enableStylesheet("feederbleeder") + var oldsay = Chat.say + Chat.say = function () + { + var msg = $("#chat-message").val() + if (msg.indexOf("http") !== -1) + { + $("#chat").append("<div class='modhello'>Sorry, only the Feederbleeder robot can post videos and images in this room. Please visit <a href='/'>another room</a> to post videos.</div>") + $("#chat-message").val("") + d.scrollToBottom("#chat") + } + else + { + oldsay () + } + } + }, + fred: function () + { + Room.ops = d.buildLookup(["scannerjammer"]) + }, + frederick: function () + { + Room.ops = d.buildLookup(["scannerjammer"]) + d.enableStylesheet("frederick") + }, + glasspopcorn: function () + { + Room.ops = d.buildLookup(["glasspopcorn"]) + setTimeout(VideoChat.toggle, 2000) + $("#plant img").attr("src", "/static/img/1309267681552dumpfmfrakbuddyglasscross_1310066105.gif") + $("#flower img").attr("src", "/static/img/1278131405573-dumpfm-glasspopcorn-sitmanpiano.gif") + $("#heading").remove() + $("#logo").append("<h2 class='radio'><a href='/glasspopcorn/radio/'>OPEN RADIO</a></h2>") + $("body").append("<div id='glasspopcornlogo'><img src='http://lalalizard.com/static/img/glasspopcornheader.png' width='400'/></div>") + $("#preamblewords").html("Post GIFs and Soundclouds into the chat!<br/>Use arrow keys to switch videos<br/>Hit L key to LIKE<br/>Hit ESC to change modes") + Player.unregister("youtube") + Player.unregister("vimeo") + Player.unregister("audio") + }, + sfvacid: function () + { + // $("#logo").append("<h2 class='radio'><a href='/sfvacid/radio/'>OPEN RADIO</a></h2>") + }, + main: function () + { + Room.ops = false + $("#heading").remove() + $("#preamblewords").after("<h1> </h1>") + $("#topic").remove() + // Room.loadCallback = function () + // { + // setTimeout(Viewport.fullscreenOn, 3000) + // } + // $("#likebutton").before("<h2 class='preamblish'>Post urls into the chat!<br/>Use arrow keys to switch videos</h2>") + } + } + +var Main = + { + init: function () + { + d.warn("INIT MAIN") + + if (roomName in Include) + { + Include[roomName]() + } + + $(window).bind("focus", Viewport.focus) + $(window).bind("blur", Viewport.blur) + $(window).bind("resize", Viewport.standardResize) + $(window).bind("keydown", Keyboard.standardMap) + Viewport.standardResize() + Viewport.init() + Background.init() + $("#chat").append("<div id='shim'></div>") + Room.init() + if ( Auth.init() ) + Room.connect() + else + Auth.load() + document.write('<script async src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>') + if (window.location.pathname.split("/")[2] == "read") + { + API.URL.room.join = API.BASE_URL + "/api/room/view" + // API.URL.room.poll = API.BASE_URL + "/api/room/read" + d.enableStylesheet("tiny") + Viewport.playerTop = 20 + Viewport.chatBottom = 20 + Viewport.formHeight = 5 + Player.mute() + } + } + } +Main.init () diff --git a/frontend/static/js/soundcloud.js b/frontend/static/js/soundcloud.js new file mode 100644 index 0000000..1ff6c45 --- /dev/null +++ b/frontend/static/js/soundcloud.js @@ -0,0 +1,157 @@ +var Soundcloud = + { + type: "soundcloud", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 100, + play: function (video) + { + d.warn("SOUNDCLOUD PLAY "+video.key) + if (video.error) + return Soundcloud.error() + if (Soundcloud.playing) + Soundcloud.stop() + $("#screen").html("<div id='soundcloud'></div><div id='soundcloud-img'></div><div id='soundcloud-dl'></div>") + Soundcloud.video = video + Soundcloud.playing = false + + if (Soundcloud.player) + { + Soundcloud.player = null + swfobject.removeSWF("soundcloud") + } + + var flashvars = { enable_api: true, object_id: "soundcloud", url: video.src, theme_color: "#657b83", } + var attributes = { id: "soundcloud", name: "soundcloud" } + var params = { allowscriptaccess: "always", wmode: "opaque", } + + swfobject.embedSWF("http://player.soundcloud.com/player.swf", "soundcloud", "81", "81", "9.0.0", + "expressInstall.swf", flashvars, params, attributes, Soundcloud.playerDidLoad); + }, + playerDidLoad: function (e) + { + if (e.success === false) + return Soundcloud.error("failed to load") + d.warn("LOADED") + Soundcloud.player = swfobject.getObjectById('soundcloud') + $("#ytscreen").css("z-index", -2) + // instead of raising events, the soundcloud swf calls it's js api directly + window.soundcloud = { onPlayerReady: Soundcloud.ready, onMediaEnd: Soundcloud.finish } + }, + ready: function () + { + d.warn("READY") + Soundcloud.playing = true + Soundcloud.player = swfobject.getObjectById('soundcloud') + if (Soundcloud.player) + { + Soundcloud.player.api_play() + Soundcloud.player.api_setVolume(Soundcloud.volume) + } + Soundcloud.report() + }, + report: function () + { + if (! Soundcloud.player) + return Soundcloud.error() + var track = Soundcloud.player.api_getCurrentTrack() + $("#video-title").html(track.title) + if (track.downloadable && track.download_url !== "undefined" && track.download_url !== undefined) + $("#soundcloud-dl").html('<a href="'+track.download_url+'" target="_parent">download</a>') + else + $("#soundcloud-dl").html("") + var art = '' + if (track.artwork) + art = track.artwork.split("?")[0].replace('large','original') + else if (track.user && track.user.avatarUrl) + art = track.user.avatarUrl.split("?")[0].replace('large','crop') + if (art.length) + { + $("#soundcloud-img").html("<img src='"+art+"' id='sc-art' />") + $("#sc-art").bind("error", function(){$("#sc-art").hide()}) + } + return + d.warn("____________") + for (i in track) + d.warn("<b>"+i+":</b> "+track[i]) + d.warn("____________") + var user = track.user + for (i in user) + d.warn("<b>"+i+":</b> "+user[i]) + d.warn("____________") + }, + toggle: function () + { + d.warn("TOGGLE PLAYBACK") + if (Soundcloud.player) + return Soundcloud.player.api_toggle() + return false + }, + error: function (s) + { + Player.error("SOUNDCLOUD "+s) + Soundcloud.finish() + }, + setVolume: function (vol) + { + Soundcloud.volume = vol + if (Soundcloud.player) + Soundcloud.player.api_setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Soundcloud.playing = false + if (Soundcloud.player) + Soundcloud.player.api_pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Soundcloud.playing = true + if (Soundcloud.player) + Soundcloud.player.api_play() + return false + }, + stop: function () + { + d.warn("SOUNDCLOUD STOP") + if (Soundcloud.player) + Soundcloud.player.api_stop() + Soundcloud.playing = false + }, + finish: function () + { + d.warn("SOUNDCLOUD FINISH") + Soundcloud.playing = false + swfobject.removeSWF("soundcloud") + Player.finish() + }, + load: function () + { + d.warn("LOADING SOUNDCLOUD") + Soundcloud.loaded = true + }, + unload: function () + { + d.warn("SOUNDCLOUD UNLOADED") + swfobject.removeSWF("soundcloud") + Soundcloud.loaded = false + Soundcloud.playing = false + }, + init: function () + { + d.warn("SOUNDCLOUD INIT") + window.soundcloud = Soundcloud + } + } +Player.register(Soundcloud) + diff --git a/frontend/static/js/soundmanager2.js b/frontend/static/js/soundmanager2.js new file mode 100644 index 0000000..46528c9 --- /dev/null +++ b/frontend/static/js/soundmanager2.js @@ -0,0 +1,2838 @@ +/** @license + * SoundManager 2: Javascript Sound for the Web + * -------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20101010 + */ + +/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: true, newcap: true, immed: true, regexp: false */ +/*global window, SM2_DEFER, sm2Debugger, alert, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ + +(function(window) { + +var soundManager = null; + +function SoundManager(smURL, smID) { + + this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9. + this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available+configured) + this.debugFlash = false; // enable debugging output inside SWF, troubleshoot Flash/browser issues + this.useConsole = true; // use firebug/safari console.log()-type debug console if available + this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug + this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload() + this.nullURL = 'about:blank'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only) + this.allowPolling = true; // allow flash to poll for status update (required for whileplaying() events, peak, sound spectrum functions to work.) + this.useFastPolling = false; // uses lower flash timer interval for higher callback frequency, best combined with useHighPerformance + this.useMovieStar = true; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio formats (AAC, M4V, FLV, MOV etc.) + this.bgColor = '#ffffff'; // movie (.swf) background color, eg. '#000000' + this.useHighPerformance = false; // position:fixed flash movie can help increase js/flash speed, minimize lag + this.flashLoadTimeout = 1000; // msec to wait for flash movie to load before failing (0 = infinity) + this.wmode = null; // string: flash rendering mode - null, transparent, opaque (last two allow layering of HTML on top) + this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), either 'always' or 'sameDomain' + this.useFlashBlock = false; // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. + this.useHTML5Audio = false; // Beta feature: Use HTML 5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. + this.html5Test = /^probably$/i; // HTML5 Audio().canPlayType() test. /^(probably|maybe)$/i if you want to be more liberal/risky. + this.ondebuglog = false; // callback made with each log message, regardless of debugMode + + this.audioFormats = { + // determines HTML5 support, flash requirements + // eg. if MP3 or MP4 required, Flash fallback is used if HTML5 can't play it + // shotgun approach to MIME testing due to browser variance + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"','audio/mpeg','audio/mp3','audio/MPA','audio/mpa-robust'], + 'required': true + }, + 'mp4': { + 'related': ['aac','m4a'], // additional formats under the MP4 container + 'type': ['audio/mp4; codecs="mp4a.40.2"','audio/aac','audio/x-m4a','audio/MP4A-LATM','audio/mpeg4-generic'], + 'required': true + }, + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + 'wav': { + 'type': ['audio/wav; codecs="1"','audio/wav','audio/wave','audio/x-wav'], + 'required': false + } + }; + + this.defaultOptions = { + 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) + 'stream': true, // allows playing before entire file has loaded (recommended) + 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) + 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) + 'onid3': null, // callback function for "ID3 data is added/available" + 'onload': null, // callback function for "load finished" + 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) + 'onplay': null, // callback for "play" start + 'onpause': null, // callback for "pause" + 'onresume': null, // callback for "resume" (pause toggle) + 'whileplaying': null, // callback during play (position update) + 'onstop': null, // callback for "user stop" + 'onfailure': null, // callback function for when playing fails + 'onfinish': null, // callback function for "sound finished playing" + 'onbeforefinish': null, // callback for "before sound finished playing (at [time])" + 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second) + 'onbeforefinishcomplete': null,// function to call when said sound finishes playing + 'onjustbeforefinish': null, // callback for [n] msec before end of current sound + 'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire. + 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time + 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled + 'position': null, // offset (milliseconds) to seek to within loaded sound data. + 'pan': 0, // "pan" settings, left-to-right, -100 to 100 + 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 + 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) + 'volume': 100 // self-explanatory. 0-100, the latter being the max. + }; + + this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used + 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL + 'usePeakData': false, // enable left/right channel peak (level) data + 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire. + 'useEQData': false, // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive. + 'onbufferchange': null, // callback for "isBuffering" property change + 'ondataerror': null, // callback for waveform/eq data access error (flash playing audio in other tabs/domains) + 'onstats': null // callback for when connection & play times have been measured + }; + + this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio options, merged into defaultOptions if flash 9+movieStar mode is enabled + 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) + 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants + 'onconnect': null, // rtmp: callback for connection to flash media server + 'bufferTimes': null, // array of buffer sizes to use. Size increases as buffer fills up. + 'duration': null // rtmp: song duration (msec) + }; + + this.version = null; + this.versionNumber = 'V2.97a.20101010'; + this.movieURL = null; + this.url = (smURL || null); + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.o = null; + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + this.swfCSS = { + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) + 'swfTimedout': 'swf_timedout', + 'swfUnblocked': 'swf_unblocked', // or loaded OK + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + }; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + this.specialWmodeCase = false; + this.didFlashBlock = false; + + this.filePattern = null; + this.filePatterns = { + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + }; + + this.baseMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3 + this.netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3, mp4, aac etc. + this.netStreamTypes = ['aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2']; // Flash v9.0r115+ "moviestar" formats + this.netStreamPattern = new RegExp('\\.(' + this.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + this.mimePattern = this.baseMimeTypes; + + this.features = { + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + }; + + this.sandbox = { + // <d> + 'type': null, + 'types': { + 'remote': 'remote (domain-based) rules', + 'localWithFile': 'local with file access (no internet access)', + 'localWithNetwork': 'local with network (internet access only, no local access)', + 'localTrusted': 'local, trusted (local+internet access)' + }, + 'description': null, + 'noRemote': null, + 'noLocal': null + // </d> + }; + + this.hasHTML5 = null; // switch for handling logic + this.html5 = { // stores canPlayType() results, etc. treat as read-only. + // mp3: boolean + // mp4: boolean + 'usingFlash': null // set if/when flash fallback is needed + }; + this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?) + + // --- private SM2 internals --- + + var SMSound, + _s = this, _sm = 'soundManager', _id, _ua = navigator.userAgent, _wl = window.location.href.toString(), _fV = this.flashVersion, _doc = document, _win = window, _doNothing, _init, _onready = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnReady, _processOnReady, _initUserOnload, _go, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _beginInit, _strings, _initMovie, _dcLoaded, _didDCLoaded, _getDocument, _createMovie, _die, _mobileFlash, _setPolling, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _needsFlash = null, _featureCheck, _html5OK, _html5Only = false, _html5CanPlay, _html5Ext, _dcIE, _testHTML5, _addEvt, _removeEvt, _slice = Array.prototype.slice, + _is_pre = _ua.match(/pre\//i), + _iPadOrPhone = _ua.match(/(ipad|iphone)/i), + _isMobile = (_ua.match(/mobile/i) || _is_pre || _iPadOrPhone), + _isIE = (_ua.match(/MSIE/i)), + _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), + _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), + _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), + _tryInitOnFocus = (typeof _doc.hasFocus === 'undefined' && _isSafari), + _okToDisable = !_tryInitOnFocus; + + this._use_maybe = (_wl.match(/sm2\-useHTML5Maybe\=1/i)); // temporary feature: #sm2-useHTML5Maybe=1 forces loose canPlay() check + this._overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null); + this.useAltURL = !this._overHTTP; // use altURL if not "online" + + if (_iPadOrPhone || _is_pre) { + // might as well force it on Apple + Palm, flash support unlikely + _s.useHTML5Audio = true; + _s.ignoreFlash = true; + } + + if (_is_pre || this._use_maybe) { + // less-strict canPlayType() checking option + _s.html5Test = /^(probably|maybe)$/i; + } + + // Temporary feature: allow force of HTML5 via URL: #sm2-usehtml5audio=0 or 1 + // <d> + (function(){ + var a = '#sm2-usehtml5audio=', l = _wl, b = null; + if (l.indexOf(a) !== -1) { + b = (l.substr(l.indexOf(a)+a.length) === '1'); + if (typeof console !== 'undefined' && typeof console.log !== 'undefined') { + console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); + } + _s.useHTML5Audio = b; + } + }()); + // </d> + + // --- public API methods --- + + this.supported = function() { + return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); + }; + + this.getMovie = function(smID) { + return _isIE?_win[smID]:(_isSafari?_id(smID) || _doc[smID]:_id(smID)); + }; + + this.loadFromXML = function(sXmlUrl) { + try { + _s.o._loadFromXML(sXmlUrl); + } catch(e) { + _failSafely(); + } + return true; + }; + + this.createSound = function(oOptions) { + var _cs = 'soundManager.createSound(): ', + thisOptions = null, oSound = null, _tO = null; + if (!_didInit || !_s.supported()) { + _complain(_cs + _str(!_didInit?'notReady':'notOK')); + return false; + } + if (arguments.length === 2) { + // function overloading in JS! :) ..assume simple createSound(id,url) use case + oOptions = { + 'id': arguments[0], + 'url': arguments[1] + }; + } + thisOptions = _mixin(oOptions); // inherit from defaultOptions + _tO = thisOptions; // alias + // <d> + if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) { + _s._wD(_cs + _str('badID', _tO.id), 2); + } + _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1); + // </d> + if (_idCheck(_tO.id, true)) { + _s._wD(_cs + _tO.id + ' exists', 1); + return _s.sounds[_tO.id]; + } + + function make() { + thisOptions = _loopFix(thisOptions); + _s.sounds[_tO.id] = new SMSound(_tO); + _s.soundIDs.push(_tO.id); + return _s.sounds[_tO.id]; + } + + if (_html5OK(_tO)) { + oSound = make(); + _s._wD('Loading sound '+_tO.id+' from HTML5'); + oSound._setup_html5(_tO); + } else { + if (_fV > 8 && _s.useMovieStar) { + if (_tO.isMovieStar === null) { + _tO.isMovieStar = ((_tO.serverURL || (_tO.type?_tO.type.match(_s.netStreamPattern):false)||_tO.url.match(_s.netStreamPattern))?true:false); + } + if (_tO.isMovieStar) { + _s._wD(_cs + 'using MovieStar handling'); + } + if (_tO.isMovieStar) { + if (_tO.usePeakData) { + _wDS('noPeak'); + _tO.usePeakData = false; + } + if (_tO.loops > 1) { + _wDS('noNSLoop'); + } + } + } + _tO = _policyFix(_tO, _cs); + oSound = make(); + if (_fV === 8) { + _s.o._createSound(_tO.id, _tO.onjustbeforefinishtime, _tO.loops||1, _tO.usePolicyFile); + } else { + _s.o._createSound(_tO.id, _tO.url, _tO.onjustbeforefinishtime, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.bufferTimes, _tO.onstats ? true : false, _tO.autoLoad, _tO.usePolicyFile); + if (!_tO.serverURL) { + // We are connected immediately + oSound.connected = true; + if (_tO.onconnect) { + _tO.onconnect.apply(oSound); + } + } + } + } + if (_tO.autoLoad || _tO.autoPlay) { + if (oSound) { + if (_s.isHTML5) { + oSound.autobuffer = 'auto'; // early HTML5 implementation (non-standard) + oSound.preload = 'auto'; // standard + } else { + oSound.load(_tO); + } + } + } + if (_tO.autoPlay) { + oSound.play(); + } + return oSound; + }; + + this.destroySound = function(sID, _bFromSound) { + // explicitly destroy a sound before normal page unload, etc. + if (!_idCheck(sID)) { + return false; + } + var oS = _s.sounds[sID], i; + oS._iO = {}; // Disable all callbacks while the sound is being destroyed + oS.stop(); + oS.unload(); + for (i = 0; i < _s.soundIDs.length; i++) { + if (_s.soundIDs[i] === sID) { + _s.soundIDs.splice(i, 1); + break; + } + } + if (!_bFromSound) { + // ignore if being called from SMSound instance + oS.destruct(true); + } + oS = null; + delete _s.sounds[sID]; + return true; + }; + + this.load = function(sID, oOptions) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].load(oOptions); + }; + + this.unload = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].unload(); + }; + + this.play = function(sID, oOptions) { + var fN = 'soundManager.play(): '; + if (!_didInit || !_s.supported()) { + _complain(fN + _str(!_didInit?'notReady':'notOK')); + return false; + } + if (!_idCheck(sID)) { + if (!(oOptions instanceof Object)) { + oOptions = { + url: oOptions + }; // overloading use case: play('mySound','/path/to/some.mp3'); + } + if (oOptions && oOptions.url) { + // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'}); + _s._wD(fN + 'attempting to create "' + sID + '"', 1); + oOptions.id = sID; + return _s.createSound(oOptions).play(); + } else { + return false; + } + } + return _s.sounds[sID].play(oOptions); + }; + + this.start = this.play; // just for convenience + + this.setPosition = function(sID, nMsecOffset) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPosition(nMsecOffset); + }; + + this.stop = function(sID) { + if (!_idCheck(sID)) { + return false; + } + _s._wD('soundManager.stop(' + sID + ')', 1); + return _s.sounds[sID].stop(); + }; + + this.stopAll = function() { + _s._wD('soundManager.stopAll()', 1); + for (var oSound in _s.sounds) { + if (_s.sounds[oSound] instanceof SMSound) { + _s.sounds[oSound].stop(); // apply only to sound objects + } + } + }; + + this.pause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].pause(); + }; + + this.pauseAll = function() { + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].pause(); + } + }; + + this.resume = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].resume(); + }; + + this.resumeAll = function() { + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].resume(); + } + }; + + this.togglePause = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].togglePause(); + }; + + this.setPan = function(sID, nPan) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setPan(nPan); + }; + + this.setVolume = function(sID, nVol) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].setVolume(nVol); + }; + + this.mute = function(sID) { + var fN = 'soundManager.mute(): ', + i = 0; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + _s._wD(fN + 'Muting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].mute(); + } + _s.muted = true; + } else { + if (!_idCheck(sID)) { + return false; + } + _s._wD(fN + 'Muting "' + sID + '"'); + return _s.sounds[sID].mute(); + } + return true; + }; + + this.muteAll = function() { + _s.mute(); + }; + + this.unmute = function(sID) { + var fN = 'soundManager.unmute(): ', i; + if (typeof sID !== 'string') { + sID = null; + } + if (!sID) { + _s._wD(fN + 'Unmuting all sounds'); + for (i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].unmute(); + } + _s.muted = false; + } else { + if (!_idCheck(sID)) { + return false; + } + _s._wD(fN + 'Unmuting "' + sID + '"'); + return _s.sounds[sID].unmute(); + } + return true; + }; + + this.unmuteAll = function() { + _s.unmute(); + }; + + this.toggleMute = function(sID) { + if (!_idCheck(sID)) { + return false; + } + return _s.sounds[sID].toggleMute(); + }; + + this.getMemoryUse = function() { + if (_fV === 8) { + return 0; + } + if (_s.o) { + return parseInt(_s.o._getMemoryUse(), 10); + } + }; + + this.disable = function(bNoDisable) { + // destroy all functions + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled) { + return false; + } + _disabled = true; + _wDS('shutdown', 1); + for (var i = _s.soundIDs.length; i--;) { + _disableObject(_s.sounds[_s.soundIDs[i]]); + } + _initComplete(bNoDisable); // fire "complete", despite fail + _removeEvt(_win, 'load', _initUserOnload); + return true; + }; + + this.canPlayMIME = function(sMIME) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay({type:sMIME}); + } + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + return (sMIME?(sMIME.match(_s.mimePattern)?true:false):null); + } + }; + + this.canPlayURL = function(sURL) { + var result; + if (_s.hasHTML5) { + result = _html5CanPlay(sURL); + } + if (!_needsFlash || result) { + // no flash, or OK + return result; + } else { + return (sURL?(sURL.match(_s.filePattern)?true:false):null); + } + }; + + this.canPlayLink = function(oLink) { + if (typeof oLink.type !== 'undefined' && oLink.type) { + if (_s.canPlayMIME(oLink.type)) { + return true; + } + } + return _s.canPlayURL(oLink.href); + }; + + this.getSoundById = function(sID, suppressDebug) { + if (!sID) { + throw new Error('SoundManager.getSoundById(): sID is null/undefined'); + } + var result = _s.sounds[sID]; + if (!result && !suppressDebug) { + _s._wD('"' + sID + '" is an invalid sound ID.', 2); + } + return result; + }; + + this.onready = function(oMethod, oScope) { + if (oMethod && oMethod instanceof Function) { + if (_didInit) { + _wDS('queue'); + } + if (!oScope) { + oScope = _win; + } + _addOnReady(oMethod, oScope); + _processOnReady(); + return true; + } else { + throw _str('needFunction'); + } + }; + + this.getMoviePercent = function() { + return (_s.o && typeof _s.o.PercentLoaded !== 'undefined'?_s.o.PercentLoaded():null); + }; + + this._writeDebug = function(sText, sType, bTimestamp) { + // If the debug log callback is set, always call it, regardless of debugMode + if (_s.ondebuglog) { + _s.ondebuglog(sText, sType, bTimestamp); + } + // pseudo-private console.log()-style output + // <d> + var sDID = 'soundmanager-debug', o, oItem, sMethod; + if (!_s.debugMode) { + return false; + } + if (typeof bTimestamp !== 'undefined' && bTimestamp) { + sText = sText + ' | ' + new Date().getTime(); + } + if (_hasConsole && _s.useConsole) { + sMethod = _debugLevels[sType]; + if (typeof console[sMethod] !== 'undefined') { + console[sMethod](sText); + } else { + console.log(sText); + } + if (_s.useConsoleOnly) { + return true; + } + } + try { + o = _id(sDID); + if (!o) { + return false; + } + oItem = _doc.createElement('div'); + if (++_wdCount % 2 === 0) { + oItem.className = 'sm2-alt'; + } + if (typeof sType === 'undefined') { + sType = 0; + } else { + sType = parseInt(sType, 10); + } + oItem.appendChild(_doc.createTextNode(sText)); + if (sType) { + if (sType >= 2) { + oItem.style.fontWeight = 'bold'; + } + if (sType === 3) { + oItem.style.color = '#ff3333'; + } + } + // o.appendChild(oItem); // top-to-bottom + o.insertBefore(oItem, o.firstChild); // bottom-to-top + } catch(e) { + // oh well + } + o = null; + // </d> + return true; + }; + this._wD = this._writeDebug; // alias + + this._debug = function() { + // <d> + _wDS('currentObj', 1); + for (var i = 0, j = _s.soundIDs.length; i < j; i++) { + _s.sounds[_s.soundIDs[i]]._debug(); + } + // </d> + }; + + this.reboot = function() { + // attempt to reset and init SM2 + _s._wD('soundManager.reboot()'); + if (_s.soundIDs.length) { + _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...'); + } + for (var i = _s.soundIDs.length; i--;) { + _s.sounds[_s.soundIDs[i]].destruct(); + } + // trash ze flash + try { + if (_isIE) { + _oRemovedHTML = _s.o.innerHTML; + } + _oRemoved = _s.o.parentNode.removeChild(_s.o); + _s._wD('Flash movie removed.'); + } catch(e) { + // uh-oh. + _wDS('badRemove', 2); + } + // actually, force recreate of movie. + _oRemovedHTML = _oRemoved = null; + _s.enabled = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; + _s.soundIDs = _s.sounds = []; + _s.o = null; + for (i = _onready.length; i--;) { + _onready[i].fired = false; + } + _s._wD(_sm + ': Rebooting...'); + _win.setTimeout(function() { + _s.beginDelayedInit(); + }, 20); + }; + + this.destruct = function() { + _s._wD('soundManager.destruct()'); + _s.disable(true); + }; + + this.beginDelayedInit = function() { + // _s._wD('soundManager.beginDelayedInit()'); + _windowLoaded = true; + _dcLoaded(); + setTimeout(_beginInit, 20); + _delayWaitForEI(); + }; + + // --- SMSound (sound object) instance --- + + SMSound = function(oOptions) { + var _t = this, _resetProperties, _add_html5_events, _stop_html5_timer, _start_html5_timer, _get_html5_duration, _a; + this.sID = oOptions.id; + this.url = oOptions.url; + this.options = _mixin(oOptions); + this.instanceOptions = this.options; // per-play-instance-specific options + this._iO = this.instanceOptions; // short alias + // assign property defaults + this.pan = this.options.pan; + this.volume = this.options.volume; + this._lastURL = null; + this.isHTML5 = false; + + // --- public methods --- + + this.id3 = {}; + + this._debug = function() { + // <d> + // pseudo-private console.log()-style output + if (_s.debugMode) { + var stuff = null, msg = [], sF, sfBracket, maxLength = 64; + for (stuff in _t.options) { + if (_t.options[stuff] !== null) { + if (_t.options[stuff] instanceof Function) { + // handle functions specially + sF = _t.options[stuff].toString(); + sF = sF.replace(/\s\s+/g, ' '); // normalize spaces + sfBracket = sF.indexOf('{'); + msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }'); + } else { + msg.push(' ' + stuff + ': ' + _t.options[stuff]); + } + } + } + _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}'); + } + // </d> + }; + + this._debug(); + + this.load = function(oOptions) { + var oS = null; + if (typeof oOptions !== 'undefined') { + _t._iO = _mixin(oOptions); + _t.instanceOptions = _t._iO; + } else { + oOptions = _t.options; + _t._iO = oOptions; + _t.instanceOptions = _t._iO; + if (_t._lastURL && _t._lastURL !== _t.url) { + _wDS('manURL'); + _t._iO.url = _t.url; + _t.url = null; + } + } + _s._wD('soundManager.load(): ' + _t._iO.url, 1); + if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { + _wDS('onURL', 1); + return _t; + } + _t._lastURL = _t.url; + _t.loaded = false; + _t.readyState = 1; + _t.playState = 0; + if (_html5OK(_t._iO)) { + _s._wD('HTML 5 load: '+_t._iO.url); + oS = _t._setup_html5(_t._iO); + oS.load(); + if (_t._iO.autoPlay) { + _t.play(); + } + } else { + try { + _t.isHTML5 = false; + _t._iO = _policyFix(_loopFix(_t._iO)); + if (_fV === 8) { + _s.o._load(_t.sID, _t._iO.url, _t._iO.stream, _t._iO.autoPlay, (_t._iO.whileloading?1:0), _t._iO.loops||1, _t._iO.usePolicyFile); + } else { + _s.o._load(_t.sID, _t._iO.url, _t._iO.stream?true:false, _t._iO.autoPlay?true:false, _t._iO.loops||1, _t._iO.autoLoad?true:false, _t._iO.usePolicyFile); + } + } catch(e) { + _wDS('smError', 2); + _debugTS('onload', false); + _die(); + } + } + return _t; + }; + + this.unload = function() { + // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3 + // Flash 9/AS3: Close stream, preventing further load + if (_t.readyState !== 0) { + _s._wD('SMSound.unload(): "' + _t.sID + '"'); + if (!_t.isHTML5) { + if (_fV === 8) { + _s.o._unload(_t.sID, _s.nullURL); + } else { + _s.o._unload(_t.sID); + } + } else { + _stop_html5_timer(); + if (_a) { + // abort()-style method here, stop loading? (doesn't exist?) + _a.pause(); + _a.src = _s.nullURL; // needed? does nulling object work? any better way to cancel/unload/abort? + _a.load(); + _t._audio = null; + _a = null; + // delete _t._audio; + } + } + // reset load/status flags + _resetProperties(); + } + return _t; + }; + + this.destruct = function(_bFromSM) { + _s._wD('SMSound.destruct(): "' + _t.sID + '"'); + if (!_t.isHTML5) { + // kill sound within Flash + // Disable the onfailure handler + _t._iO.onfailure = null; + _s.o._destroySound(_t.sID); + } else { + _stop_html5_timer(); + if (_a) { + _a.pause(); + _a.src = 'about:blank'; + _a.load(); + _t._audio = null; + _a = null; + // delete _t._audio; + } + } + if (!_bFromSM) { + _s.destroySound(_t.sID, true); // ensure deletion from controller + } + }; + + this.play = function(oOptions, _updatePlayState) { + var fN = 'SMSound.play(): ', allowMulti; + _updatePlayState = (typeof _updatePlayState === 'undefined' ? true : _updatePlayState); + if (!oOptions) { + oOptions = {}; + } + _t._iO = _mixin(oOptions, _t._iO); + _t._iO = _mixin(_t._iO, _t.options); + _t.instanceOptions = _t._iO; + if (_t._iO.serverURL) { + if (!_t.connected) { + if (!_t.getAutoPlay()) { + _s._wD(fN+' Netstream not connected yet - setting autoPlay'); + _t.setAutoPlay(true); + } + return _t; + } + } + if (_html5OK(_t._iO)) { + _t._setup_html5(_t._iO); + _start_html5_timer(); + } + // KJV paused sounds have playState 1. We want these sounds to play. + if (_t.playState === 1 && !_t.paused) { + allowMulti = _t._iO.multiShot; + if (!allowMulti) { + _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1); + return _t; + } else { + _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1); + if (_t.isHTML5) { + // TODO: BUG? + _t.setPosition(_t._iO.position); + } + } + } + if (!_t.loaded) { + if (_t.readyState === 0) { + _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1); + // try to get this sound playing ASAP + if (!_t.isHTML5) { + if (!_t._iO.serverURL) { + _t._iO.autoPlay = true; + _t.load(_t._iO); + } + } else { + _t.load(_t._iO); + _t.readyState = 1; + } + } else if (_t.readyState === 2) { + _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2); + return _t; + } else { + _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1); + } + } else { + _s._wD(fN + '"' + _t.sID + '"'); + } + // Streams will pause when their buffer is full if they are not auto-playing. + // In this case paused is true, but the song hasn't started playing yet. If + // we just call resume() the onplay() callback will never be called. + + // Also, if we just call resume() in this case and the sound has been muted + // (volume is 0), it will never have its volume set so sound will be heard + // when it shouldn't. + if (_t.paused && _t.position && _t.position > 0) { // https://gist.github.com/37b17df75cc4d7a90bf6 + _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1); + _t.resume(); + } else { + _s._wD(fN+'"'+ _t.sID+'" is starting to play'); + _t.playState = 1; + _t.paused = false; + if (!_t.instanceCount || _t._iO.multiShotEvents || (_fV > 8 && !_t.isHTML5 && !_t.getAutoPlay())) { + _t.instanceCount++; + } + _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0); + _t._iO = _policyFix(_loopFix(_t._iO)); + if (_t._iO.onplay && _updatePlayState) { + _t._iO.onplay.apply(_t); + } + _t.setVolume(_t._iO.volume, true); + _t.setPan(_t._iO.pan, true); + if (!_t.isHTML5) { + _s.o._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t.position:_t.position / 1000)); + } else { + _start_html5_timer(); + _t._setup_html5().play(); + } + } + return _t; + }; + + this.start = this.play; // just for convenience + + this.stop = function(bAll) { + if (_t.playState === 1) { + _t._onbufferchange(0); + _t.resetOnPosition(0); + if (!_t.isHTML5) { + _t.playState = 0; + } + _t.paused = false; + if (_t._iO.onstop) { + _t._iO.onstop.apply(_t); + } + if (!_t.isHTML5) { + _s.o._stop(_t.sID, bAll); + // hack for netStream: just unload + if (_t._iO.serverURL) { + _t.unload(); + } + } else { + if (_a) { + _t.setPosition(0); // act like Flash, though + _a.pause(); // html5 has no stop() + _t.playState = 0; + _t._onTimer(); // and update UI + _stop_html5_timer(); + _t.unload(); + } + } + _t.instanceCount = 0; + _t._iO = {}; + } + return _t; + }; + + this.setAutoPlay = function(autoPlay) { + _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off')); + _t._iO.autoPlay = autoPlay; + _s.o._setAutoPlay(_t.sID, autoPlay); + if (autoPlay) { + // KJV Only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) + if (!_t.instanceCount && _t.readyState === 1) { + _t.instanceCount++; + _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount); + } + } + }; + + this.getAutoPlay = function() { + return _t._iO.autoPlay; + }; + + this.setPosition = function(nMsecOffset, bNoDebug) { + if (nMsecOffset === undefined) { + nMsecOffset = 0; + } + // KJV Use the duration from the instance options, if we don't have a track duration yet. + // Auto-loading streams with a starting position in their options will start playing + // as soon as they connect. In the start() call we set the position on the stream, + // but because the stream hasn't played _t.duration won't have been set (that is + // done in whileloading()). So if we don't have a duration yet, use the duration + // from the instance options, if available. + var position, offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); // position >= 0 and <= current available (loaded) duration + _t.position = offset; + _t.resetOnPosition(_t.position); + if (!_t.isHTML5) { + position = _fV === 9 ? _t.position : _t.position / 1000; + // KJV We want our sounds to play on seek. A progressive download that + // is loaded has paused = false so resume() does nothing and the sound + // doesn't play. Handle that case here. + if (_t.playState === 0) { + _t.play({ position: position }); + } else { + _s.o._setPosition(_t.sID, position, (_t.paused || !_t.playState)); // if paused or not playing, will not resume (by playing) + // if (_t.paused) { + // _t.resume(); + // } + } + } else if (_a) { + _s._wD('setPosition(): setting position to '+(_t.position / 1000)); + if (_t.playState) { + // DOM/JS errors/exceptions to watch out for: + // if seek is beyond (loaded?) position, "DOM exception 11" + // "INDEX_SIZE_ERR": DOM exception 1 + try { + _a.currentTime = _t.position / 1000; + } catch(e) { + _s._wD('setPosition('+_t.position+'): WARN: Caught exception: '+e.message, 2); + } + } else { + _s._wD('HTML 5 warning: cannot set position while playState == 0 (not playing)',2); + } + if (_t.paused) { // if paused, refresh UI right away + _t._onTimer(true); // force update + if (_t._iO.useMovieStar) { + _t.resume(); + } + } + } + return _t; + }; + + this.pause = function(bCallFlash) { + if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { + return _t; + } + _s._wD('SMSound.pause()'); + _t.paused = true; + if (!_t.isHTML5) { + if (bCallFlash || bCallFlash === undefined) { + _s.o._pause(_t.sID); + } + } else { + _t._setup_html5().pause(); + _stop_html5_timer(); + } + if (_t._iO.onpause) { + _t._iO.onpause.apply(_t); + } + return _t; + }; + + this.resume = function() { + // When auto-loaded streams pause on buffer full they have a playState of 0. + // We need to make sure that the playState is set to 1 when these streams "resume". + if (!_t.paused) { + return _t; + } + _s._wD('SMSound.resume()'); + _t.paused = false; + _t.playState = 1; // TODO: verify that this is needed. + if (!_t.isHTML5) { + _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume) + } else { + _t._setup_html5().play(); + _start_html5_timer(); + } + if (_t._iO.onresume) { + _t._iO.onresume.apply(_t); + } + return _t; + }; + + this.togglePause = function() { + _s._wD('SMSound.togglePause()'); + if (_t.playState === 0) { + _t.play({ + position: (_fV === 9 && !_t.isHTML5 ? _t.position:_t.position / 1000) + }); + return _t; + } + if (_t.paused) { + _t.resume(); + } else { + _t.pause(); + } + return _t; + }; + + this.setPan = function(nPan, bInstanceOnly) { + if (typeof nPan === 'undefined') { + nPan = 0; + } + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + if (!_t.isHTML5) { + _s.o._setPan(_t.sID, nPan); + } // else { no HTML5 pan? } + _t._iO.pan = nPan; + if (!bInstanceOnly) { + _t.pan = nPan; + } + return _t; + }; + + this.setVolume = function(nVol, bInstanceOnly) { + if (typeof nVol === 'undefined') { + nVol = 100; + } + if (typeof bInstanceOnly === 'undefined') { + bInstanceOnly = false; + } + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); + } else if (_a) { + _a.volume = nVol/100; + } + _t._iO.volume = nVol; + if (!bInstanceOnly) { + _t.volume = nVol; + } + return _t; + }; + + this.mute = function() { + _t.muted = true; + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, 0); + } else if (_a) { + _a.muted = true; + } + return _t; + }; + + this.unmute = function() { + _t.muted = false; + var hasIO = typeof _t._iO.volume !== 'undefined'; + if (!_t.isHTML5) { + _s.o._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); + } else if (_a) { + _a.muted = false; + } + return _t; + }; + + this.toggleMute = function() { + return (_t.muted?_t.unmute():_t.mute()); + }; + + this.onposition = function(nPosition, oMethod, oScope) { + // TODO: allow for ranges, too? eg. (nPosition instanceof Array) + _t._onPositionItems.push({ + position: nPosition, + method: oMethod, + scope: (typeof oScope !== 'undefined'?oScope:_t), + fired: false + }); + return _t; + }; + + this.processOnPosition = function() { + var i, item, j = _t._onPositionItems.length; + if (!j || !_t.playState || _t._onPositionFired >= j) { + return false; + } + for (i=j; i--;) { + item = _t._onPositionItems[i]; + if (!item.fired && _t.position >= item.position) { + item.method.apply(item.scope,[item.position]); + item.fired = true; + _s._onPositionFired++; + } + } + return true; + }; + + this.resetOnPosition = function(nPosition) { + // reset "fired" for items interested in this position + var i, item, j = _t._onPositionItems.length; + if (!j) { + return false; + } + for (i=j; i--;) { + item = _t._onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + _s._onPositionFired--; + } + } + return true; + }; + + // pseudo-private soundManager reference + + this._onTimer = function(bForce) { + // HTML 5-only _whileplaying() etc. + var time, x = {}; + if (_t._hasTimer || bForce) { + if (_a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { // TODO: May not need to track readyState (1 = loading) + _t.duration = _get_html5_duration(); + _t.durationEstimate = _t.duration; + time = _a.currentTime?_a.currentTime*1000:0; + _t._whileplaying(time,x,x,x,x); + return true; + } else { + _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK')); + return false; + } + } + }; + + // --- private internals --- + + _get_html5_duration = function() { + var d = (_a?_a.duration*1000:undefined); + return (d && !isNaN(d)?d:null); + }; + + _start_html5_timer = function() { + if (_t.isHTML5) { + _startTimer(_t); + } + }; + + _stop_html5_timer = function() { + if (_t.isHTML5) { + _stopTimer(_t); + } + }; + + _resetProperties = function(bLoaded) { + _t._onPositionItems = []; + _t._onPositionFired = 0; + _t._hasTimer = null; + _t._added_events = null; + _t._audio = null; + _a = null; + _t.bytesLoaded = null; + _t.bytesTotal = null; + _t.position = null; + _t.duration = (_t._iO && _t._iO.duration?_t._iO.duration:null); + _t.durationEstimate = null; + _t.failures = 0; + _t.loaded = false; + _t.playState = 0; + _t.paused = false; + _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success + _t.muted = false; + _t.didBeforeFinish = false; + _t.didJustBeforeFinish = false; + _t.isBuffering = false; + _t.instanceOptions = {}; + _t.instanceCount = 0; + _t.peakData = { + left: 0, + right: 0 + }; + _t.waveformData = { + left: [], + right: [] + }; + _t.eqData = []; // legacy: 1D array + _t.eqData.left = []; + _t.eqData.right = []; + }; + + _resetProperties(); + + // pseudo-private methods used by soundManager + + this._setup_html5 = function(oOptions) { + var _iO = _mixin(_t._iO, oOptions); + if (_a) { + if (_t.url !== _iO.url) { + _s._wD('setting new URL on existing object: '+_iO.url); + _a.src = _iO.url; + } + } else { + _s._wD('creating HTML 5 audio element with URL: '+_iO.url); + _t._audio = new Audio(_iO.url); + _a = _t._audio; + _t.isHTML5 = true; + _add_html5_events(); + } + _a.loop = (_iO.loops>1?'loop':''); + return _t._audio; + }; + + // related private methods + + _add_html5_events = function() { + if (_t._added_events) { + return false; + } + _t._added_events = true; + + function _add(oEvt, oFn, bCapture) { + return (_a ? _a.addEventListener(oEvt, oFn, bCapture||false) : null); + } + + _add('load', function(e) { + _s._wD('HTML5::load: '+_t.sID); + if (_a) { + _t._onbufferchange(0); + _t._whileloading(_t.bytesTotal, _t.bytesTotal, _get_html5_duration()); + _t._onload(true); + } + }, false); + + _add('canplay', function(e) { + _s._wD('HTML5::canplay: '+_t.sID); + // enough has loaded to play + _t._onbufferchange(0); + },false); + + _add('waiting', function(e) { + _s._wD('HTML5::waiting: '+_t.sID); + // playback faster than download rate, etc. + _t._onbufferchange(1); + },false); + + _add('progress', function(e) { // not supported everywhere yet.. + _s._wD('HTML5::progress: '+_t.sID+': loaded/total: '+(e.loaded||0)+'/'+(e.total||1)); + if (!_t.loaded && _a) { + _t._onbufferchange(0); // if progress, likely not buffering + _t._whileloading(e.loaded||0, e.total||1, _get_html5_duration()); + } + }, false); + + _add('error', function(e) { + if (_a) { + _s._wD('HTML5::error: '+_a.error.code); + // call load with error state? + _t._onload(false); + } + }, false); + + _add('loadstart', function(e) { + _s._wD('HTML5::loadstart: '+_t.sID); + // assume buffering at first + _t._onbufferchange(1); + }, false); + + _add('play', function(e) { + _s._wD('HTML5::play: '+_t.sID); + // once play starts, no buffering + _t._onbufferchange(0); + }, false); + + // TODO: verify if this is actually implemented anywhere yet. + _add('playing', function(e) { + _s._wD('HTML5::playing: '+_t.sID); + // once play starts, no buffering + _t._onbufferchange(0); + }, false); + + _add('timeupdate', function(e) { + _t._onTimer(); + }, false); + + // avoid stupid premature event-firing bug in Safari(?) + setTimeout(function(){ + if (_t && _a) { + _add('ended',function(e) { + _s._wD('HTML5::ended: '+_t.sID); + _t._onfinish(); + }, false); + } + }, 250); + return true; + }; + + // --- "private" methods called by Flash --- + + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + _t.bytesLoaded = nBytesLoaded; + _t.bytesTotal = nBytesTotal; + _t.duration = Math.floor(nDuration); + _t.bufferLength = nBufferLength; + if (!_t._iO.isMovieStar) { + if (_t._iO.duration) { + // use options, if specified and larger + _t.durationEstimate = (_t.duration > _t._iO.duration) ? _t.duration : _t._iO.duration; + } else { + _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); + } + if (_t.durationEstimate === undefined) { + _t.durationEstimate = _t.duration; + } + _t.bufferLength = nBufferLength; + if (_t.readyState !== 3 && _t._iO.whileloading) { + _t._iO.whileloading.apply(_t); + } + } else { + _t.durationEstimate = _t.duration; + if (_t.readyState !== 3 && _t._iO.whileloading) { + _t._iO.whileloading.apply(_t); + } + } + }; + + this._onid3 = function(oID3PropNames, oID3Data) { + // oID3PropNames: string array (names) + // ID3Data: string array (data) + _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.'); + var oData = [], i, j; + for (i = 0, j = oID3PropNames.length; i < j; i++) { + oData[oID3PropNames[i]] = oID3Data[i]; + } + _t.id3 = _mixin(_t.id3, oData); + if (_t._iO.onid3) { + _t._iO.onid3.apply(_t); + } + }; + + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + if (isNaN(nPosition) || nPosition === null) { + return false; // Flash may return NaN at times + } + if (_t.playState === 0 && nPosition > 0) { + // invalid position edge case for end/stop + nPosition = 0; + } + _t.position = nPosition; + _t.processOnPosition(); + if (_fV > 8 && !_t.isHTML5) { + if (_t._iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { + _t.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + if (_t._iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { + _t.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + if (_t._iO.useEQData) { + if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { + var eqLeft = oEQData.leftEQ.split(','); + _t.eqData = eqLeft; + _t.eqData.left = eqLeft; + if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { + _t.eqData.right = oEQData.rightEQ.split(','); + } + } + } + } + if (_t.playState === 1) { + // special case/hack: ensure buffering is false if loading from cache (and not yet started) + if (!_t.isHTML5 && _s.flashVersion === 8 && !_t.position && _t.isBuffering) { + _t._onbufferchange(0); + } + if (_t._iO.whileplaying) { + _t._iO.whileplaying.apply(_t); // flash may call after actual finish + } + if ((_t.loaded || (!_t.loaded && _t._iO.isMovieStar)) && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration - _t.position <= _t._iO.onbeforefinishtime) { + _t._onbeforefinish(); + } + } + return true; + }; + + this._onconnect = function(bSuccess) { + var fN = 'SMSound._onconnect(): '; + bSuccess = (bSuccess === 1); + _s._wD(fN+'"'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2)); + _t.connected = bSuccess; + if (bSuccess) { + _t.failures = 0; + if (_t._iO.onconnect) { + _t._iO.onconnect.apply(_t,[bSuccess]); + } + // don't play if the sound is being destroyed + if (_idCheck(_t.sID) && (_t.options.autoLoad || _t.getAutoPlay())) { + _t.play(undefined, _t.getAutoPlay()); // only update the play state if auto playing + } + } + }; + + this._onload = function(nSuccess) { + var fN = 'SMSound._onload(): ', loadOK = (nSuccess?true:false); + _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2)); + // <d> + if (!loadOK && !_t.isHTML5) { + if (_s.sandbox.noRemote === true) { + _s._wD(fN + _str('noNet'), 1); + } + if (_s.sandbox.noLocal === true) { + _s._wD(fN + _str('noLocal'), 1); + } + } + // </d> + _t.loaded = loadOK; + _t.readyState = loadOK?3:2; + _t._onbufferchange(0); + if (_t._iO.onload) { + _t._iO.onload.apply(_t, [loadOK]); + } + return true; + }; + + // fire onfailure() only once at most + // at this point we just recreate failed sounds rather than trying to reconnect. + this._onfailure = function(msg, level, code) { + _t.failures++; + _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures); + if (_t._iO.onfailure && _t.failures === 1) { + _t._iO.onfailure(_t, msg, level, code); + } else { + _s._wD('SMSound._onfailure(): ignoring'); + } + }; + + this._onbeforefinish = function() { + if (!_t.didBeforeFinish) { + _t.didBeforeFinish = true; + if (_t._iO.onbeforefinish) { + _s._wD('SMSound._onbeforefinish(): "' + _t.sID + '"'); + _t._iO.onbeforefinish.apply(_t); + } + } + }; + + this._onjustbeforefinish = function(msOffset) { + if (!_t.didJustBeforeFinish) { + _t.didJustBeforeFinish = true; + if (_t._iO.onjustbeforefinish) { + _s._wD('SMSound._onjustbeforefinish(): "' + _t.sID + '"'); + _t._iO.onjustbeforefinish.apply(_t); + } + } + }; + + // KJV - connect & play time callback from Flash + this._onstats = function(stats) { + if (_t._iO.onstats) { + _t._iO.onstats(_t, stats); + } + }; + + this._onfinish = function() { + // _s._wD('SMSound._onfinish(): "' + _t.sID + '" got instanceCount '+_t.instanceCount); + _t._onbufferchange(0); + _t.resetOnPosition(0); + if (_t._iO.onbeforefinishcomplete) { + _t._iO.onbeforefinishcomplete.apply(_t); + } + // reset some state items + _t.didBeforeFinish = false; + _t.didJustBeforeFinish = false; + if (_t.instanceCount) { + _t.instanceCount--; + if (!_t.instanceCount) { + // reset instance options + _t.playState = 0; + _t.paused = false; + _t.instanceCount = 0; + _t.instanceOptions = {}; + _stop_html5_timer(); + } + if (!_t.instanceCount || _t._iO.multiShotEvents) { + // fire onfinish for last, or every instance + if (_t._iO.onfinish) { + _s._wD('SMSound._onfinish(): "' + _t.sID + '"'); + _t._iO.onfinish.apply(_t); + } + } + } + }; + + this._onbufferchange = function(nIsBuffering) { + var fN = 'SMSound._onbufferchange()'; + if (_t.playState === 0) { + // ignore if not playing + return false; + } + if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { + return false; + } + _t.isBuffering = (nIsBuffering === 1); + if (_t._iO.onbufferchange) { + _s._wD(fN + ': ' + nIsBuffering); + _t._iO.onbufferchange.apply(_t); + } + return true; + }; + + this._ondataerror = function(sError) { + // flash 9 wave/eq data handler + if (_t.playState > 0) { // hack: called at start, and end from flash at/after onfinish() + _s._wD('SMSound._ondataerror(): ' + sError); + if (_t._iO.ondataerror) { + _t._iO.ondataerror.apply(_t); + } + } + }; + + }; // SMSound() + + // --- private SM2 internals --- + + _getDocument = function() { + return (_doc.body?_doc.body:(_doc._docElement?_doc.documentElement:_doc.getElementsByTagName('div')[0])); + }; + + _id = function(sID) { + return _doc.getElementById(sID); + }; + + _mixin = function(oMain, oAdd) { + // non-destructive merge + var o1 = {}, i, o2, o; + for (i in oMain) { // clone c1 + if (oMain.hasOwnProperty(i)) { + o1[i] = oMain[i]; + } + } + o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); + for (o in o2) { + if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { + o1[o] = o2[o]; + } + } + return o1; + }; + + (function() { + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + function getArgs(oArgs) { + var args = _slice.call(oArgs), len = args.length; + if (old) { + args[1] = 'on' + args[1]; // prefix + if (len > 3) { + args.pop(); // no capture + } + } else if (len === 3) { + args.push(false); + } + return args; + } + + function apply(args, sType) { + var oFunc = args.shift()[evt[sType]]; + if (old) { + oFunc(args[0], args[1]); + } else { + oFunc.apply(this, args); + } + } + + _addEvt = function() { + apply(getArgs(arguments), 'add'); + }; + + _removeEvt = function() { + apply(getArgs(arguments), 'remove'); + }; + }()); + + _html5OK = function(iO) { + return ((iO.type?_html5CanPlay({type:iO.type}):false)||_html5CanPlay(iO.url)); + }; + + _html5CanPlay = function(sURL) { + // try to find MIME, test and return truthiness + if (!_s.useHTML5Audio || !_s.hasHTML5) { + return false; + } + var result, mime, fileExt, item, aF = _s.audioFormats; + if (!_html5Ext) { + _html5Ext = []; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + _html5Ext.push(item); + if (aF[item].related) { + _html5Ext = _html5Ext.concat(aF[item].related); + } + } + } + _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')','i'); + } + mime = (typeof sURL.type !== 'undefined'?sURL.type:null); + fileExt = (typeof sURL === 'string'?sURL.toLowerCase().match(_html5Ext):null); // TODO: Strip URL queries, etc. + if (!fileExt || !fileExt.length) { + if (!mime) { + return false; + } + } else { + fileExt = fileExt[0].substr(1); // "mp3", for example + } + if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { + // result known + return _s.html5[fileExt]; + } else { + if (!mime) { + if (fileExt && _s.html5[fileExt]) { + return _s.html5[fileExt]; + } else { + // best-case guess, audio/whatever-dot-filename-format-you're-playing + mime = 'audio/'+fileExt; + } + } + result = _s.html5.canPlayType(mime); + _s.html5[fileExt] = result; + // _s._wD('canPlayType, found result: '+result); + return result; + } + }; + + _testHTML5 = function() { + if (!_s.useHTML5Audio || typeof Audio === 'undefined') { + return false; + } + var a = (typeof Audio !== 'undefined' ? new Audio():null), item, support = {}, aF, i; + function _cp(m) { + var canPlay, i, j, isOK = false; + if (!a || typeof a.canPlayType !== 'function') { + return false; + } + if (m instanceof Array) { + // iterate through all mime types, return any successes + for (i=0, j=m.length; i<j && !isOK; i++) { + if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) { + isOK = true; + _s.html5[m[i]] = true; + } + } + return isOK; + } else { + canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false); + return (canPlay && (canPlay.match(_s.html5Test)?true:false)); + } + } + // test all registered formats + codecs + aF = _s.audioFormats; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + support[item] = _cp(aF[item].type); + // assign result to related formats, too + if (aF[item] && aF[item].related) { + for (i=0; i<aF[item].related.length; i++) { + _s.html5[aF[item].related[i]] = support[item]; + } + } + } + } + support.canPlayType = (a?_cp:null); + _s.html5 = _mixin(_s.html5, support); + return true; + }; + + _strings = { + // <d> + notReady: 'Not loaded yet - wait for soundManager.onload()/onready()', + notOK: 'Audio support is not available.', + appXHTML: _sm + '::createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.', + spcWmode: _sm + '::createMovie(): Removing wmode, preventing win32 below-the-fold SWF loading issue', + swf404: _sm + ': Verify that %s is a valid path.', + tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)', + checkSWF: 'See SWF output for more debug info.', + localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', + waitFocus: _sm + ': Special case: Waiting for focus-related event..', + waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...', + waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...', + needFunction: _sm + '.onready(): Function object expected', + badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character', + noMS: 'MovieStar mode not enabled. Exiting.', + currentObj: '--- ' + _sm + '._debug(): Current sound objects ---', + waitEI: _sm + '::initMovie(): Waiting for ExternalInterface call from Flash..', + waitOnload: _sm + ': Waiting for window.onload()', + docLoaded: _sm + ': Document already loaded', + onload: _sm + '::initComplete(): calling soundManager.onload()', + onloadOK: _sm + '.onload() complete', + init: '-- ' + _sm + '::init() --', + didInit: _sm + '::init(): Already called?', + flashJS: _sm + ': Attempting to call Flash from JS..', + noPolling: _sm + ': Polling (whileloading()/whileplaying() support) is disabled.', + secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', + badRemove: 'Warning: Failed to remove flash movie.', + noPeak: 'Warning: peakData features unsupported for movieStar formats', + shutdown: _sm + '.disable(): Shutting down', + queue: _sm + '.onready(): Queueing handler', + smFail: _sm + ': Failed to initialise.', + smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', + fbTimeout: 'No flash response, applying .'+_s.swfCSS.swfTimedout+' CSS..', + fbLoaded: 'Flash loaded', + fbHandler: 'soundManager::flashBlockHandler()', + manURL: 'SMSound.load(): Using manually-assigned URL', + onURL: _sm + '.load(): current URL already assigned.', + badFV: 'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', + as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', + noNSLoop: 'Note: Looping not implemented for MovieStar formats', + needfl9: 'Note: Switching to flash 9, required for MP4 formats.', + mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', + mfOn: 'mobileFlash::enabling on-screen flash repositioning', + policy: 'Enabling usePolicyFile for data access' + // </d> + }; + + _id = function(sID) { + return _doc.getElementById(sID); + }; + + _str = function() { // o [,items to replace] + // <d> + var args = _slice.call(arguments), // real array, please + o = args.shift(), // first arg + str = (_strings && _strings[o]?_strings[o]:''), i, j; + if (str && args && args.length) { + for (i = 0, j = args.length; i < j; i++) { + str = str.replace('%s', args[i]); + } + } + return str; + // </d> + }; + + _loopFix = function(sOpt) { + // flash 8 requires stream = false for looping to work + if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) { + _wDS('as2loop'); + sOpt.stream = false; + } + return sOpt; + }; + + _policyFix = function(sOpt, sPre) { + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + _s._wD((sPre?sPre+':':'') + _str('policy')); + sOpt.usePolicyFile = true; + } + return sOpt; + }; + + _complain = function(sMsg) { + if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { + console.warn(sMsg); + } else { + _s._wD(sMsg); + } + }; + + _doNothing = function() { + return false; + }; + + _disableObject = function(o) { + for (var oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = _doNothing; + } + } + oProp = null; + }; + + _failSafely = function(bNoDisable) { + // general failure exception handler + if (typeof bNoDisable === 'undefined') { + bNoDisable = false; + } + if (_disabled || bNoDisable) { + _wDS('smFail', 2); + _s.disable(bNoDisable); + } + }; + + _normalizeMovieURL = function(smURL) { + var urlParams = null; + if (smURL) { + if (smURL.match(/\.swf(\?\.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + return smURL; // assume user knows what they're doing + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + smURL = smURL + '/'; + } + } + return (smURL && smURL.lastIndexOf('/') !== - 1?smURL.substr(0, smURL.lastIndexOf('/') + 1):'./') + _s.movieURL; + }; + + _setVersionInfo = function() { + if (_fV !== 8 && _fV !== 9) { + _s._wD(_str('badFV', _fV, _defaultFlashVersion)); + _s.flashVersion = _defaultFlashVersion; + } + var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); // debug flash movie, if applicable + if (_s.flashVersion < 9 && _s.useHTML5Audio && _s.audioFormats.mp4.required) { + _s._wD(_str('needfl9')); + _s.flashVersion = 9; + } + _fV = _s.flashVersion; // short-hand for internal use + _s.version = _s.versionNumber + (_html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + // set up default options + if (_fV > 8) { + _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); + _s.features.buffering = true; + } + if (_fV > 8 && _s.useMovieStar) { + // flash 9+ support for movieStar formats as well as MP3 + _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); + _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _s.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + _s.mimePattern = _s.netStreamMimeTypes; + _s.features.movieStar = true; + } else { + _s.features.movieStar = false; + } + _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; + _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf',isDebug); + _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); + }; + + _setPolling = function(bPolling, bHighPerformance) { + if (!_s.o || !_s.allowPolling) { + return false; + } + _s.o._setPolling(bPolling, bHighPerformance); + }; + + (function() { + var old = (_win.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + function getArgs(oArgs) { + var args = _slice.call(oArgs), len = args.length; + if (old) { + args[1] = 'on' + args[1]; // prefix + if (len > 3) { + args.pop(); // no capture + } + } else if (len === 3) { + args.push(false); + } + return args; + } + + function apply(args, sType) { + var oFunc = args.shift()[evt[sType]]; + if (old) { + oFunc(args[0], args[1]); + } else { + oFunc.apply(this, args); + } + } + + _addEvt = function() { + apply(getArgs(arguments), 'add'); + }; + + _removeEvt = function() { + apply(getArgs(arguments), 'remove'); + }; + }()); + + function _initDebug() { + if (_s.debugURLParam.test(_wl)) { + _s.debugMode = true; // allow force of debug mode via URL + } + // <d> + if (_id(_s.debugID)) { + return false; + } + var oD, oDebug, oTarget, oToggle, tmp; + if (_s.debugMode && !_id(_s.debugID) && ((!_hasConsole || !_s.useConsole) || (_s.useConsole && _hasConsole && !_s.consoleOnly))) { + oD = _doc.createElement('div'); + oD.id = _s.debugID + '-toggle'; + oToggle = { + 'position': 'fixed', + 'bottom': '0px', + 'right': '0px', + 'width': '1.2em', + 'height': '1.2em', + 'lineHeight': '1.2em', + 'margin': '2px', + 'textAlign': 'center', + 'border': '1px solid #999', + 'cursor': 'pointer', + 'background': '#fff', + 'color': '#333', + 'zIndex': 10001 + }; + oD.appendChild(_doc.createTextNode('-')); + oD.onclick = _toggleDebug; + oD.title = 'Toggle SM2 debug console'; + if (_ua.match(/msie 6/i)) { + oD.style.position = 'absolute'; + oD.style.cursor = 'hand'; + } + for (tmp in oToggle) { + if (oToggle.hasOwnProperty(tmp)) { + oD.style[tmp] = oToggle[tmp]; + } + } + oDebug = _doc.createElement('div'); + oDebug.id = _s.debugID; + oDebug.style.display = (_s.debugMode?'block':'none'); + if (_s.debugMode && !_id(oD.id)) { + try { + oTarget = _getDocument(); + oTarget.appendChild(oD); + } catch(e2) { + throw new Error(_str('appXHTML')); + } + oTarget.appendChild(oDebug); + } + } + oTarget = null; + // </d> + } + + _mobileFlash = (function(){ + + var oM = null; + + function resetPosition() { + if (oM) { + oM.left = oM.top = '-9999px'; + } + } + + function reposition() { + oM.left = _win.scrollX+'px'; + oM.top = _win.scrollY+'px'; + } + + function setReposition(bOn) { + _s._wD('mobileFlash::flash on-screen hack: '+(bOn?'ON':'OFF')); + var f = _win[(bOn?'add':'remove')+'EventListener']; + f('resize', reposition, false); + f('scroll', reposition, false); + } + + function check(inDoc) { + // mobile flash (Android for starters) check + oM = _s.oMC.style; + if (_ua.match(/android/i)) { + if (inDoc) { + if (_s.flashLoadTimeout) { + _s._wDS('mfTimeout'); + _s.flashLoadTimeout = 0; + } + return false; + } + _s._wD('mfOn'); + oM.position = 'absolute'; + oM.left = oM.top = '0px'; + setReposition(true); + _s.onready(function(){ + setReposition(false); // detach + resetPosition(); // restore when OK/timed out + }); + reposition(); + } + return true; + } + + return { + 'check': check + }; + + }()); + + _createMovie = function(smID, smURL) { + + var specialCase = null, + remoteURL = (smURL?smURL:_s.url), + localURL = (_s.altURL?_s.altURL:remoteURL), + oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), s, x, sClass, side = '100%', isRTL = null, html = _doc.getElementsByTagName('html')[0]; + isRTL = (html && html.dir && html.dir.match(/rtl/i)); + smID = (typeof smID === 'undefined'?_s.id:smID); + + if (_didAppend && _appendSuccess) { + return false; // ignore if already succeeded + } + + function _initMsg() { + _s._wD('-- SoundManager 2 ' + _s.version + (!_html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (_s.useMovieStar?', MovieStar mode':'') + (_s.useHighPerformance?', high performance mode, ':', ') + ((_s.useFastPolling?'fast':'normal') + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') + ' --', 1); + } + + if (_html5Only) { + _setVersionInfo(); + _initMsg(); + _s.oMC = _id(_s.movieID); + _init(); + // prevent multiple init attempts + _didAppend = true; + _appendSuccess = true; + return false; + } + + _didAppend = true; + + // safety check for legacy (change to Flash 9 URL) + _setVersionInfo(); + _s.url = _normalizeMovieURL(this._overHTTP?remoteURL:localURL); + smURL = _s.url; + + _s.wmode = (!_s.wmode && _s.useHighPerformance && !_s.useMovieStar?'transparent':_s.wmode); + + if (_s.wmode !== null && !_isIE && !_s.useHighPerformance && navigator.platform.match(/win32/i)) { + _s.specialWmodeCase = true; + // extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here + // does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout + _wDS('spcWmode'); + _s.wmode = null; + } + + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'width': side, + 'height': side, + 'quality': 'high', + 'allowScriptAccess': _s.allowScriptAccess, + 'bgcolor': _s.bgColor, + 'pluginspage': 'http://www.macromedia.com/go/getflashplayer', + 'type': 'application/x-shockwave-flash', + 'wmode': _s.wmode + }; + + if (_s.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + + if (!_s.wmode) { + delete oEmbed.wmode; // don't write empty attribute + } + + if (_isIE) { + // IE is "special". + oMovie = _doc.createElement('div'); + movieHTML = '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" width="' + oEmbed.width + '" height="' + oEmbed.height + '"><param name="movie" value="' + smURL + '" /><param name="AllowScriptAccess" value="' + _s.allowScriptAccess + '" /><param name="quality" value="' + oEmbed.quality + '" />' + (_s.wmode?'<param name="wmode" value="' + _s.wmode + '" /> ':'') + '<param name="bgcolor" value="' + _s.bgColor + '" />' + (_s.debugFlash?'<param name="FlashVars" value="' + oEmbed.FlashVars + '" />':'') + '<!-- --></object>'; + } else { + oMovie = _doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + } + + _initDebug(); + extraClass = _getSWFCSS(); + oTarget = _getDocument(); + + if (oTarget) { + _s.oMC = _id(_s.movieID)?_id(_s.movieID):_doc.createElement('div'); + if (!_s.oMC.id) { + _s.oMC.id = _s.movieID; + _s.oMC.className = _s.swfCSS.swfDefault + ' ' + extraClass; + // "hide" flash movie + s = null; + oEl = null; + if (!_s.useFlashBlock) { + if (_s.useHighPerformance) { + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + if (_ua.match(/webkit/i)) { + _s.oMC.style.zIndex = 10000; // soundcloud-reported render/crash fix, safari 5 + } + if (!_s.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + _s.oMC.style[x] = s[x]; + } + } + } + try { + if (!_isIE) { + _s.oMC.appendChild(oMovie); + } + oTarget.appendChild(_s.oMC); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _s.swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + } catch(e) { + throw new Error(_str('appXHTML')); + } + _mobileFlash.check(); + } else { + // it's already in the document. + sClass = _s.oMC.className; + _s.oMC.className = (sClass?sClass+' ':_s.swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + _s.oMC.appendChild(oMovie); + if (_isIE) { + oEl = _s.oMC.appendChild(_doc.createElement('div')); + oEl.className = _s.swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + _appendSuccess = true; + _mobileFlash.check(true); + } + } + + if (specialCase) { + _s._wD(specialCase); + } + + _initMsg(); + _s._wD('soundManager::createMovie(): Trying to load ' + smURL + (!this._overHTTP && _s.altURL?' (alternate URL)':''), 1); + + return true; + }; + + _idCheck = this.getSoundById; + + _initMovie = function() { + if (_html5Only) { + _createMovie(); + return false; + } + // attempt to get, or create, movie + if (_s.o) { + return false; // may already exist + } + _s.o = _s.getMovie(_s.id); // inline markup + if (!_s.o) { + if (!_oRemoved) { + // try to create + _createMovie(_s.id, _s.url); + } else { + // try to re-append removed movie after reboot() + if (!_isIE) { + _s.oMC.appendChild(_oRemoved); + } else { + _s.oMC.innerHTML = _oRemovedHTML; + } + _oRemoved = null; + _didAppend = true; + } + _s.o = _s.getMovie(_s.id); + } + if (_s.o) { + _s._wD('soundManager::initMovie(): Got '+_s.o.nodeName+' element ('+(_didAppend?'created via JS':'static HTML')+')'); + _wDS('waitEI'); + } + if (_s.oninitmovie instanceof Function) { + setTimeout(_s.oninitmovie, 1); + } + return true; + }; + + _go = function(sURL) { + // where it all begins. + if (sURL) { + _s.url = sURL; + } + _initMovie(); + }; + + _delayWaitForEI = function() { + setTimeout(_waitForEI, 500); + }; + + _waitForEI = function() { + if (_waitingForEI) { + return false; + } + _waitingForEI = true; + _removeEvt(_win, 'load', _delayWaitForEI); + if (_tryInitOnFocus && !_isFocused) { + _wDS('waitFocus'); + return false; + } + var p; + if (!_didInit) { + p = _s.getMoviePercent(); + _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':'')))); + } + setTimeout(function() { + p = _s.getMoviePercent(); + if (!_didInit) { + _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2); + if (!this._overHTTP && p) { + _wDS('localFail', 2); + if (!_s.debugFlash) { + _wDS('tryDebug', 2); + } + } + if (p === 0) { + // if 0 (not null), probably a 404. + _s._wD(_str('swf404', _s.url)); + } + _debugTS('flashtojs', false, ': Timed out' + this._overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); + } + // give up / time-out, depending + if (!_didInit && _okToDisable) { + if (p === null) { + // SWF failed. Maybe blocked. + if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _wDS('waitForever'); + } else { + // old SM2 behaviour, simply fail + _failSafely(true); + } + } else { + // flash loaded? Shouldn't be a blocking issue, then. + if (_s.flashLoadTimeout === 0) { + _wDS('waitForever'); + } else { + _failSafely(true); + } + } + } + }, _s.flashLoadTimeout); + }; + + _go = function(sURL) { + // where it all begins. + if (sURL) { + _s.url = sURL; + } + _initMovie(); + }; + + // <d> + _wDS = function(o, errorLevel) { + if (!o) { + return ''; + } else { + return _s._wD(_str(o), errorLevel); + } + }; + + if (_wl.indexOf('debug=alert') + 1 && _s.debugMode) { + _s._wD = function(sText) {alert(sText);}; + } + + _toggleDebug = function() { + var o = _id(_s.debugID), + oT = _id(_s.debugID + '-toggle'); + if (!o) { + return false; + } + if (_debugOpen) { + // minimize + oT.innerHTML = '+'; + o.style.display = 'none'; + } else { + oT.innerHTML = '-'; + o.style.display = 'block'; + } + _debugOpen = !_debugOpen; + }; + + _debugTS = function(sEventType, bSuccess, sMessage) { + // troubleshooter debug hooks + if (typeof sm2Debugger !== 'undefined') { + try { + sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); + } catch(e) { + // oh well + } + } + return true; + }; + // </d> + + _getSWFCSS = function() { + var css = []; + if (_s.debugMode) { + css.push(_s.swfCSS.sm2Debug); + } + if (_s.debugFlash) { + css.push(_s.swfCSS.flashDebug); + } + if (_s.useHighPerformance) { + css.push(_s.swfCSS.highPerf); + } + return css.join(' '); + }; + + _flashBlockHandler = function() { + // *possible* flash block situation. + var name = _str('fbHandler'), p = _s.getMoviePercent(); + if (!_s.supported()) { + if (_needsFlash) { + // make the movie more visible, so user can fix + _s.oMC.className = _getSWFCSS() + ' ' + _s.swfCSS.swfDefault + ' ' + (p === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError); + _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':'')); + } + _s.didFlashBlock = true; + _processOnReady(true); // fire onready(), complain lightly + if (_s.onerror instanceof Function) { + _s.onerror.apply(_win); + } + } else { + // SM2 loaded OK (or recovered) + if (_s.didFlashBlock) { + _s._wD(name+': Unblocked'); + } + if (_s.oMC) { + _s.oMC.className = _getSWFCSS() + ' ' + _s.swfCSS.swfDefault + (' '+_s.swfCSS.swfUnblocked); + } + } + }; + + _handleFocus = function() { + function cleanup() { + _removeEvt(_win, 'focus', _handleFocus); + _removeEvt(_win, 'load', _handleFocus); + } + if (_isFocused || !_tryInitOnFocus) { + cleanup(); + return true; + } + _okToDisable = true; + _isFocused = true; + _s._wD('soundManager::handleFocus()'); + if (_isSafari && _tryInitOnFocus) { + // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event + _removeEvt(_win, 'mousemove', _handleFocus); + } + // allow init to restart + _waitingForEI = false; + cleanup(); + return true; + }; + + _initComplete = function(bNoDisable) { + if (_didInit) { + return false; + } + if (_html5Only) { + // all good. + _s._wD('-- SoundManager 2: loaded --'); + _didInit = true; + _processOnReady(); + _initUserOnload(); + return true; + } + var sClass = _s.oMC.className, + wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()); + if (!wasTimeout) { + _didInit = true; + } + _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1); + if (_disabled || bNoDisable) { + if (_s.useFlashBlock) { + _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError); + } + _processOnReady(); + _debugTS('onload', false); + if (_s.onerror instanceof Function) { + _s.onerror.apply(_win); + } + return false; + } else { + _debugTS('onload', true); + } + if (_s.waitForWindowLoad && !_windowLoaded) { + _wDS('waitOnload'); + _addEvt(_win, 'load', _initUserOnload); + return false; + } else { + if (_s.waitForWindowLoad && _windowLoaded) { + _wDS('docLoaded'); + } + _initUserOnload(); + } + return true; + }; + + _addOnReady = function(oMethod, oScope) { + _onready.push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + }; + + _processOnReady = function(ignoreInit) { + if (!_didInit && !ignoreInit) { + // not ready yet. + return false; + } + var status = { + success: (ignoreInit?_s.supported():!_disabled) + }, + queue = [], i, j, + canRetry = (!_s.useFlashBlock || (_s.useFlashBlock && !_s.supported())); + for (i = 0, j = _onready.length; i < j; i++) { + if (_onready[i].fired !== true) { + queue.push(_onready[i]); + } + } + if (queue.length) { + _s._wD(_sm + ': Firing ' + queue.length + ' onready() item' + (queue.length > 1?'s':'')); + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, [status]); + } else { + queue[i].method(status); + } + if (!canRetry) { // flashblock case doesn't count here + queue[i].fired = true; + } + } + } + return true; + }; + + _initUserOnload = function() { + _win.setTimeout(function() { + if (_s.useFlashBlock) { + _flashBlockHandler(); + } + _processOnReady(); + _wDS('onload', 1); + // call user-defined "onload", scoped to window + if (_s.onload instanceof Function) { + _s.onload.apply(_win); + } + _wDS('onloadOK', 1); + if (_s.waitForWindowLoad) { + _addEvt(_win, 'load', _initUserOnload); + } + },1); + }; + + _featureCheck = function() { + var needsFlash, item, + isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && _ua.match(/OS X 10_6_(3|4)/i)), // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Known Apple "radar" bug. https://bugs.webkit.org/show_bug.cgi?id=32159 + isSpecial = (_ua.match(/iphone os (1|2|3_0|3_1)/i)?true:false); // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works. + if (isSpecial) { + _s.hasHTML5 = false; // has Audio(), but is broken; let it load links directly. + _html5Only = true; // ignore flash case, however + if (_s.oMC) { + _s.oMC.style.display = 'none'; + } + return false; + } + if (_s.useHTML5Audio) { + if (!_s.html5 || !_s.html5.canPlayType) { + _s._wD('SoundManager: No HTML5 Audio() support detected.'); + _s.hasHTML5 = false; + return true; + } else { + _s.hasHTML5 = true; + } + if (isBadSafari) { + _s._wD('SoundManager::Note: Buggy HTML5 Audio in Safari on OS X 10.6.[3|4], see https://bugs.webkit.org/show_bug.cgi?id=32159 - disabling HTML5 audio',1); + _s.useHTML5Audio = false; + _s.hasHTML5 = false; + return true; + } + } else { + // flash required. + return true; + } + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item) && _s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) { + // may need flash for this format? + needsFlash = true; + } + } + // sanity check.. + if (_s.ignoreFlash) { + needsFlash = false; + } + _html5Only = (_s.useHTML5Audio && _s.hasHTML5 && !needsFlash); + return needsFlash; + }; + + _init = function() { + var item, tests = []; + _wDS('init'); + + // called after onload() + if (_didInit) { + _wDS('didInit'); + return false; + } + + function _cleanup() { + _removeEvt(_win, 'load', _s.beginDelayedInit); + } + + if (_s.hasHTML5) { + for (item in _s.audioFormats) { + if (_s.audioFormats.hasOwnProperty(item)) { + tests.push(item+': '+_s.html5[item]); + } + } + _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1); + } + + if (_html5Only) { + if (!_didInit) { + // we don't need no steenking flash! + _cleanup(); + _s.enabled = true; + _initComplete(); + } + return true; + } + + // flash path + _initMovie(); + try { + _wDS('flashJS'); + _s.o._externalInterfaceTest(false); // attempt to talk to Flash + if (!_s.allowPolling) { + _wDS('noPolling', 1); + } else { + _setPolling(true, _s.useFastPolling?true:false); + } + if (!_s.debugMode) { + _s.o._disableDebug(); + } + _s.enabled = true; + _debugTS('jstoflash', true); + } catch(e) { + _s._wD('js/flash exception: ' + e.toString()); + _debugTS('jstoflash', false); + _failSafely(true); // don't disable, for reboot() + _initComplete(); + return false; + } + _initComplete(); + // event cleanup + _cleanup(); + return true; + }; + + _beginInit = function() { + if (_initPending) { + return false; + } + _createMovie(); + _initMovie(); + _initPending = true; + return true; + }; + + _dcLoaded = function() { + if (_didDCLoaded) { + return false; + } + _didDCLoaded = true; + _initDebug(); + _testHTML5(); + _s.html5.usingFlash = _featureCheck(); + _needsFlash = _s.html5.usingFlash; + _didDCLoaded = true; + if (_doc.removeEventListener) { + _doc.removeEventListener('DOMContentLoaded', _dcLoaded, false); + } + _go(); + return true; + }; + + _startTimer = function(oSound) { + if (!oSound._hasTimer) { + oSound._hasTimer = true; + } + }; + + _stopTimer = function(oSound) { + if (oSound._hasTimer) { + oSound._hasTimer = false; + } + }; + + _die = function() { + if (_s.onerror instanceof Function) { + _s.onerror(); + } + _s.disable(); + }; + + // pseudo-private methods called by Flash + + this._setSandboxType = function(sandboxType) { + // <d> + var sb = _s.sandbox; + sb.type = sandboxType; + sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')]; + _s._wD('Flash security sandbox type: ' + sb.type); + if (sb.type === 'localWithFile') { + sb.noRemote = true; + sb.noLocal = false; + _wDS('secNote', 2); + } else if (sb.type === 'localWithNetwork') { + sb.noRemote = false; + sb.noLocal = true; + } else if (sb.type === 'localTrusted') { + sb.noRemote = false; + sb.noLocal = false; + } + // </d> + }; + + this._externalInterfaceOK = function(flashDate) { + // flash callback confirming flash loaded, EI working etc. + // flashDate = approx. timing/delay info for JS/flash bridge + if (_s.swfLoaded) { + return false; + } + var eiTime = new Date().getTime(); + _s._wD('soundManager::externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':'')); + _debugTS('swf', true); + _debugTS('flashtojs', true); + _s.swfLoaded = true; + _tryInitOnFocus = false; + if (_isIE) { + // IE needs a timeout OR delay until window.onload - may need TODO: investigating + setTimeout(_init, 100); + } else { + _init(); + } + }; + + _dcIE = function() { + if (_doc.readyState === 'complete') { + _dcLoaded(); + _doc.detachEvent('onreadystatechange', _dcIE); + } + return true; + }; + + // focus and window load, init + if (!_s.hasHTML5 || _needsFlash) { + // only applies to Flash mode + _addEvt(_win, 'focus', _handleFocus); + _addEvt(_win, 'load', _handleFocus); + _addEvt(_win, 'load', _delayWaitForEI); + if (_isSafari && _tryInitOnFocus) { + _addEvt(_win, 'mousemove', _handleFocus); // massive Safari focus hack + } + } + + if (_doc.addEventListener) { + _doc.addEventListener('DOMContentLoaded', _dcLoaded, false); + } else if (_doc.attachEvent) { + _doc.attachEvent('onreadystatechange', _dcIE); + } else { + // no add/attachevent support - safe to assume no JS -> Flash either + _debugTS('onload', false); + _die(); + } + + if (_doc.readyState === 'complete') { + setTimeout(_dcLoaded,100); + } + +} // SoundManager() + +// var SM2_DEFER = true; +// details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading + +if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { + soundManager = new SoundManager(); +} + +// public interfaces +window.SoundManager = SoundManager; // constructor +window.soundManager = soundManager; // public instance: API, Flash callbacks etc. + +}(window)); diff --git a/frontend/static/js/swfobject.js b/frontend/static/js/swfobject.js new file mode 100644 index 0000000..8eafe9d --- /dev/null +++ b/frontend/static/js/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
\ No newline at end of file diff --git a/frontend/static/js/test-admin.js b/frontend/static/js/test-admin.js new file mode 100644 index 0000000..5c34099 --- /dev/null +++ b/frontend/static/js/test-admin.js @@ -0,0 +1,93 @@ +function Enterable (id, callback) + { + function thisKeydown (e) + { + if (e.keyCode === 13) + { + var s = $(id).val() + if (s) + callback(s) + } + } + $("#lookup-room").keydown(thisKeydown) + } +var Background = + { + off: function () + { + $("#bg").hide() + } + } +var Main = {load: function(){}} +var AdminTest = + { + init: function () + { + d.warn("INIT TEST") + $(window).bind("resize", AdminTest.resize) + AdminTest.resize() + Auth.error = AdminTest.error + Auth.success = AdminTest.success + if ( ! Auth.init() ) + AdminTest.error() + else + Auth.checkin() + }, + resize: function () + { + var h = $(window).height() + var statsheight = h-285-20-20-30 + $("#stats").css({height: statsheight}) + }, + error: function () + { + $("body").hide() + }, + success: function () + { + $("#session").html(Auth.session) + $("#bg-off").click(Background.off) + $(".remove").live("click", Admin.removeVideoClick) + AdminTest.lookupRoom(roomName) + AdminTest.lookupRoomEnterable = new Enterable ("#lookup-room", AdminTest.lookupRoom) + AdminTest.statsLoad() + }, + lookupRoom: function (s) + { + d.warn("LOOKUP ROOM "+s) + Room.name = s + Admin.viewRoom() + setTimeout(AdminTest.refresh, 500) + }, + refresh: function () + { + d.warn("ROOM REFRESH") + Room.settingsOpen() + $("#room-name").html(Room.name) + $("#return-link").attr("href", "/"+Room.name) + $("#room-lastlog").val(Lastlog.old) + $("#pnp").attr("src", "http://scannerjammer.com/"+Room.name+"/read") + }, + statsLoad: function () + { + $.get(API.URL.room.stats).success(AdminTest.statsDump) + }, + statsDump: function (html) + { + var greetings = "" + greetings += ">>> <a href='/register/reset'>Need to fix someone's password?</a>" + greetings += "<br/><br/>" + greetings += "<b>Congratulations, %%USERNAME%%!</b> You, on the basis of your score, have been selected to be a SCANNERJAMMER MODERATOR!<br/><br/>" + greetings += "This means we are asking you to be a part of our team. As a moderator, your responsibility is to clear all of the crap videos from the playlist. If something seems like it doesn't belong, do not hesitate to remove it. We care about the content of our site. Soon we will also be adding a mute feature.<br/><br/>Another power you have been granted is to make your OWN SCANNERJAMMER ROOM. Only mods can do this! All you need to do is add the name of your new room to the end of the URL. For example, type <i><b>scannerjammer.com/whatupdoe</b></i> into the address bar and lo and behold, the SCANNERJAMMER \"whatupdoe\" room has been created!<br/><br/>This is a great way to have a more private SCANNERJAMMER experience, should you want to talk to friends. Feel free to create as many rooms as you want.<br><br/> Thank you, we love you! -Pepper and ryz" + greetings = greetings.replace("%%USERNAME%%", Auth.username) + if (html) + greetings += "<br/><br/><b>STATS TODAY</b><br/>"+html + $("#stats").html(greetings).fadeIn(1000) + } + } +var Main = + { + } +AdminTest.init() +$("#msg").hide() + diff --git a/frontend/static/js/tokbox.js b/frontend/static/js/tokbox.js new file mode 100644 index 0000000..69155ce --- /dev/null +++ b/frontend/static/js/tokbox.js @@ -0,0 +1,181 @@ + +function Toggler (div, on, off) + { + var state = false + function activate () + { + $(div).addClass("on").html("ON") + on () + } + function deactivate () + { + $(div).removeClass("on").html("off") + off () + } + function toggle () + { + state = ! state + if (state) + activate () + else + deactivate () + } + function destroy () + { + $(div).unbind("click") + } + $(div).bind("click", toggle) + } + +var Tokbox = + { + height: 150, + width: null, + token_url: "/cgi-bin/tokbox_room.cgi", + sessionid: null, + token: null, + togglers: [], + + session: null, + publisher: null, + subscribers: [], + + subscribeToStreams: function (streams) + { + for (var i = 0; i < streams.length; i++) + { + var stream = streams[i] + if (stream.connection.connectionId != Tokbox.session.connection.connectionId) + { + var parentDiv = document.getElementById("tokbox-subscribers") + var stubDiv = document.createElement("div") + stubDiv.id = "opentok_subscriber_"+stream.connection.connectionId + parentDiv.appendChild(stubDiv) + + var subscriberProps = {width: Tokbox.width, height: Tokbox.height, audioEnabled: true} + var subscriber = Tokbox.session.subscribe(stream, stubDiv.id, subscriberProps) + Tokbox.subscribers.push(subscriber) + } + } + }, + sessionConnectedHandler: function (event) + { + Tokbox.height = $("#tokbox-embed").height() + Tokbox.width = Math.floor( Tokbox.height / 1.618 ) + $("#tokbox-loading").hide() + + Tokbox.subscribeToStreams(event.streams) + + var parentDiv = document.getElementById("tokbox-publisher") + var stubDiv = document.createElement("div") + stubDiv.id = "opentok_publisher" + parentDiv.appendChild(stubDiv) + + var publisherProps = {width: Tokbox.width, height: Tokbox.height, microphoneEnabled: false} + Tokbox.publisher = Tokbox.session.publish(stubDiv.id, publisherProps) + $("#tokbox-loading").hide() + $("#tokbox-settings").fadeIn(1000) + }, + streamCreatedHandler: function (event) + { + Tokbox.subscribeToStreams(event.streams) + }, + tokenCallback: function (raw) + { + var lines = API.parse("/tokbox", raw) + if (! lines) + return d.error("API ERROR") + for (i in lines) + { + pair = lines[i].split("\t") + if (pair[0] === "ERROR") + return d.error(pair[1]) + else if (pair[0] === "SESSION") + Tokbox.sessionid = d.trim(pair[1]) + else if (pair[0] === "TOKEN") + Tokbox.token = d.trim(pair[1]) + } + if (Tokbox.sessionid && Tokbox.token) + Tokbox.activate() + }, + activate: function () + { + Tokbox.session = TB.initSession(Tokbox.sessionid) + Tokbox.session.addEventListener("sessionConnected", Tokbox.sessionConnectedHandler) + Tokbox.session.addEventListener("streamCreated", Tokbox.streamCreatedHandler) + Tokbox.session.connect(626221, Tokbox.token) + }, + microphoneOn: function () + { + Tokbox.publisher.publishAudio(true) + d.warn(">>>> MICROPHONE ON") + }, + microphoneOff: function () + { + Tokbox.publisher.publishAudio(false) + d.warn(">>>> MICROPHONE OFF") + }, + mute: function () + { + for (var i = 0; i < Tokbox.subscribers.length; i++) + { + try + { + Tokbox.subscribers[i].subscribeToAudio(false) + d.warn("MUTED "+i) + } + catch (err) + { + d.warn("UNMUTE ERROR "+i+" "+ err.description) + } + } + d.warn(">>>> MUTE ALL") + }, + unmute: function () + { + for (var i = 0; i < Tokbox.subscribers.length; i++) + { + try + { + Tokbox.subscribers[i].subscribeToAudio(true) + d.warn("UNMUTED "+i) + } + catch (err) + { + d.warn("UNMUTE ERROR "+i+" "+ err.description) + } + } + d.warn(">>>> UNMUTE ALL") + }, + load: function () + { + $("#tokbox-embed").show() + $("#tokbox-settings").hide() + $("#tokbox-loading").show() + $(window).trigger("resize") + $.get(Tokbox.token_url, {room:Room.name}).success(Tokbox.tokenCallback) + Tokbox.togglers.push( new Toggler ("#tokbox-microphone", Tokbox.microphoneOn, Tokbox.microphoneOff) ) + Tokbox.togglers.push( new Toggler ("#tokbox-mute-all", Tokbox.mute, Tokbox.unmute) ) + }, + unload: function () + { + $("#tokbox-embed").hide() + $(window).trigger("resize") + if (Tokbox.session) + { + if (Tokbox.publisher) + Tokbox.session.unpublish(Tokbox.publisher) + Tokbox.session.disconnect() + } + Tokbox.publisher = null + Tokbox.session = null + $("#tokbox-publisher").html("") + $("#tokbox-subscriber").html("") + for (t in Tokbox.togglers) + Tokbox.togglers[i].destroy () + Tokbox.togglers = [] + }, + init: function () + { + } + } diff --git a/frontend/static/js/top.js b/frontend/static/js/top.js new file mode 100644 index 0000000..9263bf8 --- /dev/null +++ b/frontend/static/js/top.js @@ -0,0 +1,251 @@ +var Keyboard = + { + altMode: false, + fullscreenKeys: function (event) + { + kc = event.keyCode + if (kc === 27) + Viewport.fullscreenOff() + if (kc === 37 || kc === 177) + Player.playPrev() + if (kc === 39 || kc === 176) + Player.playNext() + if (kc === 32 || kc === 179) + Player.toggle() + if (kc === 76) + Player.likeClick() + return false + }, + standardKeys: function (event) + { + kc = event.keyCode + if (kc === 91) + { + Keyboard.altMode = true + return true + } + if (kc === 27) + { + Viewport.fullscreenOn() + return false + } + if (kc === 37 || kc === 177) + { + Player.playPrev() + return false + } + else if (kc === 39 || kc === 176) + { + Player.playNext() + return false + } + if (! Keyboard.altMode && kc === 76) + { + Player.likeClick() + return false + } + if (kc === 32 || kc === 179) + { + Player.toggle() + return false + } + Keyboard.altMode = false + return true + } + } +var Viewport = + { + fullscreenMode: false, + fullscreenOn: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls").hide() + $("#settings-container").hide() + $(window).unbind("resize") + $(window).bind("resize", Viewport.fullscreenResize) + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.fullscreenKeys) + Viewport.fullscreenResize() + Viewport.fullscreenMode = true + }, + fullscreenResize: function () + { + $("#projector").css({ position: 'fixed', top: 0, left: 0, width: $(window).width(), height: $(window).height() }) + $("#screen,#ytscreen").css({ width: $(window).width(), height: $(window).height() }) + }, + fullscreenOff: function () + { + $("#logo,#logobg,#sitez,#playlist,#playlistbg,#contact,#bg,#gif-container,#controls").show() + $(window).unbind("resize") + $(window).bind("resize", Viewport.standardResize) + Viewport.standardResize() + Viewport.fullscreenMode = false + $(window).unbind("keydown") + $(window).bind("keydown", Keyboard.standardKeys) + $("#fullscreen").unbind("click") + $("#fullscreen").bind("click", Viewport.fullscreenOn) + }, + standardResize: function () + { + var w = $(window).width() + var h = $(window).height() + var contact = w * 200 / 1425 + var ytw = (w-contact-40)*4/7 + var yth = ytw * 9/16 + var plw = (w-contact-40)*3/7 + + $("#contact img").css("max-width", contact) + var conheight = $("#controls").height() + var contactheight = $("#contact").height() + var qheight = Math.max(yth+conheight+40, h - 94 - 60 - 100) + + $("#playlist").css("top", 94).css("left", contact/2) + $("#playlist,#playlistbg").css("width", plw-20+40) + $("#playlist,#playlistbg").css("height", qheight) + $("#queue").css("height", qheight) + var queuetop = $("#queue").offset().top + $("#playlistbg").css("top", queuetop).css("left", contact/2) + + $("#projector").css({ position: 'absolute', }) + $("#player").css("height", yth+conheight+20) + // $("#player").css("top", queuetop+(qheight-yth-conheight-20)/2).css("left", plw+(contact/2)+40) + $("#player").css("top", queuetop).css("left", plw+(contact/2)+40) + $("#projector").css("left", 10) + $("#player,#projector,#screen,#ytscreen").width(ytw-40) + $("#projector,#screen,#ytscreen").height(yth) + + $("#controls").css({ position: 'absolute', top: yth+20, bottom: 'auto', right: 'auto', }) + + $("#gif-container").css("top", qheight+30+134) + } + } + +var Profile = + { + mode: false, + loadQueue: function (queue) + { + if (! queue || ! queue.length) + return + Player.clearQueue() + $("#queue").html("") + Playlist.enqueueOldVideoFormat(queue) + }, + loadTodayQueue: function () + { + if (Profile.mode === "today") + return + Profile.mode = "today" + $(".mode").removeClass("mode") + $("#todayQueue").addClass("mode") + Profile.loadQueue(todayVideoQueue) + }, + loadYesterdayQueue: function () + { + if (Profile.mode === "yesterday") + return + Profile.mode = "yesterday" + $(".mode").removeClass("mode") + $("#yesterdayQueue").addClass("mode") + Profile.loadQueue(yesterdayVideoQueue) + }, + loadTopQueue: function () + { + if (Profile.mode === "top") + return + Profile.mode = "top" + $(".mode").removeClass("mode") + $("#topQueue").addClass("mode") + Profile.loadQueue(topVideoQueue) + }, + init: function () + { + if (todayVideoQueue && todayVideoQueue.length && todayVideoQueueTitle) + { + $("#queueLinks").append('<li id="todayQueue">'+todayVideoQueueTitle+'</li>') + $("#todayQueue").bind("click", Profile.loadTodayQueue) + todayVideoQueue.reverse() + } + if (yesterdayVideoQueue && yesterdayVideoQueue.length && yesterdayVideoQueueTitle) + { + $("#queueLinks").append('<li id="yesterdayQueue">'+yesterdayVideoQueueTitle+'</li>') + $("#yesterdayQueue").bind("click", Profile.loadYesterdayQueue) + } + if (topVideoQueue && topVideoQueue.length && topVideoQueueTitle) + { + $("#queueLinks").append('<li id="topQueue">'+topVideoQueueTitle+'</li>') + $("#topQueue").bind("click", Profile.loadTopQueue) + topVideoQueue.reverse() + } + if (todayVideoQueue && todayVideoQueue.length) + Profile.loadTodayQueue() + else if (yesterdayVideoQueue && yesterdayVideoQueue.length) + Profile.loadYesterdayQueue() + } + } + +var Room = + { + } +var Poll = + { + room: "main", + delay: 5000, + init: function () + { + if (document.cookie) + { + var cookies = document.cookie.split(";") + for (i in cookies) + { + var cookie = cookies[i].split("=") + if (cookie[0].indexOf("room") !== -1) + { + if (cookie[1] !== 'false' && cookie[1] !== 'undefined') + { + Poll.room = cookie[1] + break + } + } + } + } + Poll.poll() + Viewport.standardResize() + }, + poll: function () + { + $.post(API.URL.room.poll, + { + room: Poll.room, + session: Auth.session, + last: 1, + }).success(Poll.pollCallback).error(Poll.pollErrorCallback) + }, + pollErrorCallback: function () + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + }, + pollCallback: function (raw) + { + Poll.timer = setTimeout(Poll.poll, Poll.delay) + } + } + +var Main = + { + init: function () + { + $(window).bind("resize", Viewport.standardResize) + $(window).bind("keydown", Keyboard.standardKeys) + Playlist.showScores = true + Auth.success = Poll.init + if (Auth.init()) + Auth.checkin() + Profile.init() + Player.init() + $("#controls").fadeIn(2000) + $("#contact").fadeIn(2000) + setTimeout('Viewport.standardResize()', 1000) + } + } +Main.init() + diff --git a/frontend/static/js/vimeo.js b/frontend/static/js/vimeo.js new file mode 100644 index 0000000..e20fdbd --- /dev/null +++ b/frontend/static/js/vimeo.js @@ -0,0 +1,100 @@ +var Vimeo = + { + type: "vimeo", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + volume: 1,//from 100...some sort of error + play: function (video) + { + d.warn("VIMEO PLAY "+video.key) + if (video.error) + return Vimeo.error() + if (Vimeo.playing) + Vimeo.stop() + $("#screen").html("<div id='vimeo'></div>") + Vimeo.video = video + Vimeo.playing = true + var params = { allowScriptAccess: "always", wmode: "opaque", } + var atts = { id: "vimeo" } + var flashvars = { api: 1 } + swfobject.embedSWF("http://vimeo.com/moogaloop.swf?clip_id="+video.name+"&server=vimeo.com&color=00adef&api=1", + "vimeo", "100%","100%", "8", null, flashvars, params, atts) + // $("#vimeo").html('<iframe src="http://player.vimeo.com/video/'+video.name+'?api=1" width="100%" height="100%" frameborder="0"></iframe>') + }, + toggle: function () + { + if (Vimeo.player.api_paused()) + return Vimeo.resume() + else + return Vimeo.pause() + }, + error: function (s) + { + Player.error("VIMEO "+s) + Vimeo.finish() + }, + setVolume: function (vol) + { + Vimeo.volume = vol + Vimeo.player.api_setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Vimeo.playing = false + Vimeo.player.api_pause() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Vimeo.playing = true + Vimeo.player.api_play() + return false + }, + stop: function () + { + d.warn("VIMEO STOP") + Vimeo.playing = false + }, + finish: function () + { + d.warn("VIMEO FINISH") + Vimeo.playing = false + swfobject.removeSWF("vimeo") + Player.finish() + }, + load: function () + { + d.warn("LOADING VIMEO") + Vimeo.loaded = true + }, + unload: function () + { + d.warn("VIMEO UNLOADED") + swfobject.removeSWF("vimeo") + Vimeo.loaded = false + }, + init: function () + { + d.warn("VIMEO INIT") + } + } +function vimeo_player_loaded() + { + d.warn("VIMEO LOADED") + Vimeo.player = document.getElementById('vimeo') + Vimeo.player.api_play() + // Vimeo.player.addEventListener("finish", "Vimeo.finish") + Vimeo.player.api_addEventListener("finish", "Vimeo.finish") + Vimeo.player.api_setVolume(Vimeo.volume) + } +Player.register(Vimeo) + diff --git a/frontend/static/js/youtube.js b/frontend/static/js/youtube.js new file mode 100644 index 0000000..936a44a --- /dev/null +++ b/frontend/static/js/youtube.js @@ -0,0 +1,177 @@ +var Youtube = + { + type: "youtube", + loaded: false, + pending: false, + playing: false, + player: null, + playerId: null, + timeout: null, + video: null, + width: "100%", + height: "100%", + getYtid: function (url) + { + if (! url) return + var ytid = url.substr(url.indexOf("v=")+2,11) + if (ytid.indexOf("&") !== -1) + ytid = ytid.substr(0, ytid.indexOf("&")) + if (ytid.indexOf("#") !== -1) + ytid = ytid.substr(0, ytid.indexOf("#")) + return ytid + }, + play: function (video) + { + d.warn("YOUTUBE PLAY "+video.key) + if (video.error) + return Youtube.error() + if (Youtube.playing) + Youtube.stop() + Youtube.video = video + Youtube.playing = true + if (Youtube.ready) + { + d.warn("ORDERING VIDEO LOAD "+video.name) + Youtube.player.loadVideoById(video.name) + Youtube.pending = false + } + else + { + d.error("YOUTUBE PLAYER NOT READY") + Youtube.pending = true + } + }, + toggle: function () + { + if (Youtube.playing) + return Youtube.pause() + else + return Youtube.resume() + }, + error: function (s) + { + Player.error("YOUTUBE "+s) + $("li#queue_"+Youtube.video.idx+" span.title").html("<i>This video cannot be embedded</i>") + setTimeout(Youtube.finish, 1000) + }, + onStateChange: function (state) + { + Youtube.state = state + if (state === -1) + { + d.warn("YOUTUBE: UNSTARTED") + Youtube.playing = false + } + else if (state === 0) + { + d.warn("YOUTUBE: ENDED") + Youtube.playing = false + return Youtube.finish() + } + else if (state === 1) + { + d.warn("YOUTUBE: PLAYING") + Youtube.playing = true + if (! Youtube.loaded) + return Youtube.unload() + } + else if (state === 2) + { + d.warn("YOUTUBE: PAUSED") + Youtube.playing = false + } + else if (state === 3) + { + d.warn("YOUTUBE: BUFFERING") + } + else if (state === 5) + { + d.warn("YOUTUBE: CUED") + } + else + { + d.error("YOUTUBE: UNKNOWN") + } + }, + onError: function (error) + { + var errorStr = 'UNKNOWN' + if (error === 2) + errorStr = "INVALID PARAMETER" + if (error === 100) + errorStr = "NOT FOUND" + if (error === 101 || error === 150) + errorStr = "EMBED FORBIDDEN" + Youtube.error(errorStr) + }, + setVolume: function (vol) + { + Youtube.player.setVolume(vol) + }, + pause: function () + { + d.warn("PAUSED PLAYBACK") + Youtube.playing = false + Youtube.player.pauseVideo() + return true + }, + resume: function () + { + d.warn("RESUME PLAYBACK") + Youtube.playing = true + Youtube.player.playVideo() + return false + }, + stop: function () + { + d.warn("YOUTUBE STOP") + Youtube.player.stopVideo() + Youtube.playing = false + }, + finish: function () + { + d.warn("YOUTUBE FINISH") + Youtube.playing = false + Player.finish() + }, + load: function () + { + d.warn("LOADING YOUTUBE") + $("#ytscreen").css("z-index", 19) + Youtube.loaded = true + }, + unload: function () + { + d.warn("YOUTUBE UNLOADED") + $("#ytscreen").css("z-index", -3) + if (Youtube.player) + Youtube.player.stopVideo() + Youtube.playing = false + Youtube.loaded = false + Youtube.pending = false + }, + init: function () + { + d.warn("YOUTUBE INIT") + var params = { allowScriptAccess: "always", wmode: "opaque" } + var atts = { id: "ytscreen" } + swfobject.embedSWF("http://www.youtube.com/apiplayer?enablejsapi=1&version=3&playerapiid=ytscreen", + "ytscreen", Player.width, Player.height, "8", null, null, params, atts) + } + } +function onYouTubePlayerReady (playerId) + { + d.warn("YOUTUBE READY") + Youtube.player = document.getElementById(playerId) + Youtube.playerId = playerId + Youtube.player.addEventListener("onStateChange", "Youtube.onStateChange") + Youtube.player.addEventListener("onError", "Youtube.onError") + Youtube.ready = true + if (! Youtube.loaded) + return Youtube.unload() + if (Youtube.pending) + Youtube.player.loadVideoById(Youtube.video.name) + Youtube.pending = false + } +Player.register(Youtube) + diff --git a/frontend/static/other_rooms/admin.html b/frontend/static/other_rooms/admin.html new file mode 100644 index 0000000..4ec4a31 --- /dev/null +++ b/frontend/static/other_rooms/admin.html @@ -0,0 +1,78 @@ +<!doctype html> +<html> +<head> +<title>SANDBOX ADMIN</title> +<link href="/css/sasscss/test.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/print.css" media="print" rel="stylesheet" type="text/css" /> +<!--[if IE]> + <link href="/css/sasscss/ie.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<![endif]--> +</head> +<body> +<section id="room"> + <a id="return-link"><< back to room</a> + <h1>MODERATOR COMMAND CENTER</h1> + <label>sessionid:</label> <span id="session"></span><br /> + <label>look up a room:</label> <input type="text" id="lookup-room" /><br /> + <br /> +<!-- + <label>name:</label> <span id="room-name"></span><br /> + <label>title:</label> <input type="text" id="room-title"/><br /> + <label>topic:</label> <input type="text" id="room-topic"></><br /> + <br /> + <label>background image:</label> <input type="text" id="room-bg"/> <span id="bg-off">off</span><br /> + <label>phase:</label> <input type="text" id="room-phase"/><br /> + <label>background reset:</label> <input type="text" id="room-bgreset"/><br /> + <label>background color:</label> <input type="text" id="room-bgcolor"/><br /> + <label></label><button id="room-settings-save">save</button><br /> + <label><small><i>last updated by</i></small></label> <span id="room-updater"></span> + <br /> + <br /> + <label>lastlog:</label> <span id="room-lastlog"></span><br /> + <br /> + <label>ops:</label> <span id="room-ops"></span><br /> + <label>bans:</label> <span id="room-bans"></span><br /> + <br /> +--> + <h2>CURRENT PLAYLIST FOR <span id="room-name"></span></h2> + <ul id="videos"></ul> +</section> + +<section id="bg"> +<!-- + <img src="http://scannerjammer.com/bgz/whitesquare.gif" /> +--> +</section> + +<section id="stats"> +</section> + +<iframe id="pnp"></iframe> +</section> + +<section id="msg"></section> +</body> +<script type="text/javascript"> + serverHost = "scannerjammer.com" + serverPort = 19898 + roomName = window.location.pathname.split("/")[1] + retrograde = false +</script> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery.md5.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/swfobject.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/debug.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/api.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/admin.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/like.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/auth.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/chat.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/room.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/player.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/youtube.js"></script> +<!-- +<script type="text/javascript" src="http://scannerjammer.com/js/main.js"></script> +--> +<script type="text/javascript" src="http://scannerjammer.com/js/test-admin.js"></script> +</html> + diff --git a/frontend/static/other_rooms/calendar.html b/frontend/static/other_rooms/calendar.html new file mode 100644 index 0000000..313eec1 --- /dev/null +++ b/frontend/static/other_rooms/calendar.html @@ -0,0 +1,89 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER HISTORY</title> +<link href="/css/sasscss/profile.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/calendar.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link type="text/css" href="/css/ui-purple2/jquery-ui-1.8.13.custom.css" rel="stylesheet" /> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="Content-Type" content="text/html; charset=iso=8859-1" /> +<meta property="og:title" content="Top Videos in Scannerjammer History"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/calendar/"/> +<meta property="og:image" content="http://scannerjammer.com/img/watercoolericon.jpg"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="use the left + right arrow keys to go to the next video"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +</head> +<body> + +<div id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0" /></a> + <h1 id="heading">TOP VIDEOS in scannerjammer history</h1> + <div id="likebutton"> + <fb:like href="http://scannerjammer.com/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + </div> +</div> +<div id="logobg"></div> + +<div id="bg"><img src="" /></div> + +<div id="player"> + <div id="projector"> + <div id="screen"></div> + <div id="ytscreen"></div> + <div id="video-title"></div> + </div> + <nav id="controls"> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + <button id="like">LIKE</button> + <button id="fullscreen">FULLSCREEN</button> + <a id="video-link" target="_blank">[link]</a> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</div> + +<div id="calendar"></div> + +<img src="http://asdf.us/im/4f/watercooler_1307759149.gif" id="water-cooler" class="furniture" /> +<img src="http://asdf.us/im/70/officeplant_1307759129.gif" id="office-plant" class="furniture" /> +<div id="carpet" class="furniture"></div> + +<div id="playlist"> + <ul id="queue"></ul> +</div> +<div id="playlistbg"></div> + +<section id="flower"><img src="http://scannerjammer.com/img/glitter_flower.gif" height="700" /></section> + +<div id="msg"></div> +<div id="plea">please enable javascript</div> +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript"> + serverHost = "scannerjammer.com" + serverPort = 19898 +</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/other_rooms/datepicker/datepicker.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/soundmanager2.js"></script> +<script type="text/javascript" src="/js/debug.js"></script> +<script type="text/javascript" src="/js/api.js"></script> +<script type="text/javascript" src="/js/auth.js"></script> +<script type="text/javascript" src="/js/like.js"></script> +<script type="text/javascript" src="/js/chat.js"></script> +<script type="text/javascript" src="/js/player.js"></script> +<script type="text/javascript" src="/js/vimeo.js"></script> +<script type="text/javascript" src="/js/youtube.js"></script> +<script type="text/javascript" src="/js/soundcloud.js"></script> +<script type="text/javascript" src="/js/audio.js"></script> +<script type="text/javascript" src="/js/calendar.js"></script> +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +</html> + diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png Binary files differnew file mode 100644 index 0000000..954e22d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png Binary files differnew file mode 100644 index 0000000..64ece57 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png Binary files differnew file mode 100644 index 0000000..abdc010 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png Binary files differnew file mode 100644 index 0000000..9b383f4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png Binary files differnew file mode 100644 index 0000000..859c264 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png Binary files differnew file mode 100644 index 0000000..42ccba2 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png Binary files differnew file mode 100644 index 0000000..39d5824 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png Binary files differnew file mode 100644 index 0000000..f127367 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png Binary files differnew file mode 100644 index 0000000..359397a --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_222222_256x240.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_222222_256x240.png Binary files differnew file mode 100644 index 0000000..b273ff1 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_222222_256x240.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_228ef1_256x240.png Binary files differnew file mode 100644 index 0000000..a641a37 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_228ef1_256x240.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ef8c08_256x240.png Binary files differnew file mode 100644 index 0000000..85e63e9 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ef8c08_256x240.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffd27a_256x240.png Binary files differnew file mode 100644 index 0000000..e117eff --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffd27a_256x240.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffffff_256x240.png Binary files differnew file mode 100644 index 0000000..42f8f99 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/images/ui-icons_ffffff_256x240.png diff --git a/frontend/static/other_rooms/datepicker/css/ui-lightness/jquery-ui-1.8.13.custom.css b/frontend/static/other_rooms/datepicker/css/ui-lightness/jquery-ui-1.8.13.custom.css new file mode 100644 index 0000000..2d2810d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/css/ui-lightness/jquery-ui-1.8.13.custom.css @@ -0,0 +1,362 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.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.13 + * + * Copyright 2011, 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-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-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; -webkit-border-radius: 5px; border-radius: 5px; }/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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%; } + +/* 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/frontend/static/other_rooms/datepicker/datepicker.js b/frontend/static/other_rooms/datepicker/datepicker.js new file mode 100644 index 0000000..07ba984 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/datepicker.js @@ -0,0 +1,100 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.13", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus(); +b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this, +"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth, +outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b); +return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e= +0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); +;/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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 + * + * Depends: + * jquery.ui.core.js + */ +(function(d,B){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a", +"mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a","mouseover",function(){if(!d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==B)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.13"}});var z=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)}, +_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a, +b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker); +if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]); +return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a); +if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); +this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/ +2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a, +"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled= +false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled= +true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==B&&f.minDate===B)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==B&&f.maxDate===B)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a= +this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker(); +c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b, +"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target, +-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault(); +a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==B?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a); +d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal= +null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos= +null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0], +top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover"); +c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]}, +_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e- +g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= +null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort, +g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var C=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&C?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,C,K){p=d.map(o(p)?K:C,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w= +x[1];if(b.substr(s,w.length).toLowerCase()==w.toLowerCase()){E=x[0];s+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(A))throw"Unexpected literal at position "+s;s++},s=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v= +new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!= +c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames, +h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break; +case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+ +1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==B?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null, +f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b, +c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+= +parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; +a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+z+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +z+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){for(var O= +"",G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&x==0?c? +f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var D=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;D+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}y+=D+"</tr></thead><tbody>";D=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +D);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;D=l?6:Math.ceil((t+D)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<D;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],F=q.getMonth()!=g,L=F&&!K||!I[0]||k&&q<k||o&&q>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(q.getTime()==P.getTime()&&g==a.selectedMonth&& +a._keyEvent||E.getTime()==q.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+z+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(F&&!C?" ":L?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)? +r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+= +(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a, +"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a, +b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!= +"string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay)); +return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&& +arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.13";window["DP_jQuery_"+z]=d})(jQuery); +;
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/AUTHORS.txt b/frontend/static/other_rooms/datepicker/development-bundle/AUTHORS.txt new file mode 100644 index 0000000..b216865 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/AUTHORS.txt @@ -0,0 +1,30 @@ +jQuery UI Authors (http://jqueryui.com/about) + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +and logs, available at http://github.com/jquery/jquery-ui + +Brandon Aaron +Paul Bakaus (paulbakaus.com) +David Bolter +Rich Caloggero +Chi Cheng (cloudream@gmail.com) +Colin Clark (http://colin.atrc.utoronto.ca/) +Michelle D'Souza +Aaron Eisenberger (aaronchi@gmail.com) +Ariel Flesler +Bohdan Ganicky +Scott González +Marc Grabanski (m@marcgrabanski.com) +Klaus Hartl (stilbuero.de) +Scott Jehl +Cody Lindley +Eduardo Lundgren (eduardolundgren@gmail.com) +Todd Parker +John Resig +Patty Toland +Ca-Phun Ung (yelotofu.com) +Keith Wood (kbwood@virginbroadband.com.au) +Maggie Costello Wachs +Richard D. Worth (rdworth.org) +Jörn Zaefferer (bassistance.de) diff --git a/frontend/static/other_rooms/datepicker/development-bundle/GPL-LICENSE.txt b/frontend/static/other_rooms/datepicker/development-bundle/GPL-LICENSE.txt new file mode 100644 index 0000000..11dddd0 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/GPL-LICENSE.txt @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/frontend/static/other_rooms/datepicker/development-bundle/MIT-LICENSE.txt b/frontend/static/other_rooms/datepicker/development-bundle/MIT-LICENSE.txt new file mode 100644 index 0000000..be22680 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/MIT-LICENSE.txt @@ -0,0 +1,25 @@ +Copyright (c) 2011 Paul Bakaus, http://jqueryui.com/ + +This software consists of voluntary contributions made by many +individuals (AUTHORS.txt, http://jqueryui.com/about) For exact +contribution history, see the revision history and logs, available +at http://jquery-ui.googlecode.com/svn/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/alt-field.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/alt-field.html new file mode 100644 index 0000000..c60b21a --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/alt-field.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Populate alternate field</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + altField: "#alternate", + altFormat: "DD, d MM, yy" + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"> <input type="text" id="alternate" size="30"/></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Populate an alternate field with its own date format whenever a date is selected using the <code>altField</code> and <code>altFormat</code> options. This feature could be used to present a human-friendly date for user selection, while passing a more computer-friendly date through for further processing.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/animation.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/animation.html new file mode 100644 index 0000000..9814b98 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/animation.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Animations</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.effects.core.js"></script> + <script src="../../ui/jquery.effects.blind.js"></script> + <script src="../../ui/jquery.effects.bounce.js"></script> + <script src="../../ui/jquery.effects.clip.js"></script> + <script src="../../ui/jquery.effects.drop.js"></script> + <script src="../../ui/jquery.effects.fold.js"></script> + <script src="../../ui/jquery.effects.slide.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker(); + $( "#anim" ).change(function() { + $( "#datepicker" ).datepicker( "option", "showAnim", $( this ).val() ); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker" size="30"/></p> + +<p>Animations:<br /> + <select id="anim"> + <option value="show">Show (default)</option> + <option value="slideDown">Slide down</option> + <option value="fadeIn">Fade in</option> + <option value="blind">Blind (UI Effect)</option> + <option value="bounce">Bounce (UI Effect)</option> + <option value="clip">Clip (UI Effect)</option> + <option value="drop">Drop (UI Effect)</option> + <option value="fold">Fold (UI Effect)</option> + <option value="slide">Slide (UI Effect)</option> + <option value="">None</option> + </select> +</p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Use different animations when opening or closing the datepicker. Choose an animation from the dropdown, then click on the input to see its effect. You can use one of the three standard animations or any of the UI Effects.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/buttonbar.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/buttonbar.html new file mode 100644 index 0000000..3b3be3b --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/buttonbar.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Display button bar</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + showButtonPanel: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Display a button for selecting Today's date and a Done button for closing the calendar with the boolean <code>showButtonPanel</code> option. Each button is enabled by default when the bar is displayed, but can be turned off with additional options. Button text is customizable.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-formats.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-formats.html new file mode 100644 index 0000000..e1ac673 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-formats.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Format date</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker(); + $( "#format" ).change(function() { + $( "#datepicker" ).datepicker( "option", "dateFormat", $( this ).val() ); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker" size="30"/></p> + +<p>Format options:<br /> + <select id="format"> + <option value="mm/dd/yy">Default - mm/dd/yy</option> + <option value="yy-mm-dd">ISO 8601 - yy-mm-dd</option> + <option value="d M, y">Short - d M, y</option> + <option value="d MM, y">Medium - d MM, y</option> + <option value="DD, d MM, yy">Full - DD, d MM, yy</option> + <option value="'day' d 'of' MM 'in the year' yy">With text - 'day' d 'of' MM 'in the year' yy</option> + </select> +</p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Display date feedback in a variety of ways. Choose a date format from the dropdown, then click on the input and select a date to see it in that format.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-range.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-range.html new file mode 100644 index 0000000..bf9b9a3 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/date-range.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Select a Date Range</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + var dates = $( "#from, #to" ).datepicker({ + defaultDate: "+1w", + changeMonth: true, + numberOfMonths: 3, + onSelect: function( selectedDate ) { + var option = this.id == "from" ? "minDate" : "maxDate", + instance = $( this ).data( "datepicker" ), + date = $.datepicker.parseDate( + instance.settings.dateFormat || + $.datepicker._defaults.dateFormat, + selectedDate, instance.settings ); + dates.not( this ).datepicker( "option", option, date ); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<label for="from">From</label> +<input type="text" id="from" name="from"/> +<label for="to">to</label> +<input type="text" id="to" name="to"/> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Select the date range to search for.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/default.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/default.html new file mode 100644 index 0000000..d50ac0d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/default.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Default functionality</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/dropdown-month-year.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/dropdown-month-year.html new file mode 100644 index 0000000..8392a15 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/dropdown-month-year.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Display month & year menus</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + changeMonth: true, + changeYear: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Show month and year dropdowns in place of the static month/year header to facilitate navigation through large timeframes. Add the boolean <code>changeMonth</code> and <code>changeYear</code> options.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/icon-trigger.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/icon-trigger.html new file mode 100644 index 0000000..5f4edc7 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/icon-trigger.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Icon trigger</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + showOn: "button", + buttonImage: "images/calendar.gif", + buttonImageOnly: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Click the icon next to the input field to show the datepicker. Set the datepicker to open on focus (default behavior), on icon click, or both.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/images/calendar.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/images/calendar.gif Binary files differnew file mode 100644 index 0000000..d0abaa7 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/images/calendar.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/index.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/index.html new file mode 100644 index 0000000..ed24774 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/index.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker Demos</title> + <link rel="stylesheet" href="../demos.css"> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="date-formats.html">Format date</a></li> + <li><a href="min-max.html">Restrict date range</a></li> + <li><a href="localization.html">Localize calendar</a></li> + <li><a href="alt-field.html">Populate alternate field</a></li> + <li><a href="inline.html">Display inline</a></li> + <li><a href="buttonbar.html">Display button bar</a></li> + <li><a href="dropdown-month-year.html">Display month & year menus</a></li> + <li><a href="other-months.html">Dates in other months</a></li> + <li><a href="show-week.html">Show week of the year</a></li> + <li><a href="multiple-calendars.html">Display multiple months</a></li> + <li><a href="icon-trigger.html">Icon trigger</a></li> + <li><a href="animation.html">Animations</a></li> + <li><a href="date-range.html">Date Range</a></li> + </ul> +</div> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/inline.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/inline.html new file mode 100644 index 0000000..19c4b04 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/inline.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Display inline</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker(); + }); + </script> +</head> +<body> + +<div class="demo"> + +Date: <div id="datepicker"></div> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Display the datepicker embedded in the page instead of in an overlay. Simply call .datepicker() on a div instead of an input.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/localization.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/localization.html new file mode 100644 index 0000000..9103611 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/localization.html @@ -0,0 +1,162 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Localize calendar</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-af.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ar.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ar-DZ.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-az.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-bg.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-bs.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ca.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-cs.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-da.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-de.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-el.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-en-AU.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-en-GB.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-en-NZ.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-eo.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-es.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-et.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-eu.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-fa.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-fi.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-fo.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-fr.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-gl.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-he.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-hr.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-hu.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-hy.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-id.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-is.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-it.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ja.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ko.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-kz.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-lt.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-lv.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ml.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ms.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-nl.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-no.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-pl.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-pt.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-rm.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ro.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ru.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sk.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sl.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sq.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sr.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-sv.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-ta.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-th.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-tj.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-tr.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-uk.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-vi.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script> + <script src="../../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $.datepicker.setDefaults( $.datepicker.regional[ "" ] ); + $( "#datepicker" ).datepicker( $.datepicker.regional[ "fr" ] ); + $( "#locale" ).change(function() { + $( "#datepicker" ).datepicker( "option", + $.datepicker.regional[ $( this ).val() ] ); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"/> + <select id="locale"> + <option value="af">Afrikaans</option> + <option value="sq">Albanian (Gjuha shqipe)</option> + <option value="ar-DZ">Algerian Arabic</option> + <option value="ar">Arabic (‫(لعربي</option> + <option value="hy">Armenian (Հայերեն)</option> + <option value="az">Azerbaijani (Azərbaycan dili)</option> + <option value="eu">Basque (Euskara)</option> + <option value="bs">Bosnian (Bosanski)</option> + <option value="bg">Bulgarian (български език)</option> + <option value="ca">Catalan (Català)</option> + <option value="zh-HK">Chinese Hong Kong (繁體中文)</option> + <option value="zh-CN">Chinese Simplified (简体中文)</option> + <option value="zh-TW">Chinese Traditional (繁體中文)</option> + <option value="hr">Croatian (Hrvatski jezik)</option> + <option value="cs">Czech (čeština)</option> + <option value="da">Danish (Dansk)</option> + <option value="nl">Dutch (Nederlands)</option> + <option value="en-AU">English/Australia</option> + <option value="en-NZ">English/New Zealand</option> + <option value="en-GB">English/UK</option> + <option value="eo">Esperanto</option> + <option value="et">Estonian (eesti keel)</option> + <option value="fo">Faroese (føroyskt)</option> + <option value="fa">Farsi/Persian (‫(فارسی</option> + <option value="fi">Finnish (suomi)</option> + <option value="fr" selected="selected">French (Français)</option> + <option value="fr-CH">French/Swiss (Français de Suisse)</option> + <option value="gl">Galician</option> + <option value="de">German (Deutsch)</option> + <option value="el">Greek (Ελληνικά)</option> + <option value="he">Hebrew (‫(עברית</option> + <option value="hu">Hungarian (Magyar)</option> + <option value="is">Icelandic (Õslenska)</option> + <option value="id">Indonesian (Bahasa Indonesia)</option> + <option value="it">Italian (Italiano)</option> + <option value="ja">Japanese (日本語)</option> + <option value="ko">Korean (한국어)</option> + <option value="kz">Kazakhstan (Kazakh)</option> + <option value="lv">Latvian (Latvieöu Valoda)</option> + <option value="lt">Lithuanian (lietuviu kalba)</option> + <option value="ml">Malayalam</option> + <option value="ms">Malaysian (Bahasa Malaysia)</option> + <option value="no">Norwegian (Norsk)</option> + <option value="pl">Polish (Polski)</option> + <option value="pt">Portuguese (Português)</option> + <option value="pt-BR">Portuguese/Brazilian (Português)</option> + <option value="rm">Rhaeto-Romanic (Romansh)</option> + <option value="ro">Romanian (Română)</option> + <option value="ru">Russian (Русский)</option> + <option value="sr">Serbian (српски језик)</option> + <option value="sr-SR">Serbian (srpski jezik)</option> + <option value="sk">Slovak (Slovencina)</option> + <option value="sl">Slovenian (Slovenski Jezik)</option> + <option value="es">Spanish (Español)</option> + <option value="sv">Swedish (Svenska)</option> + <option value="ta">Tamil (தமிழ்)</option> + <option value="th">Thai (ภาษาไทย)</option> + <option value="tj">Tajikistan</option> + <option value="tr">Turkish (Türkçe)</option> + <option value="uk">Ukranian (Українська)</option> + <option value="vi">Vietnamese (Tiếng Việt)</option> + </select></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Localize the datepicker calendar language and format (English / Western formatting is the default). The datepicker includes built-in support for languages that read right-to-left, such as Arabic and Hebrew.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/min-max.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/min-max.html new file mode 100644 index 0000000..e27339e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/min-max.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Restrict date range</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ minDate: -20, maxDate: "+1M +10D" }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Restrict the range of selectable dates with the <code>minDate</code> and <code>maxDate</code> options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D'). For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/multiple-calendars.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/multiple-calendars.html new file mode 100644 index 0000000..0c762f7 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/multiple-calendars.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Display multiple months</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + numberOfMonths: 3, + showButtonPanel: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>Set the <code>numberOfMonths</code> option to an integer of 2 or more to show multiple months in a single datepicker.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/other-months.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/other-months.html new file mode 100644 index 0000000..78a04f2 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/other-months.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Dates in other months</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + showOtherMonths: true, + selectOtherMonths: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>The datepicker can show dates that come from other than the main month + being displayed. These other dates can also be made selectable.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/show-week.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/show-week.html new file mode 100644 index 0000000..1cdb349 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/datepicker/show-week.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Datepicker - Show week of the year</title> + <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css"> + <script src="../../jquery-1.5.1.js"></script> + <script src="../../ui/jquery.ui.core.js"></script> + <script src="../../ui/jquery.ui.widget.js"></script> + <script src="../../ui/jquery.ui.datepicker.js"></script> + <link rel="stylesheet" href="../demos.css"> + <script> + $(function() { + $( "#datepicker" ).datepicker({ + showWeek: true, + firstDay: 1 + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + + + +<div class="demo-description"> +<p>The datepicker can show the week of the year. The default calculation follows + the ISO 8601 definition: the week starts on Monday, the first week of the year + contains the first Thursday of the year. This means that some days from one + year may be placed into weeks 'belonging' to another year.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/demos.css b/frontend/static/other_rooms/datepicker/development-bundle/demos/demos.css new file mode 100644 index 0000000..2d2ce1f --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/demos.css @@ -0,0 +1,334 @@ +body { + font-size: 62.5%; +} + +table { + font-size: 1em; +} + +/* Site + -------------------------------- */ + +body { + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +/* Layout + -------------------------------- */ + +.layout-grid { + width: 960px; +} + +.layout-grid td { + vertical-align: top; +} + +.layout-grid td.left-nav { + width: 140px; +} + +.layout-grid td.normal { + border-left: 1px solid #eee; + padding: 20px 24px; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +.layout-grid td.demos { + background: url('/images/demos_bg.jpg') no-repeat; + height: 337px; + overflow: hidden; +} + +/* Normal + -------------------------------- */ + +.normal h3, +.normal h4 { + margin: 0; + font-weight: normal; +} + +.normal h3 { + padding: 0 0 9px; + font-size: 1.8em; +} + +.normal h4 { + padding-bottom: 21px; + border-bottom: 1px dashed #999; + font-size: 1.2em; + font-weight: bold; +} + +.normal p { + font-size: 1.2em; +} + +/* Demos */ + +.demos-nav, .demos-nav dt, .demos-nav dd, .demos-nav ul, .demos-nav li { + margin: 0; + padding: 0 +} + +.demos-nav { + float: left; + width: 170px; + font-size: 1.3em; +} + +.demos-nav dt, +.demos-nav h4 { + margin: 0; + padding: 0; + font: normal 1.1em "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + color: #e87b10; +} + +.demos-nav dt, +.demos-nav h4 { + margin-top: 1.5em; + margin-bottom: 0; + padding-left: 8px; + padding-bottom:5px; + line-height: 1.2em; + border-bottom: 1px solid #F4F4F4; +} + +.demos-nav dd a, +.demos-nav li a { + border-bottom: 1px solid #F4F4F4; + display:block; + padding: 4px 3px 4px 8px; + font-size: 90%; + text-decoration: none; + color: #555 ; + margin:2px 0; + height:13px; +} + +.demos-nav dd a:hover, +.demos-nav dd a:focus, +.demos-nav dd a:hover, +.demos-nav dd a:focus { + background: #f3f3f3; + color:#000; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + .demos-nav dd a.selected { + background: #555; + color:#ffffff; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + + +/* new styles for demo pages, added by Filament 12.29.08 +eventually we should convert the font sizes to ems -- using px for now to minimize style conflicts +*/ + +.normal h3.demo-header { font-size:32px; padding:0 0 5px; border-bottom:1px solid #eee; text-transform: capitalize; } +.normal h4.demo-subheader { font-size:10px; text-transform: uppercase; color:#999; padding:8px 0 3px; border:0; margin:0; } +.normal a:link, +.normal a:visited { color:#1b75bb; text-decoration:none; } +.normal a:hover, +.normal a:active { color:#0b559b; } + +#demo-config { padding:20px 0 0; } + +#demo-frame { float:left; width:540px; height:380px; border:1px solid #ddd; overflow: auto; position: relative; } +#demo-frame h3, #demo-frame h4 { padding: 0; font-weight: bold; font-size: 1em; } + +#demo-config-menu { float:right; width:180px; } +#demo-config-menu h4 { font-size:13px; color:#666; font-weight:normal; border:0; padding-left:18px; } + +#demo-config-menu ul { list-style: none; padding: 0; margin: 0; } + +#demo-config-menu li { font-size:12px; padding:0 0 0 10px; margin:3px 0; zoom: 1; } + +#demo-config-menu li a:link, +#demo-config-menu li a:visited { display:block; padding:1px 8px 4px; border-bottom:1px dotted #b3b3b3; } +* html #demo-config-menu li a:link, +* html #demo-config-menu li a:visited { padding:1px 8px 2px; } +#demo-config-menu li a:hover, +#demo-config-menu li a:active { background-color:#f6f6f6; } + +#demo-config-menu li.demo-config-on { background: url(images/demo-config-on-tile.gif) repeat-x left center; } + +#demo-config-menu li.demo-config-on a:link, +#demo-config-menu li.demo-config-on a:visited, +#demo-config-menu li.demo-config-on a:hover, +#demo-config-menu li.demo-config-on a:active { background: url(images/demo-config-on.gif) no-repeat left; padding-left:18px; color:#fff; border:0; margin-left:-10px; margin-top: 0px; margin-bottom: 0px; } + +#demo-source, #demo-notes { + clear: both; + padding: 20px 0 0; + font-size: 1.3em; +} + +#demo-notes { width:520px; color:#333; font-size: 1em; } +#demo-notes p code, .demo-description p code { padding: 0; font-weight: bold; } +#demo-source pre, #demo-source code { padding: 0; } +code, pre { padding:8px 0 8px 20px ; font-size: 1.2em; line-height:130%; } + +#demo-source a:link, +#demo-source a:visited, +#demo-source a:hover, +#demo-source a:active { font-size:12px; padding-left:13px; background-position: left center; background-repeat: no-repeat; } + +#demo-source a.source-open:link, +#demo-source a.source-open:visited, +#demo-source a.source-open:hover, +#demo-source a.source-open:active { background-image: url(images/demo-spindown-open.gif); } + +#demo-source a.source-closed:link, +#demo-source a.source-closed:visited, +#demo-source a.source-closed:hover, +#demo-source a.source-closed:active { background-image: url(images/demo-spindown-closed.gif); } + +div.demo { + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; +} + +div.demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; } + +div.demo-description { + clear:both; + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; + font-size: 1.3em; + line-height: 1.4em; +} + +.ui-draggable, .ui-droppable { + background-position: top left; +} + +.left-nav .demos-nav { + padding-right: 10px; +} + +#demo-link { font-size:11px; padding-top: 6px; clear: both; overflow: hidden; } +#demo-link a span.ui-icon { float:left; margin-right:3px; } + +/* Component containers +----------------------------------*/ +#widget-docs .ui-widget { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget input, #widget-docs .ui-widget select, #widget-docs .ui-widget textarea, #widget-docs .ui-widget button { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget-header { border: 1px solid #ffffff; background: #464646 url(images/464646_40x100_textures_01_flat_100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +#widget-docs .ui-widget-header a { color: #ffffff; } +#widget-docs .ui-widget-content { border: 1px solid #ffffff; background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 50% 50% repeat-x; color: #222222; } +#widget-docs .ui-widget-content a { color: #222222; } + +/* Interaction states +----------------------------------*/ +#widget-docs .ui-state-default, #widget-docs .ui-widget-content #widget-docs .ui-state-default { border: 1px solid #666666; background: #555555 url(images/555555_40x100_textures_03_highlight_soft_75.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-default a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-hover, #widget-docs .ui-widget-content #widget-docs .ui-state-hover, #widget-docs .ui-state-focus, #widget-docs .ui-widget-content #widget-docs .ui-state-focus { border: 1px solid #666666; background: #444444 url(images/444444_40x100_textures_03_highlight_soft_60.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-hover a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-active, #widget-docs .ui-widget-content #widget-docs .ui-state-active { border: 1px solid #666666; background: #ffffff url(images/ffffff_40x100_textures_01_flat_65.png) 50% 50% repeat-x; font-weight: normal; color: #F6921E; outline: none; } +#widget-docs .ui-state-active a { color: #F6921E; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +#widget-docs .ui-state-highlight, #widget-docs .ui-widget-content #widget-docs .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/fbf9ee_40x100_textures_02_glass_55.png) 50% 50% repeat-x; color: #363636; } +#widget-docs .ui-state-error, #widget-docs .ui-widget-content #widget-docs .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/fef1ec_40x100_textures_05_inset_soft_95.png) 50% bottom repeat-x; color: #cd0a0a; } +#widget-docs .ui-state-error-text, #widget-docs .ui-widget-content #widget-docs .ui-state-error-text { color: #cd0a0a; } +#widget-docs .ui-state-disabled, #widget-docs .ui-widget-content #widget-docs .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +#widget-docs .ui-priority-primary, #widget-docs .ui-widget-content #widget-docs .ui-priority-primary { font-weight: bold; } +#widget-docs .ui-priority-secondary, #widget-docs .ui-widget-content #widget-docs .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +#demo-frame-wrapper .ui-icon, #widget-docs .ui-icon { width: 16px; height: 16px; background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-content .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-header .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-state-default .ui-icon { background-image: url(images/888888_256x240_icons_icons.png); } +#widget-docs .ui-state-hover .ui-icon, #widget-docs .ui-state-focus .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-active .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-highlight .ui-icon {background-image: url(images/2e83ff_256x240_icons_icons.png); } +#widget-docs .ui-state-error .ui-icon, #widget-docs .ui-state-error-text .ui-icon {background-image: url(images/cd0a0a_256x240_icons_icons.png); } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +#widget-docs .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } +#widget-docs .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } + +/* Overlays */ +#widget-docs .ui-widget-overlay { background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +#widget-docs .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; } + +/* +----------------------------------*/ + +#widget-docs { margin:20px 0 0; border: none; } + +#widget-docs h2, #widget-docs h3, #widget-docs h4, #widget-docs p, #widget-docs ul, #widget-docs code { margin:0; padding:0; } +#widget-docs code { display:block; color:#444; font-size:.9em; margin:0 0 1em; } +#widget-docs code strong { color:#000; } +#widget-docs p { margin:0 3em 1.2em 0; } +#widget-docs p.intro { font-size:13px; color:#666; line-height:1.3; } +#widget-docs ul { list-style-type: none; } + +#widget-docs h2 { font-size:16px; margin:1.2em 0 .5em; } +#widget-docs h3 { font-size:14px; color:#e6820E; margin:1.5em 0 .5em; } +.normal #widget-docs h4 { font-size:12px; color:#000; border:0; margin:0 0 .5em; } + +#docs-overview-main { width:400px; } +#docs-overview-sidebar { float:right; width:200px; } +#docs-overview-sidebar a span { color:#666; } +#widget-docs #docs-overview-main p { margin-right:0; } +#widget-docs #docs-overview-sidebar h4 { padding-left:0; } + +.docs-list-header { float:left; width:100%; margin:10px 0 0; border-bottom:1px solid #eee; } +#widget-docs .docs-list-header h2 { float:left; margin:0; } +#widget-docs .docs-list-header p { float:right; margin:5px 0; font-size:11px; } + +.docs-list { float:left; width:100%; padding:0 0 10px; } +.docs-list .param-header { float:left; clear:left; width:100%; padding:8px 0; border-top:1px solid #eee; } +#widget-docs .param-header h3, #widget-docs .param-header p { margin:0; float:left; } +#widget-docs .param-header h3 { width:50%; } +#widget-docs .param-header h3 span { background: url(images/demo-spindown-closed.gif) no-repeat left; padding-left:13px; } +#widget-docs .param-open .param-header h3 span { background: url(images/demo-spindown-open.gif) no-repeat left; } +#widget-docs .param-header p { width:24%; } +#widget-docs .param-header p.param-type span { background: url(images/icon-docs-info.gif) no-repeat left; cursor:pointer; border-bottom:1px dashed #ccc; padding-left:15px; } + +.param-details { padding-left:13px; } +.param-args { margin:0 0 1.5em; border-top:1px dotted #ccc;} +.param-args td { padding:3px 30px 3px 5px; border-bottom:1px dotted #ccc; } + + +/* overrides for ui-tab styles */ +#widget-docs ul.ui-tabs-nav { padding:0 0 0 8px; } +#widget-docs .ui-tabs-nav li { margin:5px 5px 0 0; } + +#widget-docs .ui-tabs-nav li a:link, +#widget-docs .ui-tabs-nav li a:visited, +#widget-docs .ui-tabs-nav li a:hover, +#widget-docs .ui-tabs-nav li a:active { font-size:14px; padding:4px 1.2em 3px; color:#fff; } + +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:link, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:visited, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:hover, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:active { color:#e6820E; } + +#widget-docs .ui-tabs-panel { padding:20px 9px; font-size:12px; line-height:1.4; color:#000; } + +#widget-docs .ui-widget-content a:link, +#widget-docs .ui-widget-content a:visited { color:#1b75bb; text-decoration:none; } +#widget-docs .ui-widget-content a:hover, +#widget-docs .ui-widget-content a:active { color:#0b559b; } + diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/calendar.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/calendar.gif Binary files differnew file mode 100644 index 0000000..d0abaa7 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/calendar.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on-tile.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on-tile.gif Binary files differnew file mode 100644 index 0000000..a96b5bf --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on-tile.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on.gif Binary files differnew file mode 100644 index 0000000..e3b6d7c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-config-on.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-closed.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-closed.gif Binary files differnew file mode 100644 index 0000000..ad4bd37 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-closed.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-open.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-open.gif Binary files differnew file mode 100644 index 0000000..e1c60aa --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/demo-spindown-open.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/icon-docs-info.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/icon-docs-info.gif Binary files differnew file mode 100644 index 0000000..ea6d2be --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/icon-docs-info.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/images/pbar-ani.gif b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/pbar-ani.gif Binary files differnew file mode 100644 index 0000000..cb59a04 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/images/pbar-ani.gif diff --git a/frontend/static/other_rooms/datepicker/development-bundle/demos/index.html b/frontend/static/other_rooms/datepicker/development-bundle/demos/index.html new file mode 100644 index 0000000..2b87709 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/demos/index.html @@ -0,0 +1,321 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Demos</title> + <link rel="stylesheet" href="../themes/base/jquery.ui.all.css"> + <link rel="stylesheet" href="demos.css"> + <script src="../jquery-1.5.1.js"></script> + <script src="../external/jquery.bgiframe-2.1.2.js"></script> + <script src="../ui/jquery.ui.core.js"></script> + <script src="../ui/jquery.ui.widget.js"></script> + <script src="../ui/jquery.ui.mouse.js"></script> + <script src="../ui/jquery.ui.accordion.js"></script> + <script src="../ui/jquery.ui.autocomplete.js"></script> + <script src="../ui/jquery.ui.button.js"></script> + <script src="../ui/jquery.ui.datepicker.js"></script> + <script src="../ui/jquery.ui.dialog.js"></script> + <script src="../ui/jquery.ui.draggable.js"></script> + <script src="../ui/jquery.ui.droppable.js"></script> + <script src="../ui/jquery.ui.position.js"></script> + <script src="../ui/jquery.ui.progressbar.js"></script> + <script src="../ui/jquery.ui.resizable.js"></script> + <script src="../ui/jquery.ui.selectable.js"></script> + <script src="../ui/jquery.ui.slider.js"></script> + <script src="../ui/jquery.ui.sortable.js"></script> + <script src="../ui/jquery.ui.tabs.js"></script> + <script src="../ui/jquery.effects.core.js"></script> + <script src="../ui/jquery.effects.blind.js"></script> + <script src="../ui/jquery.effects.bounce.js"></script> + <script src="../ui/jquery.effects.clip.js"></script> + <script src="../ui/jquery.effects.drop.js"></script> + <script src="../ui/jquery.effects.explode.js"></script> + <script src="../ui/jquery.effects.fold.js"></script> + <script src="../ui/jquery.effects.highlight.js"></script> + <script src="../ui/jquery.effects.pulsate.js"></script> + <script src="../ui/jquery.effects.scale.js"></script> + <script src="../ui/jquery.effects.shake.js"></script> + <script src="../ui/jquery.effects.slide.js"></script> + <script src="../ui/jquery.effects.transfer.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-af.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ar.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ar-DZ.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-az.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-bs.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-bg.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ca.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-cs.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-da.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-de.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-el.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-en-AU.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-en-GB.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-en-NZ.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-eo.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-es.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-et.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-eu.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-fa.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-fi.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-fo.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-fr.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-gl.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-he.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-hr.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-hu.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-hy.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-id.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-is.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-it.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ja.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ko.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-kz.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-lt.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-lv.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ml.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ms.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-nl.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-no.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-pl.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-pt.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-rm.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ro.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ru.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sk.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sl.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sq.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sr.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-sv.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-ta.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-th.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-tj.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-tr.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-uk.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-vi.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script> + <script src="../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script> + <script> + $(function() { + + $('.left-nav a').click(function(ev) { + window.location.hash = this.href.replace(/.+\/([^\/]+)\/index\.html/,'$1') + '|default'; + loadPage(this.href); + $('.left-nav a.selected').removeClass('selected'); + $(this).addClass('selected'); + ev.preventDefault(); + }); + + if (window.location.hash) { + if (window.location.hash.indexOf('|') === -1) { + window.location.hash += '|default'; + } + var path = window.location.href.replace(/(index\.html)?#/,''); + path = path.replace('\|','/') + '.html'; + loadPage(path); + } + + function loadPage(path) { + var section = path.replace(/\/[^\/]+\.html/,''); + var header = section.replace(/.+\/([^\/]+)/,'$1').replace(/_/, ' '); + + $('td.normal div.normal') + .empty() + .append('<h4 class="demo-subheader">Functional demo:</h4>') + .append('<h3 class="demo-header">'+ header +'</h3>') + .append('<div id="demo-config"></div>') + .find('#demo-config') + .append('<div id="demo-frame"></div><div id="demo-config-menu"></div><div id="demo-link"><a class="demoWindowLink" href="#"><span class="ui-icon ui-icon-newwin"></span>Open demo in a new window</a></div>') + .find('#demo-config-menu') + .load(section + '/index.html .demos-nav', function() { + $('#demo-config-menu a').each(function() { + this.setAttribute('href', section + '/' + this.getAttribute('href').replace(/.+\/([^\/]+)/,'$1')); + $(this).attr('target', 'demo-frame'); + $(this).click(function() { + + resetDemos(); + + $(this).parents('ul').find('li').removeClass('demo-config-on'); + $(this).parent().addClass('demo-config-on'); + $('#demo-notes').fadeOut(); + + //Set the hash to the actual page without ".html" + window.location.hash = header + '|' + this.getAttribute('href').match((/\/([^\/\\]+)\.html/))[1]; + + loadDemo(this.getAttribute('href')); + + return false; + }); + }); + + if (window.location.hash) { + var demo = window.location.hash.split('|')[1]; + $('#demo-config-menu a').each(function(){ + if (this.href.indexOf(demo + '.html') !== -1) { + $(this).parents('ul').find('li').removeClass('demo-config-on'); + $(this).parent().addClass('demo-config-on'); + loadDemo(this.href); + } + }); + } + + updateDemoNotes(); + }) + .end() + .find('#demo-link a') + .bind('click', function(ev){ + window.open(this.href); + ev.preventDefault(); + }) + .end() + .end() + ; + + resetDemos(); + } + + function loadDemo(path) { + var directory = path.match(/([^\/]+)\/[^\/\.]+\.html$/)[1]; + $.get(path, function(data) { + var source = data; + data = data.replace(/<script.*>.*<\/script>/ig,""); // Remove script tags + data = data.replace(/<\/?link.*>/ig,""); //Remove link tags + data = data.replace(/<\/?html.*>/ig,""); //Remove html tag + data = data.replace(/<\/?body.*>/ig,""); //Remove body tag + data = data.replace(/<\/?head.*>/ig,""); //Remove head tag + data = data.replace(/<\/?!doctype.*>/ig,""); //Remove doctype + data = data.replace(/<title.*>.*<\/title>/ig,""); // Remove title tags + data = data.replace(/((href|src)=["'])(?!(http|#))/ig, "$1" + directory + "/"); + + $('#demo-style').remove(); + $('#demo-frame').empty().html(data); + $('#demo-frame style').clone().appendTo('head').attr('id','demo-style'); + $('#demo-link a').attr('href', path); + updateDemoNotes(); + updateDemoSource(source); + + if (/default.html$/.test(path)) { + $.get("documentation/docs-" + path.match(/demos\/(.+)\//)[1] + ".html", function(html) { + $("#demo-source").after(html); + $("#widget-docs").tabs(); + $(".param-header").click(function() { + $(this).parent().toggleClass("param-open").end().next().toggle(); + }); + $(".docs-list-header").each(function() { + var header = $(this); + var details = header.next().find(".param-details").hide(); + $("a:first", header).click(function() { + details.show().parent().addClass("param-open"); + return false; + }); + $("a:last", header).click(function() { + details.hide().parent().removeClass("param-open"); + return false; + }); + }); + }); + } + }); + } + + function updateDemoNotes() { + var notes = $('#demo-frame .demo-description'); + if ($('#demo-notes').length == 0) { + $('<div id="demo-notes"></div>').insertAfter('#demo-config'); + } + $('#demo-notes').hide().empty().html(notes.html()); + $('#demo-notes').show(); + notes.hide(); + } + + function updateDemoSource(source) { + if ($('#demo-source').length == 0) { + $('<div id="demo-source"><a href="#" class="source-closed">View Source</a><div><pre><code></code></pre></div></div>').insertAfter('#demo-notes'); + $('#demo-source').find(">a").click(function() { + $(this).toggleClass("source-closed").toggleClass("source-open").next().toggle(); + return false; + }).end().find(">div").hide(); + } + var cleanedSource = source + .replace('themes/base/jquery.ui.all.css', 'theme/jquery.ui.all.css') + .replace(/\s*\x3Clink.*demos\x2Ecss.*\x3E\s*/, '\r\n\t') + .replace(/\x2E\x2E\x2F\x2E\x2E\x2F/g, ''); + + $('#demo-source code').empty().text(cleanedSource); + } + + function resetDemos() { + $.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional[''])); + $(".ui-dialog-content").remove(); + } + + }); + </script> +</head> +<body> + +<table class="layout-grid" cellspacing="0" cellpadding="0"> + <tr> + <td class="left-nav"> + <dl class="demos-nav"> + <dt>Interactions</dt> + + + + + + <dt>Widgets</dt> + + + + <dd><a href="datepicker/index.html">Datepicker</a></dd> + + + + + <dt>Effects</dt> + <dd><a href="animate/index.html">Color Animation</a></dd> + <dd><a href="toggleClass/index.html">Toggle Class</a></dd> + <dd><a href="addClass/index.html">Add Class</a></dd> + <dd><a href="removeClass/index.html">Remove Class</a></dd> + <dd><a href="switchClass/index.html">Switch Class</a></dd> + <dd><a href="effect/index.html">Effect</a></dd> + <dd><a href="toggle/index.html">Toggle</a></dd> + <dd><a href="hide/index.html">Hide</a></dd> + <dd><a href="show/index.html">Show</a></dd> + <dt>Utilities</dt> + + <dt>About jQuery UI</dt> + <dd><a href="http://jqueryui.com/docs/Getting_Started">Getting Started</a></dd> + <dd><a href="http://jqueryui.com/docs/Upgrade_Guide">Upgrade Guide</a></dd> + <dd><a href="http://jqueryui.com/docs/Changelog">Changelog</a></dd> + <dd><a href="http://jqueryui.com/docs/Roadmap">Roadmap</a></dd> + <dd><a href="http://jqueryui.com/docs/Subversion">Subversion Access</a></dd> + <dd><a href="http://jqueryui.com/docs/Developer_Guide">UI Developer Guidelines</a></dd> + <dt>Theming</dt> + <dd><a href="http://jqueryui.com/docs/Theming">Theming jQuery UI</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/API">jQuery UI CSS Framework</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/Themeroller">ThemeRoller application</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/ThemeSwitcher">Theme Switcher Widget</a></dd> + + </dl> + </td> + <td class="normal"> + + <div class="normal"> + + <h3>Instructions</h3> + <p> + These demos showcase some common uses of each jQuery UI plugin. Simply copy and paste code from the demos to get started. Have fun playing with them. + </p> + + </div> + + </td> + </tr> +</table> +</body> +</html> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/docs/datepicker.html b/frontend/static/other_rooms/datepicker/development-bundle/docs/datepicker.html new file mode 100644 index 0000000..99b1615 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/docs/datepicker.html @@ -0,0 +1,2570 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Datepicker</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Datepicker is a highly configurable plugin that adds datepicker functionality to your pages. You can customize the date format and language, restrict the selectable date ranges and add in buttons and other navigation options easily.</p> +<p>By default, the datepicker calendar opens in a small overlay onFocus and closes automatically onBlur or when a date is selected. For an inline calendar, simply attach the datepicker to a div or span. +</p><p>You can use keyboard shortcuts to drive the datepicker: +</p> +<ul> + <li>page up/down - previous/next month</li> + <li>ctrl+page up/down - previous/next year</li> + <li>ctrl+home - current month or open when closed</li> + <li>ctrl+left/right - previous/next day</li> + <li>ctrl+up/down - previous/next week</li> + <li>enter - accept the selected date</li> + <li>ctrl+end - close and erase the date</li> + <li>escape - close the datepicker without selection</li> +</ul> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=1" title="Edit section: Utility functions">edit</a>]</div><a name="Utility_functions"></a><h3 id="utility-functions">Utility functions</h3> +<ul> + <li><a href="http://docs.jquery.com/UI/Datepicker/setDefaults" title="UI/Datepicker/setDefaults">$.datepicker.setDefaults( settings )</a> - Set settings for all datepicker instances.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">$.datepicker.formatDate( format, date, settings )</a> - Format a date into a string value with a specified format.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/parseDate" title="UI/Datepicker/parseDate">$.datepicker.parseDate( format, value, settings ) </a> - Extract a date from a string value with a specified format.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/iso8601Week" title="UI/Datepicker/iso8601Week">$.datepicker.iso8601Week( date )</a> - Determine the week of the year for a given date: 1 to 53.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/noWeekends" title="UI/Datepicker/noWeekends">$.datepicker.noWeekends</a> - Set as beforeShowDay function to prevent selection of weekends.</li> +</ul> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=2" title="Edit section: Localization">edit</a>]</div><a name="Localization"></a><h3>Localization</h3> +<p>Datepicker provides support for localizing its content to cater for different languages + and date formats. Each localization is contained within its own file with the + language code appended to the name, e.g. <code>jquery.ui.datepicker-fr.js</code> for French. + The desired localization file should be included after the main datepicker code. They add their settings to the set + of available localizations and automatically apply them as defaults for all instances.</p> +<p>The <code>$.datepicker.regional</code> attribute holds an array of localizations, + indexed by language code, with '' referring to the default (English). Each entry is + an object with the following attributes: <code>closeText</code>, <code>prevText</code>, + <code>nextText</code>, <code>currentText</code>, <code>monthNames</code>, + <code>monthNamesShort</code>, <code>dayNames</code>, <code>dayNamesShort</code>, + <code>dayNamesMin</code>, <code>weekHeader</code>, <code>dateFormat</code>, + <code>firstDay</code>, <code>isRTL</code>, <code>showMonthAfterYear</code>, + and <code>yearSuffix</code>.</p> +<p>You can restore the default localizations with:</p> +<p><code>$.datepicker.setDefaults($.datepicker.regional['']);</code> +</p> +<p>And can then override an individual datepicker for a specific locale:</p> +<p><code>$(selector).datepicker($.datepicker.regional['fr']);</code> +</p> +The localization files are also available in the UI svn: <a href="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/" class="external free" title="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/">http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/</a> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="220"> +A simple jQuery UI Datepicker.<br /> +</p> +<pre>$("#datepicker").datepicker(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre><!DOCTYPE html> +<html> +<head> + <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> + <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> + + <script> + $(document).ready(function() { + $("#datepicker").datepicker(); + }); + </script> +</head> +<body style="font-size:62.5%;"> + +<div type="text" id="datepicker"></div> + +</body> +</html> +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the datepicker. Can be set when initialising (first creating) the datepicker.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).datepicker( "option", "disabled" ); +//setter +$( ".selector" ).datepicker( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-altField"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-altField">altField</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, jQuery, Element</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The jQuery selector for another field that is to be updated with the selected date from the datepicker. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altFormat" title="UI/Datepicker">altFormat</a></code> setting to change the format of the date within this field. Leave as blank for no alternate field.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>altField</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ altField: '#actualDate' });</code></pre> +</dd> + + +<dt> + Get or set the <code>altField</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var altField = $( ".selector" ).datepicker( "option", "altField" ); +//setter +$( ".selector" ).datepicker( "option", "altField", '#actualDate' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-altFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-altFormat">altFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> to be used for the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altField" title="UI/Datepicker">altField</a></code> option. This allows one date format to be shown to the user for selection purposes, while a different format is actually sent behind the scenes. For a full list of the possible formats see the <a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a> function</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>altFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ altFormat: 'yy-mm-dd' });</code></pre> +</dd> + + +<dt> + Get or set the <code>altFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var altFormat = $( ".selector" ).datepicker( "option", "altFormat" ); +//setter +$( ".selector" ).datepicker( "option", "altFormat", 'yy-mm-dd' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-appendText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-appendText">appendText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display after each date field, e.g. to show the required format.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>appendText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ appendText: '(yyyy-mm-dd)' });</code></pre> +</dd> + + +<dt> + Get or set the <code>appendText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var appendText = $( ".selector" ).datepicker( "option", "appendText" ); +//setter +$( ".selector" ).datepicker( "option", "appendText", '(yyyy-mm-dd)' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoSize"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoSize">autoSize</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set to true to automatically resize the input field to accomodate dates in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>autoSize</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ autoSize: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoSize</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoSize = $( ".selector" ).datepicker( "option", "autoSize" ); +//setter +$( ".selector" ).datepicker( "option", "autoSize", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonImage"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonImage">buttonImage</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The URL for the popup button image. If set, <code><a href="http://docs.jquery.com/UI/Datepicker#option-buttonText" title="UI/Datepicker">buttonText</a></code> becomes the <i>alt</i> value and is not directly displayed.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonImage</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonImage: '/images/datepicker.gif' });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonImage</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonImage = $( ".selector" ).datepicker( "option", "buttonImage" ); +//setter +$( ".selector" ).datepicker( "option", "buttonImage", '/images/datepicker.gif' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonImageOnly"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonImageOnly">buttonImageOnly</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set to true to place an image after the field to use as the trigger without it appearing on a button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonImageOnly</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonImageOnly: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonImageOnly</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonImageOnly = $( ".selector" ).datepicker( "option", "buttonImageOnly" ); +//setter +$( ".selector" ).datepicker( "option", "buttonImageOnly", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonText">buttonText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'...'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display on the trigger button. Use in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOn" title="UI/Datepicker">showOn</a></code> equal to 'button' or 'both'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonText: 'Choose' });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonText = $( ".selector" ).datepicker( "option", "buttonText" ); +//setter +$( ".selector" ).datepicker( "option", "buttonText", 'Choose' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-calculateWeek"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-calculateWeek">calculateWeek</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">$.datepicker.iso8601Week</dd> + + </dl> + </div> + <div class="option-description"> + <p>A function to calculate the week of the year for a given date. The default implementation uses the ISO 8601 definition: weeks start on a Monday; the first week of the year contains the first Thursday of the year.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>calculateWeek</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ calculateWeek: myWeekCalc });</code></pre> +</dd> + + +<dt> + Get or set the <code>calculateWeek</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var calculateWeek = $( ".selector" ).datepicker( "option", "calculateWeek" ); +//setter +$( ".selector" ).datepicker( "option", "calculateWeek", myWeekCalc );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-changeMonth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-changeMonth">changeMonth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows you to change the month by selecting from a drop-down list. You can enable this feature by setting the attribute to true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>changeMonth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ changeMonth: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>changeMonth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var changeMonth = $( ".selector" ).datepicker( "option", "changeMonth" ); +//setter +$( ".selector" ).datepicker( "option", "changeMonth", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-changeYear"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-changeYear">changeYear</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows you to change the year by selecting from a drop-down list. You can enable this feature by setting the attribute to true. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-yearRange" title="UI/Datepicker">yearRange</a></code> option to control which years are made available for selection.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>changeYear</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ changeYear: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>changeYear</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var changeYear = $( ".selector" ).datepicker( "option", "changeYear" ); +//setter +$( ".selector" ).datepicker( "option", "changeYear", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-closeText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-closeText">closeText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Done'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the close link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>closeText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ closeText: 'X' });</code></pre> +</dd> + + +<dt> + Get or set the <code>closeText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var closeText = $( ".selector" ).datepicker( "option", "closeText" ); +//setter +$( ".selector" ).datepicker( "option", "closeText", 'X' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-constrainInput"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-constrainInput">constrainInput</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true entry in the input field is constrained to those characters allowed by the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>constrainInput</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ constrainInput: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>constrainInput</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var constrainInput = $( ".selector" ).datepicker( "option", "constrainInput" ); +//setter +$( ".selector" ).datepicker( "option", "constrainInput", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-currentText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-currentText">currentText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Today'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the current day link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>currentText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ currentText: 'Now' });</code></pre> +</dd> + + +<dt> + Get or set the <code>currentText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var currentText = $( ".selector" ).datepicker( "option", "currentText" ); +//setter +$( ".selector" ).datepicker( "option", "currentText", 'Now' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dateFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dateFormat">dateFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'mm/dd/yy'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The format for parsed and displayed dates. This attribute is one of the regionalisation attributes. For a full list of the possible formats see the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dateFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dateFormat: 'yy-mm-dd' });</code></pre> +</dd> + + +<dt> + Get or set the <code>dateFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dateFormat = $( ".selector" ).datepicker( "option", "dateFormat" ); +//setter +$( ".selector" ).datepicker( "option", "dateFormat", 'yy-mm-dd' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNames"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNames">dayNames</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of long day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. They also appear as popup hints when hovering over the corresponding column headings. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNames</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNames</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNames = $( ".selector" ).datepicker( "option", "dayNames" ); +//setter +$( ".selector" ).datepicker( "option", "dayNames", ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNamesMin"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNamesMin">dayNamesMin</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of minimised day names, starting from Sunday, for use as column headers within the datepicker. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNamesMin</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNamesMin</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNamesMin = $( ".selector" ).datepicker( "option", "dayNamesMin" ); +//setter +$( ".selector" ).datepicker( "option", "dayNamesMin", ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNamesShort"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNamesShort">dayNamesShort</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of abbreviated day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNamesShort</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNamesShort</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNamesShort = $( ".selector" ).datepicker( "option", "dayNamesShort" ); +//setter +$( ".selector" ).datepicker( "option", "dayNamesShort", ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-defaultDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-defaultDate">defaultDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the date to highlight on first opening if the field is blank. Specify either an actual date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null for today.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>defaultDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ defaultDate: +7 });</code></pre> +</dd> + + +<dt> + Get or set the <code>defaultDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var defaultDate = $( ".selector" ).datepicker( "option", "defaultDate" ); +//setter +$( ".selector" ).datepicker( "option", "defaultDate", +7 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'normal'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Control the speed at which the datepicker appears, it may be a time in milliseconds or a string representing one of the three predefined speeds ("slow", "normal", "fast").</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>duration</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ duration: 'slow' });</code></pre> +</dd> + + +<dt> + Get or set the <code>duration</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var duration = $( ".selector" ).datepicker( "option", "duration" ); +//setter +$( ".selector" ).datepicker( "option", "duration", 'slow' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-firstDay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-firstDay">firstDay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the first day of the week: Sunday is 0, Monday is 1, ... This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>firstDay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ firstDay: 1 });</code></pre> +</dd> + + +<dt> + Get or set the <code>firstDay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var firstDay = $( ".selector" ).datepicker( "option", "firstDay" ); +//setter +$( ".selector" ).datepicker( "option", "firstDay", 1 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-gotoCurrent"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-gotoCurrent">gotoCurrent</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true the current day link moves to the currently selected date instead of today.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>gotoCurrent</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ gotoCurrent: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>gotoCurrent</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var gotoCurrent = $( ".selector" ).datepicker( "option", "gotoCurrent" ); +//setter +$( ".selector" ).datepicker( "option", "gotoCurrent", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-hideIfNoPrevNext"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-hideIfNoPrevNext">hideIfNoPrevNext</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Normally the previous and next links are disabled when not applicable (see <code><a href="http://docs.jquery.com/UI/Datepicker#option-minDate" title="UI/Datepicker">minDate</a></code>/<code><a href="http://docs.jquery.com/UI/Datepicker#option-maxDate" title="UI/Datepicker">maxDate</a></code>). You can hide them altogether by setting this attribute to true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>hideIfNoPrevNext</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ hideIfNoPrevNext: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>hideIfNoPrevNext</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var hideIfNoPrevNext = $( ".selector" ).datepicker( "option", "hideIfNoPrevNext" ); +//setter +$( ".selector" ).datepicker( "option", "hideIfNoPrevNext", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-isRTL"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-isRTL">isRTL</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>True if the current language is drawn from right to left. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>isRTL</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ isRTL: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>isRTL</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var isRTL = $( ".selector" ).datepicker( "option", "isRTL" ); +//setter +$( ".selector" ).datepicker( "option", "isRTL", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxDate">maxDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set a maximum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +1w'), or null for no limit.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>maxDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ maxDate: '+1m +1w' });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxDate = $( ".selector" ).datepicker( "option", "maxDate" ); +//setter +$( ".selector" ).datepicker( "option", "maxDate", '+1m +1w' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minDate">minDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set a minimum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '-1y -1m'), or null for no limit.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>minDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ minDate: new Date(2007, 1 - 1, 1) });</code></pre> +</dd> + + +<dt> + Get or set the <code>minDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minDate = $( ".selector" ).datepicker( "option", "minDate" ); +//setter +$( ".selector" ).datepicker( "option", "minDate", new Date(2007, 1 - 1, 1) );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-monthNames"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-monthNames">monthNames</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of full month names, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>monthNames</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ monthNames: ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>monthNames</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var monthNames = $( ".selector" ).datepicker( "option", "monthNames" ); +//setter +$( ".selector" ).datepicker( "option", "monthNames", ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-monthNamesShort"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-monthNamesShort">monthNamesShort</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of abbreviated month names, as used in the month header on each datepicker and as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>monthNamesShort</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>monthNamesShort</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var monthNamesShort = $( ".selector" ).datepicker( "option", "monthNamesShort" ); +//setter +$( ".selector" ).datepicker( "option", "monthNamesShort", ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-navigationAsDateFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-navigationAsDateFormat">navigationAsDateFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function is applied to the <code><a href="http://docs.jquery.com/UI/Datepicker#option-prevText" title="UI/Datepicker">prevText</a></code>, <code><a href="http://docs.jquery.com/UI/Datepicker#option-nextText" title="UI/Datepicker">nextText</a></code>, and <code><a href="http://docs.jquery.com/UI/Datepicker#option-currentText" title="UI/Datepicker">currentText</a></code> values before display, allowing them to display the target month names for example.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>navigationAsDateFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ navigationAsDateFormat: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>navigationAsDateFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var navigationAsDateFormat = $( ".selector" ).datepicker( "option", "navigationAsDateFormat" ); +//setter +$( ".selector" ).datepicker( "option", "navigationAsDateFormat", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-nextText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-nextText">nextText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Next'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the next month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>nextText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ nextText: 'Later' });</code></pre> +</dd> + + +<dt> + Get or set the <code>nextText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var nextText = $( ".selector" ).datepicker( "option", "nextText" ); +//setter +$( ".selector" ).datepicker( "option", "nextText", 'Later' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-numberOfMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-numberOfMonths">numberOfMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number, Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set how many months to show at once. The value can be a straight integer, or can be a two-element array to define the number of rows and columns to display.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>numberOfMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ numberOfMonths: [2, 3] });</code></pre> +</dd> + + +<dt> + Get or set the <code>numberOfMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var numberOfMonths = $( ".selector" ).datepicker( "option", "numberOfMonths" ); +//setter +$( ".selector" ).datepicker( "option", "numberOfMonths", [2, 3] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-prevText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-prevText">prevText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Prev'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the previous month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>prevText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ prevText: 'Earlier' });</code></pre> +</dd> + + +<dt> + Get or set the <code>prevText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var prevText = $( ".selector" ).datepicker( "option", "prevText" ); +//setter +$( ".selector" ).datepicker( "option", "prevText", 'Earlier' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-selectOtherMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-selectOtherMonths">selectOtherMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true days in other months shown before or after the current month are selectable. This only applies if <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOtherMonths" title="UI/Datepicker">showOtherMonths</a></code> is also true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>selectOtherMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ selectOtherMonths: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>selectOtherMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var selectOtherMonths = $( ".selector" ).datepicker( "option", "selectOtherMonths" ); +//setter +$( ".selector" ).datepicker( "option", "selectOtherMonths", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-shortYearCutoff"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-shortYearCutoff">shortYearCutoff</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'+10'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the cutoff year for determining the century for a date (used in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> 'y'). If a numeric value (0-99) is provided then this value is used directly. If a string value is provided then it is converted to a number and added to the current year. Once the cutoff year is calculated, any dates entered with a year value less than or equal to it are considered to be in the current century, while those greater than it are deemed to be in the previous century.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>shortYearCutoff</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ shortYearCutoff: 50 });</code></pre> +</dd> + + +<dt> + Get or set the <code>shortYearCutoff</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var shortYearCutoff = $( ".selector" ).datepicker( "option", "shortYearCutoff" ); +//setter +$( ".selector" ).datepicker( "option", "shortYearCutoff", 50 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showAnim"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showAnim">showAnim</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'show'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the name of the animation used to show/hide the datepicker. Use 'show' (the default), 'slideDown', 'fadeIn', any of the show/hide <a href="http://docs.jquery.com/UI/Effects" class="external text" title="http://docs.jquery.com/UI/Effects">jQuery UI effects</a>, or '' for no animation.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showAnim</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showAnim: 'fold' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showAnim</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showAnim = $( ".selector" ).datepicker( "option", "showAnim" ); +//setter +$( ".selector" ).datepicker( "option", "showAnim", 'fold' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showButtonPanel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showButtonPanel">showButtonPanel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to show the button panel.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showButtonPanel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showButtonPanel: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showButtonPanel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showButtonPanel = $( ".selector" ).datepicker( "option", "showButtonPanel" ); +//setter +$( ".selector" ).datepicker( "option", "showButtonPanel", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showCurrentAtPos"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showCurrentAtPos">showCurrentAtPos</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specify where in a <a href="http://docs.jquery.com/UI/Datepicker#option-numberOfMonths" title="UI/Datepicker">multi-month</a> display the current month shows, starting from 0 at the top/left.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showCurrentAtPos</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showCurrentAtPos: 3 });</code></pre> +</dd> + + +<dt> + Get or set the <code>showCurrentAtPos</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showCurrentAtPos = $( ".selector" ).datepicker( "option", "showCurrentAtPos" ); +//setter +$( ".selector" ).datepicker( "option", "showCurrentAtPos", 3 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showMonthAfterYear"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showMonthAfterYear">showMonthAfterYear</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to show the month after the year in the header. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showMonthAfterYear</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showMonthAfterYear: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showMonthAfterYear</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showMonthAfterYear = $( ".selector" ).datepicker( "option", "showMonthAfterYear" ); +//setter +$( ".selector" ).datepicker( "option", "showMonthAfterYear", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOn"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOn">showOn</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'focus'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Have the datepicker appear automatically when the field receives focus ('focus'), appear only when a button is clicked ('button'), or appear when either event takes place ('both').</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOn</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOn: 'both' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOn</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOn = $( ".selector" ).datepicker( "option", "showOn" ); +//setter +$( ".selector" ).datepicker( "option", "showOn", 'both' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOptions"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOptions">showOptions</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Options</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">{}</dd> + + </dl> + </div> + <div class="option-description"> + <p>If using one of the jQuery UI effects for <code><a href="http://docs.jquery.com/UI/Datepicker#option-showAnim" title="UI/Datepicker">showAnim</a></code>, you can provide additional settings for that animation via this option.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOptions</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOptions: {direction: 'up' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOptions</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOptions = $( ".selector" ).datepicker( "option", "showOptions" ); +//setter +$( ".selector" ).datepicker( "option", "showOptions", {direction: 'up' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOtherMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOtherMonths">showOtherMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use <code><a href="http://docs.jquery.com/UI/Datepicker#option-selectOtherMonths" title="UI/Datepicker">selectOtherMonths</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOtherMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOtherMonths: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOtherMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOtherMonths = $( ".selector" ).datepicker( "option", "showOtherMonths" ); +//setter +$( ".selector" ).datepicker( "option", "showOtherMonths", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showWeek"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showWeek">showWeek</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true a column is added to show the week of the year. The <code><a href="http://docs.jquery.com/UI/Datepicker#option-calculateWeek" title="UI/Datepicker">calculateWeek</a></code> option determines how the week of the year is calculated. You may also want to change the <code><a href="http://docs.jquery.com/UI/Datepicker#option-firstDay" title="UI/Datepicker">firstDay</a></code> option.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showWeek</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showWeek: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showWeek</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showWeek = $( ".selector" ).datepicker( "option", "showWeek" ); +//setter +$( ".selector" ).datepicker( "option", "showWeek", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-stepMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-stepMonths">stepMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set how many months to move when clicking the Previous/Next links.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>stepMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ stepMonths: 3 });</code></pre> +</dd> + + +<dt> + Get or set the <code>stepMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var stepMonths = $( ".selector" ).datepicker( "option", "stepMonths" ); +//setter +$( ".selector" ).datepicker( "option", "stepMonths", 3 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-weekHeader"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-weekHeader">weekHeader</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Wk'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the week of the year column heading. This attribute is one of the regionalisation attributes. Use <code><a href="http://docs.jquery.com/UI/Datepicker#option-showWeek" title="UI/Datepicker">showWeek</a></code> to display this column.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>weekHeader</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ weekHeader: 'W' });</code></pre> +</dd> + + +<dt> + Get or set the <code>weekHeader</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var weekHeader = $( ".selector" ).datepicker( "option", "weekHeader" ); +//setter +$( ".selector" ).datepicker( "option", "weekHeader", 'W' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-yearRange"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-yearRange">yearRange</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'c-10:c+10'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Control the range of years displayed in the year drop-down: either relative to today's year (-nn:+nn), relative to the currently selected year (c-nn:c+nn), absolute (nnnn:nnnn), or combinations of these formats (nnnn:-nn). Note that this option only affects what appears in the drop-down, to restrict which dates may be selected use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-minDate" title="UI/Datepicker">minDate</a></code> and/or <code><a href="http://docs.jquery.com/UI/Datepicker#option-maxDate" title="UI/Datepicker">maxDate</a></code> options.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>yearRange</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ yearRange: '2000:2010' });</code></pre> +</dd> + + +<dt> + Get or set the <code>yearRange</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var yearRange = $( ".selector" ).datepicker( "option", "yearRange" ); +//setter +$( ".selector" ).datepicker( "option", "yearRange", '2000:2010' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-yearSuffix"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-yearSuffix">yearSuffix</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>Additional text to display after the year in the month headers. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>yearSuffix</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ yearSuffix: 'CE' });</code></pre> +</dd> + + +<dt> + Get or set the <code>yearSuffix</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var yearSuffix = $( ".selector" ).datepicker( "option", "yearSuffix" ); +//setter +$( ".selector" ).datepicker( "option", "yearSuffix", 'CE' );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-create"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-create">create</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">datepickercreate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when datepicker is created.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>create</code> event as an init option. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ + create: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>create</code> event by type: <code>datepickercreate</code>. +</dt> +<dd> +<pre><code>$( ".selector" ).bind( "datepickercreate", function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-beforeShow"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeShow">beforeShow</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(input, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Can be a function that takes an input field and current datepicker instance and returns an options object to update the datepicker with. It is called just before the datepicker is displayed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeShow</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + beforeShow: function(input, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-beforeShowDay"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeShowDay">beforeShowDay</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(date)</dd> + </dl> + </div> + <div class="event-description"> + <p>The function takes a date as a parameter and must return an array with [0] equal to true/false indicating whether or not this date is selectable, [1] equal to a CSS class name(s) or '' for the default presentation, and [2] an optional popup tooltip for this date. It is called for each day in the datepicker before it is displayed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeShowDay</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + beforeShowDay: function(date) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onChangeMonthYear"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onChangeMonthYear">onChangeMonthYear</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(year, month, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker moves to a new month and/or year. The function receives the selected year, month (1-12), and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onChangeMonthYear</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onChangeMonthYear: function(year, month, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onClose"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onClose">onClose</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(dateText, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker is closed, whether or not a date is selected. The function receives the selected date as text ('' if none) and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onClose</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onClose: function(dateText, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onSelect"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onSelect">onSelect</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(dateText, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker is selected. The function receives the selected date as text and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onSelect</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onSelect: function(dateText, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the datepicker functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the datepicker.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the datepicker.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any datepicker option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple datepicker options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-datepicker element.</p> + </div> +</li> + + +<li class="method" id="method-dialog"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-dialog">dialog</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "dialog" + +, date + +, <span class="optional">[</span>onSelect<span class="optional">] </span> + +, <span class="optional">[</span>settings<span class="optional">] </span> + +, <span class="optional">[</span>pos<span class="optional">] </span>)</dd> + </dl> + </div> + <div class="method-description"> + <p>Open a datepicker in a "dialog" box. +</p><p>dateText: the initial date for the date picker as either a Date or a string in the current date format. +</p><p>onSelect: A callback function when a date is selected. The function receives the date text and date picker instance as parameters. +</p><p>settings: The new settings for the date picker. +</p><p>pos: The position of the top/left of the dialog as [x, y] or a MouseEvent that contains the coordinates. If not specified the dialog is centered on the screen.</p> + </div> +</li> + + +<li class="method" id="method-isDisabled"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-isDisabled">isDisabled</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "isDisabled" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Determine whether a date picker has been disabled.</p> + </div> +</li> + + +<li class="method" id="method-hide"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-hide">hide</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "hide" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Close a previously opened date picker.</p> + </div> +</li> + + +<li class="method" id="method-show"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-show">show</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "show" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Call up a previously attached date picker.</p> + </div> +</li> + + +<li class="method" id="method-refresh"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-refresh">refresh</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "refresh" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Redraw a date picker, after having made some external modifications.</p> + </div> +</li> + + +<li class="method" id="method-getDate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-getDate">getDate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "getDate" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the current date for the datepicker or null if no date has been selected.</p> + </div> +</li> + + +<li class="method" id="method-setDate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-setDate">setDate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "setDate" + +, date + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Sets the current date for the datepicker. The new date may be a Date object or a string in the current <a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">date format</a> (e.g. '01/26/2009'), a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null to clear the selected date.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Datepicker plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.datepicker.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + <div id="ui-datepicker-div" class="<strong>ui-datepicker</strong> ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"><br /> + <div class="<strong>ui-datepicker-header</strong> ui-widget-header ui-helper-clearfix ui-corner-all"><br /> + <a class="<strong>ui-datepicker-prev</strong> ui-corner-all">title="Prev"><span class="ui-icon ui-icon-circle-triangle-w">Prev</span></a><br /> + <a class="<strong>ui-datepicker-next</strong> ui-corner-all" title="Next"><span class="ui-icon ui-icon-circle-triangle-e">Next</span></a><br /> + <div class="<strong>ui-datepicker-title</strong>"><br /> + <span class="<strong>ui-datepicker-month</strong>">January</span><span class="<strong>ui-datepicker-year</strong>">2009</span><br /> + </div><br /> + </div><br /> + <table class="<strong>ui-datepicker-calendar</strong>"><br /> + <thead><br /> + <tr><br /> + <th class="<strong>ui-datepicker-week-end</strong>"><span title="Sunday">Su</span></th><br /> + ...<br /> + </tr><br /> + </thead><br /> + <tbody><tr><br /> + <td class="<strong>ui-datepicker-week-end ui-datepicker-other-month</strong> "> 1 </td><br /> + ...<br /> + </tr><br /> + </tbody><br /> + </table><br /> + <div class="<strong>ui-datepicker-buttonpane</strong> ui-widget-content"><br /> + <button type="button" class="<strong>ui-datepicker-current</strong> ui-state-default ui-priority-secondary ui-corner-all">Today</button><br /> + <button type="button" class="<strong>ui-datepicker-close</strong> ui-state-default ui-priority-primary ui-corner-all">Done</button><br /> + </div><br /> +</div><br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the datepicker plugin, not markup you should use to create a datepicker. The only markup needed for that is <input type="text" /> or <div></div>. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 98753 bytes +Post-expand include size: 196022 bytes +Template argument size: 121356 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3774-1!1!0!!en!2 and timestamp 20110512144613 --> diff --git a/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.bgiframe-2.1.2.js b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.bgiframe-2.1.2.js new file mode 100644 index 0000000..5cd38bb --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.bgiframe-2.1.2.js @@ -0,0 +1,39 @@ +/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * + * Version 2.1.2 + */ + +(function($){ + +$.fn.bgiframe = ($.browser.msie && /msie 6\.0/i.test(navigator.userAgent) ? function(s) { + s = $.extend({ + top : 'auto', // auto == .currentStyle.borderTopWidth + left : 'auto', // auto == .currentStyle.borderLeftWidth + width : 'auto', // auto == offsetWidth + height : 'auto', // auto == offsetHeight + opacity : true, + src : 'javascript:false;' + }, s); + var html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+ + 'style="display:block;position:absolute;z-index:-1;'+ + (s.opacity !== false?'filter:Alpha(Opacity=\'0\');':'')+ + 'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+ + 'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+ + 'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+ + 'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+ + '"/>'; + return this.each(function() { + if ( $(this).children('iframe.bgiframe').length === 0 ) + this.insertBefore( document.createElement(html), this.firstChild ); + }); +} : function() { return this; }); + +// old alias +$.fn.bgIframe = $.fn.bgiframe; + +function prop(n) { + return n && n.constructor === Number ? n + 'px' : n; +} + +})(jQuery);
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.cookie.js b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.cookie.js new file mode 100644 index 0000000..7b3e701 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.cookie.js @@ -0,0 +1,89 @@ +/*jslint browser: true */ /*global jQuery: true */ + +/** + * jQuery Cookie plugin + * + * Copyright (c) 2010 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +// TODO JsDoc + +/** + * Create a cookie with the given key and value and other optional parameters. + * + * @example $.cookie('the_cookie', 'the_value'); + * @desc Set the value of a cookie. + * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); + * @desc Create a cookie with all available options. + * @example $.cookie('the_cookie', 'the_value'); + * @desc Create a session cookie. + * @example $.cookie('the_cookie', null); + * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain + * used when the cookie was set. + * + * @param String key The key of the cookie. + * @param String value The value of the cookie. + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. + * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. + * If set to null or omitted, the cookie will be a session cookie and will not be retained + * when the the browser exits. + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will + * require a secure protocol (like HTTPS). + * @type undefined + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ + +/** + * Get the value of a cookie with the given key. + * + * @example $.cookie('the_cookie'); + * @desc Get the value of a cookie. + * + * @param String key The key of the cookie. + * @return The value of the cookie. + * @type String + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ +jQuery.cookie = function (key, value, options) { + + // key and value given, set cookie... + if (arguments.length > 1 && (value === null || typeof value !== "object")) { + options = jQuery.extend({}, options); + + if (value === null) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + return (document.cookie = [ + encodeURIComponent(key), '=', + options.raw ? String(value) : encodeURIComponent(String(value)), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // key and possibly options given, get cookie... + options = value || {}; + var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; + return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; +}; diff --git a/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.metadata.js b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.metadata.js new file mode 100644 index 0000000..ad8bfba --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/external/jquery.metadata.js @@ -0,0 +1,122 @@ +/* + * Metadata - jQuery plugin for parsing metadata from elements + * + * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $ + * + */ + +/** + * Sets the type of metadata to use. Metadata is encoded in JSON, and each property + * in the JSON will become a property of the element itself. + * + * There are three supported types of metadata storage: + * + * attr: Inside an attribute. The name parameter indicates *which* attribute. + * + * class: Inside the class attribute, wrapped in curly braces: { } + * + * elem: Inside a child element (e.g. a script tag). The + * name parameter indicates *which* element. + * + * The metadata for an element is loaded the first time the element is accessed via jQuery. + * + * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements + * matched by expr, then redefine the metadata type and run another $(expr) for other elements. + * + * @name $.metadata.setType + * + * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("class") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from the class attribute + * + * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("attr", "data") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a "data" attribute + * + * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p> + * @before $.metadata.setType("elem", "script") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a nested script element + * + * @param String type The encoding type + * @param String name The name of the attribute to be used to get metadata (optional) + * @cat Plugins/Metadata + * @descr Sets the type of encoding to be used when loading metadata for the first time + * @type undefined + * @see metadata() + */ + +(function($) { + +$.extend({ + metadata : { + defaults : { + type: 'class', + name: 'metadata', + cre: /({.*})/, + single: 'metadata' + }, + setType: function( type, name ){ + this.defaults.type = type; + this.defaults.name = name; + }, + get: function( elem, opts ){ + var settings = $.extend({},this.defaults,opts); + // check for empty string in single property + if ( !settings.single.length ) settings.single = 'metadata'; + + var data = $.data(elem, settings.single); + // returned cached data if it already exists + if ( data ) return data; + + data = "{}"; + + if ( settings.type == "class" ) { + var m = settings.cre.exec( elem.className ); + if ( m ) + data = m[1]; + } else if ( settings.type == "elem" ) { + if( !elem.getElementsByTagName ) + return undefined; + var e = elem.getElementsByTagName(settings.name); + if ( e.length ) + data = $.trim(e[0].innerHTML); + } else if ( elem.getAttribute != undefined ) { + var attr = elem.getAttribute( settings.name ); + if ( attr ) + data = attr; + } + + if ( data.indexOf( '{' ) <0 ) + data = "{" + data + "}"; + + data = eval("(" + data + ")"); + + $.data( elem, settings.single, data ); + return data; + } + } +}); + +/** + * Returns the metadata object for the first member of the jQuery object. + * + * @name metadata + * @descr Returns element's metadata object + * @param Object opts An object contianing settings to override the defaults + * @type jQuery + * @cat Plugins/Metadata + */ +$.fn.metadata = function( opts ){ + return $.metadata.get( this[0], opts ); +}; + +})(jQuery);
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.css b/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.css new file mode 100644 index 0000000..a4daa27 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.css @@ -0,0 +1,153 @@ +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; +} + +#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-tests li ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult { + margin: 0; + padding: 0; +} + + +/** Header */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; + + color: #fff; + text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; + background-color: #0d3349; + + border-radius: 15px 15px 0 0; + -moz-border-radius: 15px 15px 0 0; + -webkit-border-top-right-radius: 15px; + -webkit-border-top-left-radius: 15px; +} + +#qunit-header a { + text-decoration: none; + color: white; +} + +#qunit-banner { + height: 5px; +} + +#qunit-testrunner-toolbar { + padding: 0em 0 0.5em 2em; +} + +#qunit-userAgent { + padding: 0.5em 0 0.5em 2.5em; + background-color: #2b81af; + color: #fff; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 0.5em 0.4em 2.5em; + border-bottom: 1px solid #fff; + list-style-position: inside; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests li ol { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #fff; + + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; +} + +#qunit-tests li li { + margin: 0.5em; + padding: 0.4em 0.5em 0.4em 0.5em; + background-color: #fff; + border-bottom: none; + list-style-position: inside; +} + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #5E740B; + background-color: #fff; + border-left: 26px solid #C6E746; +} + +#qunit-tests li.pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests li.pass span.test-name { color: #366097; } + +#qunit-tests li li.pass span.test-actual, +#qunit-tests li li.pass span.test-expected { color: #999999; } + +strong b.pass { color: #5E740B; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #fff; + border-left: 26px solid #EE5757; +} + +#qunit-tests li.fail { color: #000000; background-color: #EE5757; } +#qunit-tests li.fail span.test-name, +#qunit-tests li.fail span.module-name { color: #000000; } + +#qunit-tests li li.fail span.test-actual { color: #EE5757; } +#qunit-tests li li.fail span.test-expected { color: green; } + +strong b.fail { color: #710909; } + +#qunit-banner.qunit-fail, +#qunit-testrunner-toolbar { background-color: #EE5757; } + + +/** Footer */ + +#qunit-testresult { + padding: 0.5em 0.5em 0.5em 2.5em; + + color: #2b81af; + background-color: #D2E0E6; + + border-radius: 0 0 15px 15px; + -moz-border-radius: 0 0 15px 15px; + -webkit-border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; +} diff --git a/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.js b/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.js new file mode 100644 index 0000000..45ad1dc --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/external/qunit.js @@ -0,0 +1,1261 @@ +/* + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2009 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var QUnit = { + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + + synchronize(function() { + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + config.currentModule = name; + config.moduleTestEnvironment = testEnvironment; + config.moduleStats = { all: 0, bad: 0 }; + + QUnit.moduleStart( name, testEnvironment ); + }); + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = '<span class="test-name">' + testName + '</span>', testEnvironment, testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = '<span class="module-name">' + config.currentModule + "</span>: " + name; + } + + if ( !validTest(config.currentModule + ": " + testName) ) { + return; + } + + synchronize(function() { + + testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, config.moduleTestEnvironment); + if (testEnvironmentArg) { + extend(testEnvironment,testEnvironmentArg); + } + + QUnit.testStart( testName, testEnvironment ); + + // allow utility functions to access the current test environment + QUnit.current_testEnvironment = testEnvironment; + + config.assertions = []; + config.expected = expected; + + var tests = id("qunit-tests"); + if (tests) { + var b = document.createElement("strong"); + b.innerHTML = "Running " + name; + var li = document.createElement("li"); + li.appendChild( b ); + li.id = "current-test-output"; + tests.appendChild( li ) + } + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + testEnvironment.setup.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); + } + }); + + synchronize(function() { + if ( async ) { + QUnit.stop(); + } + + try { + callback.call(testEnvironment); + } catch(e) { + fail("Test " + name + " died, exception and test follows", e, callback); + QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }); + + synchronize(function() { + try { + checkPollution(); + testEnvironment.teardown.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); + } + }); + + synchronize(function() { + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); + } + + if ( config.expected && config.expected != config.assertions.length ) { + QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += config.assertions.length; + config.moduleStats.all += config.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + + for ( var i = 0; i < config.assertions.length; i++ ) { + var assertion = config.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.innerHTML = assertion.message || "(no message)"; + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + if (bad == 0) { + ol.style.display = "none"; + } + + var b = document.createElement("strong"); + b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + config.assertions.length + ")</b>"; + + addEvent(b, "click", function() { + var next = b.nextSibling, display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) { + target = target.parentNode; + } + if ( window.location && target.nodeName.toLowerCase() === "strong" ) { + window.location.search = "?" + encodeURIComponent(getText([target]).replace(/\(.+\)$/, "").replace(/(^\s*|\s*$)/g, "")); + } + }); + + var li = id("current-test-output"); + li.id = ""; + li.className = bad ? "fail" : "pass"; + li.removeChild( li.firstChild ); + li.appendChild( b ); + li.appendChild( ol ); + + if ( bad ) { + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "block"; + id("qunit-filter-pass").disabled = null; + id("qunit-filter-missing").disabled = null; + } + } + + } else { + for ( var i = 0; i < config.assertions.length; i++ ) { + if ( !config.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + QUnit.testDone( testName, bad, config.assertions.length ); + + if ( !window.setTimeout && !config.queue.length ) { + done(); + } + }); + + synchronize( done ); + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + msg = escapeHtml(msg); + QUnit.log(a, msg); + + config.assertions.push({ + result: !!a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + push(expected != actual, actual, expected, message); + }, + + deepEqual: function(actual, expected, message) { + push(QUnit.equiv(actual, expected), actual, expected, message); + }, + + notDeepEqual: function(actual, expected, message) { + push(!QUnit.equiv(actual, expected), actual, expected, message); + }, + + strictEqual: function(actual, expected, message) { + push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + push(expected !== actual, actual, expected, message); + }, + + raises: function(fn, message) { + try { + fn(); + ok( false, message ); + } + catch (e) { + ok( true, message ); + } + }, + + start: function() { + // A slight delay, to avoid any current callbacks + if ( window.setTimeout ) { + window.setTimeout(function() { + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.blocking = true; + + if ( timeout && window.setTimeout ) { + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + } + +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + GETParams = location.search.slice(1).split('&'); + + for ( var i = 0; i < GETParams.length; i++ ) { + GETParams[i] = decodeURIComponent( GETParams[i] ); + if ( GETParams[i] === "noglobals" ) { + GETParams.splice( i, 1 ); + i--; + config.noglobals = true; + } else if ( GETParams[i].search('=') > -1 ) { + GETParams.splice( i, 1 ); + i--; + } + } + + // restrict modules/tests by get parameters + config.filters = GETParams; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +// define these after exposing globals to keep them in these QUnit namespace only +extend(QUnit, { + config: config, + + // Initialize the configuration options + init: function() { + extend(config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + updateRate: 1000, + blocking: false, + autostart: true, + autorun: false, + assertions: [], + filters: [], + queue: [] + }); + + var tests = id("qunit-tests"), + banner = id("qunit-banner"), + result = id("qunit-testresult"); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + */ + reset: function() { + if ( window.jQuery ) { + jQuery("#main, #qunit-fixture").html( config.fixture ); + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return QUnit.objectType( obj ) == type; + }, + + objectType: function( obj ) { + if (typeof obj === "undefined") { + return "undefined"; + + // consider: typeof null === object + } + if (obj === null) { + return "null"; + } + + var type = Object.prototype.toString.call( obj ) + .match(/^\[object\s(.*)\]$/)[1] || ''; + + switch (type) { + case 'Number': + if (isNaN(obj)) { + return "nan"; + } else { + return "number"; + } + case 'String': + case 'Boolean': + case 'Array': + case 'Date': + case 'RegExp': + case 'Function': + return type.toLowerCase(); + } + if (typeof obj === "object") { + return "object"; + } + return undefined; + }, + + // Logging callbacks + begin: function() {}, + done: function(failures, total) {}, + log: function(result, message) {}, + testStart: function(name, testEnvironment) {}, + testDone: function(name, failures, total) {}, + moduleStart: function(name, testEnvironment) {}, + moduleDone: function(name, failures, total) {} +}); + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +addEvent(window, "load", function() { + QUnit.begin(); + + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + var banner = id("qunit-header"); + if ( banner ) { + banner.innerHTML = '<a href="' + location.href + '">' + banner.innerHTML + '</a>'; + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "none"; + + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + filter.disabled = true; + addEvent( filter, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("pass") > -1 ) { + li[i].style.display = filter.checked ? "none" : ""; + } + } + }); + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + + var missing = document.createElement("input"); + missing.type = "checkbox"; + missing.id = "qunit-filter-missing"; + missing.disabled = true; + addEvent( missing, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { + li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; + } + } + }); + toolbar.appendChild( missing ); + + label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-missing"); + label.innerHTML = "Hide missing tests (untested code is broken code)"; + toolbar.appendChild( label ); + } + + var main = id('main') || id('qunit-fixture'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if (config.autostart) { + QUnit.start(); + } +}); + +function done() { + if ( config.doneTimer && window.clearTimeout ) { + window.clearTimeout( config.doneTimer ); + config.doneTimer = null; + } + + if ( config.queue.length ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + + return; + } + + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + html = ['Tests completed in ', + +new Date - config.started, ' milliseconds.<br/>', + '<span class="passed">', config.stats.all - config.stats.bad, '</span> tests of <span class="total">', config.stats.all, '</span> passed, <span class="failed">', config.stats.bad,'</span> failed.'].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + var result = id("qunit-testresult"); + + if ( !result ) { + result = document.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests.nextSibling ); + } + + result.innerHTML = html; + } + + QUnit.done( config.stats.bad, config.stats.all ); +} + +function validTest( name ) { + var i = config.filters.length, + run = false; + + if ( !i ) { + return true; + } + + while ( i-- ) { + var filter = config.filters[i], + not = filter.charAt(0) == '!'; + + if ( not ) { + filter = filter.slice(1); + } + + if ( name.indexOf(filter) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + } + + return run; +} + +function escapeHtml(s) { + s = s === null ? "" : s + ""; + return s.replace(/[\&"<>\\]/g, function(s) { + switch(s) { + case "&": return "&"; + case "\\": return "\\\\"; + case '"': return '\"'; + case "<": return "<"; + case ">": return ">"; + default: return s; + } + }); +} + +function push(result, actual, expected, message) { + message = escapeHtml(message) || (result ? "okay" : "failed"); + message = '<span class="test-message">' + message + "</span>"; + expected = escapeHtml(QUnit.jsDump.parse(expected)); + actual = escapeHtml(QUnit.jsDump.parse(actual)); + var output = message + ', expected: <span class="test-expected">' + expected + '</span>'; + if (actual != expected) { + output += ' result: <span class="test-actual">' + actual + '</span>, diff: ' + QUnit.diff(expected, actual); + } + + // can't use ok, as that would double-escape messages + QUnit.log(result, output); + config.assertions.push({ + result: !!result, + message: output + }); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + var start = (new Date()).getTime(); + + while ( config.queue.length && !config.blocking ) { + if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) { + config.queue.shift()(); + + } else { + setTimeout( process, 13 ); + break; + } + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( old, config.pollution ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + config.expected++; + } + + var deletedGlobals = diff( config.pollution, old ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + config.expected++; + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + a[prop] = b[prop]; + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé <prathe@gmail.com> +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + var parents = []; // stack to avoiding loops from circular referencing + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = QUnit.objectType(o); + if (prop) { + if (QUnit.objectType(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function (b) { + return isNaN(b); + }, + + "date": function (b, a) { + return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function (b, a) { + return QUnit.objectType(b) === "regexp" && + a.source === b.source && // the regex itself + a.global === b.global && // and its modifers (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function () { + var caller = callers[callers.length - 1]; + return caller !== Object && + typeof caller !== "undefined"; + }, + + "array": function (b, a) { + var i, j, loop; + var len; + + // b could be an object literal here + if ( ! (QUnit.objectType(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + + //track reference to avoid circular references + parents.push(a); + for (i = 0; i < len; i++) { + loop = false; + for(j=0;j<parents.length;j++){ + if(parents[j] === a[i]){ + loop = true;//dont rewalk array + } + } + if (!loop && ! innerEquiv(a[i], b[i])) { + parents.pop(); + return false; + } + } + parents.pop(); + return true; + }, + + "object": function (b, a) { + var i, j, loop; + var eq = true; // unless we can proove it + var aProperties = [], bProperties = []; // collection of strings + + // comparing constructors is more strict than using instanceof + if ( a.constructor !== b.constructor) { + return false; + } + + // stack constructor before traversing properties + callers.push(a.constructor); + //track reference to avoid circular references + parents.push(a); + + for (i in a) { // be strict: don't ensures hasOwnProperty and go deep + loop = false; + for(j=0;j<parents.length;j++){ + if(parents[j] === a[i]) + loop = true; //don't go down the same path twice + } + aProperties.push(i); // collect a's properties + + if (!loop && ! innerEquiv(a[i], b[i])) { + eq = false; + break; + } + } + + callers.pop(); // unstack, we are done + parents.pop(); + + for (i in b) { + bProperties.push(i); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + } + }; + }(); + + innerEquiv = function () { // can take multiple arguments + var args = Array.prototype.slice.apply(arguments); + if (args.length < 2) { + return true; // end transition + } + + return (function (a, b) { + if (a === b) { + return true; // catch the most you can + } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || QUnit.objectType(a) !== QUnit.objectType(b)) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [b, a]); + } + + // apply transition with (1..n) arguments + })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); + }; + + return innerEquiv; + +}(); + +/** + * jsDump + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) + * Date: 5/15/2008 + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace(/"/g, '\\"') + '"'; + }; + function literal( o ) { + return o + ''; + }; + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) + arr = arr.join( ',' + s + inner ); + if ( !arr ) + return pre + post; + return [ pre, inner + arr, base + post ].join(s); + }; + function array( arr ) { + var i = arr.length, ret = Array(i); + this.up(); + while ( i-- ) + ret[i] = this.parse( arr[i] ); + this.down(); + return join( '[', ret, ']' ); + }; + + var reName = /^function (\w+)/; + + var jsDump = { + parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance + var parser = this.parsers[ type || this.typeOf(obj) ]; + type = typeof parser; + + return type == 'function' ? parser.call( this, obj ) : + type == 'string' ? parser : + this.parsers.error; + }, + typeOf:function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (QUnit.is("RegExp", obj)) { + type = "regexp"; + } else if (QUnit.is("Date", obj)) { + type = "date"; + } else if (QUnit.is("Function", obj)) { + type = "function"; + } else if (obj.setInterval && obj.document && !obj.nodeType) { + type = "window"; + } else if (obj.nodeType === 9) { + type = "document"; + } else if (obj.nodeType) { + type = "node"; + } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) { + type = "array"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, this.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map ) { + var ret = [ ]; + this.up(); + for ( var key in map ) + ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); + this.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = this.HTML ? '<' : '<', + close = this.HTML ? '>' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in this.DOMAttrs ) { + var val = node[this.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + this.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:false //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +// from Sizzle.js +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +}; + +/* + * Javascript Diff Algorithm + * By John Resig (http://ejohn.org/) + * Modified by Chu Alan "sprite" + * + * Released under the MIT license. + * + * More Info: + * http://ejohn.org/projects/javascript-diff-algorithm/ + * + * Usage: QUnit.diff(expected, actual) + * + * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over" + */ +QUnit.diff = (function() { + function diff(o, n){ + var ns = new Object(); + var os = new Object(); + + for (var i = 0; i < n.length; i++) { + if (ns[n[i]] == null) + ns[n[i]] = { + rows: new Array(), + o: null + }; + ns[n[i]].rows.push(i); + } + + for (var i = 0; i < o.length; i++) { + if (os[o[i]] == null) + os[o[i]] = { + rows: new Array(), + n: null + }; + os[o[i]].rows.push(i); + } + + for (var i in ns) { + if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) { + n[ns[i].rows[0]] = { + text: n[ns[i].rows[0]], + row: os[i].rows[0] + }; + o[os[i].rows[0]] = { + text: o[os[i].rows[0]], + row: ns[i].rows[0] + }; + } + } + + for (var i = 0; i < n.length - 1; i++) { + if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && + n[i + 1] == o[n[i].row + 1]) { + n[i + 1] = { + text: n[i + 1], + row: n[i].row + 1 + }; + o[n[i].row + 1] = { + text: o[n[i].row + 1], + row: i + 1 + }; + } + } + + for (var i = n.length - 1; i > 0; i--) { + if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null && + n[i - 1] == o[n[i].row - 1]) { + n[i - 1] = { + text: n[i - 1], + row: n[i].row - 1 + }; + o[n[i].row - 1] = { + text: o[n[i].row - 1], + row: i - 1 + }; + } + } + + return { + o: o, + n: n + }; + } + + return function(o, n){ + o = o.replace(/\s+$/, ''); + n = n.replace(/\s+$/, ''); + var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/)); + + var str = ""; + + var oSpace = o.match(/\s+/g); + if (oSpace == null) { + oSpace = [" "]; + } + else { + oSpace.push(" "); + } + var nSpace = n.match(/\s+/g); + if (nSpace == null) { + nSpace = [" "]; + } + else { + nSpace.push(" "); + } + + if (out.n.length == 0) { + for (var i = 0; i < out.o.length; i++) { + str += '<del>' + out.o[i] + oSpace[i] + "</del>"; + } + } + else { + if (out.n[0].text == null) { + for (n = 0; n < out.o.length && out.o[n].text == null; n++) { + str += '<del>' + out.o[n] + oSpace[n] + "</del>"; + } + } + + for (var i = 0; i < out.n.length; i++) { + if (out.n[i].text == null) { + str += '<ins>' + out.n[i] + nSpace[i] + "</ins>"; + } + else { + var pre = ""; + + for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) { + pre += '<del>' + out.o[n] + oSpace[n] + "</del>"; + } + str += " " + out.n[i].text + nSpace[i] + pre; + } + } + } + + return str; + } +})(); + +})(this); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/jquery-1.5.1.js b/frontend/static/other_rooms/datepicker/development-bundle/jquery-1.5.1.js new file mode 100644 index 0000000..78fcfa4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/jquery-1.5.1.js @@ -0,0 +1,8316 @@ +/*! + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The deferred used on DOM ready + readyList, + + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.5.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + // A third-party is pushing the ready event forwards + if ( wait === true ) { + jQuery.readyWait--; + } + + // Make sure that the DOM is not already loaded + if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); + + if ( jQuery.support.scriptEval() ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( object ) { + var lastIndex = arguments.length, + deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? + object : + jQuery.Deferred(), + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } + } else if ( deferred !== object ) { + deferred.resolve( object ); + } + return promise; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySubclass( selector, context ) { + return new jQuerySubclass.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySubclass, this ); + jQuerySubclass.superclass = this; + jQuerySubclass.fn = jQuerySubclass.prototype = this(); + jQuerySubclass.fn.constructor = jQuerySubclass; + jQuerySubclass.subclass = this.subclass; + jQuerySubclass.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { + context = jQuerySubclass(context); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); + }; + jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; + var rootjQuerySubclass = jQuerySubclass(document); + return jQuerySubclass; + }, + + browser: {} +}); + +// Create readyList deferred +readyList = jQuery._Deferred(); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +(function() { + + jQuery.support = {}; + + var div = document.createElement("div"); + + div.style.display = "none"; + div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0], + select = document.createElement("select"), + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: input.value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Will be defined later + deleteExpando: true, + optDisabled: false, + checkClone: false, + noCloneEvent: true, + noCloneChecked: true, + boxModel: null, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableHiddenOffsets: true + }; + + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as diabled) + select.disabled = true; + jQuery.support.optDisabled = !opt.disabled; + + var _scriptEval = null; + jQuery.support.scriptEval = function() { + if ( _scriptEval === null ) { + var root = document.documentElement, + script = document.createElement("script"), + id = "script" + jQuery.now(); + + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + _scriptEval = true; + delete window[ id ]; + } else { + _scriptEval = false; + } + + root.removeChild( script ); + // release memory in IE + root = script = id = null; + } + + return _scriptEval; + }; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>"; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"), + body = document.getElementsByTagName("body")[0]; + + // Frameset documents with no body should not run this code + if ( !body ) { + return; + } + + div.style.width = div.style.paddingLeft = "1px"; + body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "<div style='width:4px;'></div>"; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; + } + + div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; + var tds = div.getElementsByTagName("td"); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; + div.innerHTML = ""; + + body.removeChild( div ).style.display = "none"; + div = tds = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( !el.attachEvent ) { + return true; + } + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + div = all = a = null; +})(); + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = name.substr( 5 ); + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + data = elem.getAttribute( "data-" + key ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspaces = /\s+/, + rreturn = /\r/g, + rspecialurl = /^(?:href|src|style)$/, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rradiocheck = /^(?:radio|checkbox)$/i; + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspaces ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( !arguments.length ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray(val) ) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + // 'in' checks fail in Blackberry 4.7 #6931 + if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + if ( value === null ) { + if ( elem.nodeType === 1 ) { + elem.removeAttribute( name ); + } + + } else { + elem[ name ] = value; + } + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + // Ensure that missing attributes return undefined + // Blackberry 4.7 returns "" from getAttribute #6938 + if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { + return undefined; + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + // Handle everything which isn't a DOM element node + if ( set ) { + elem[ name ] = value; + } + return elem[ name ]; + } +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspace = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + } + catch ( e ) {} + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + // XXX This code smells terrible. event.js should not be directly + // inspecting the data cache + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery._data( elem, "handle" ); + + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + event.preventDefault(); + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (inlineError) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var old, + target = event.target, + targetType = type.replace( rnamespaces, "" ), + isClick = jQuery.nodeName( target, "a" ) && targetType === "click", + special = jQuery.event.special[ targetType ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ targetType ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + targetType ]; + + if ( old ) { + target[ "on" + targetType ] = null; + } + + jQuery.event.triggered = true; + target[ targetType ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (triggerError) {} + + if ( old ) { + target[ "on" + targetType ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace_re, events, + namespace_sort = [], + args = jQuery.makeArray( arguments ); + + event = args[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.namespace = event.namespace || namespace_sort.join("."); + + events = jQuery._data(this, "events"); + + handlers = (events || {})[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, + body = document.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) || data === false ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === elem.getAttribute( 'type' ); + }, + radio: function( elem ) { + return "radio" === elem.type; + }, + + checkbox: function( elem ) { + return "checkbox" === elem.type; + }, + + file: function( elem ) { + return "file" === elem.type; + }, + password: function( elem ) { + return "password" === elem.type; + }, + + submit: function( elem ) { + return "submit" === elem.type; + }, + + image: function( elem ) { + return "image" === elem.type; + }, + + reset: function( elem ) { + return "reset" === elem.type; + }, + + button: function( elem ) { + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + if ( matches ) { + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + return matches.call( node, expr ); + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), + length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + var pos = POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique(ret) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnocache = /<(?:script|object|embed|option|style)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( text ) { + if ( jQuery.isFunction(text) ) { + return this.each(function(i) { + var self = jQuery( this ); + + self.text( text.call(this, i, self.text()) ); + }); + } + + if ( typeof text !== "object" && text !== undefined ) { + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + } + + return jQuery.text( this ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + return this.each(function() { + jQuery( this ).wrapAll( html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery(arguments[0]); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery(arguments[0]).toArray() ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + if ( value === undefined ) { + return this[0] && this[0].nodeType === 1 ? + this[0].innerHTML.replace(rinlinejQuery, "") : + null; + + // See if we can take a shortcut and just use innerHTML + } else if ( typeof value === "string" && !rnocache.test( value ) && + (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && + !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { + + value = value.replace(rxhtmlTag, "<$1></$2>"); + + try { + for ( var i = 0, l = this.length; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + if ( this[i].nodeType === 1 ) { + jQuery.cleanData( this[i].getElementsByTagName("*") ); + this[i].innerHTML = value; + } + } + + // If using innerHTML throws an exception, use the fallback method + } catch(e) { + this.empty().append( value ); + } + + } else if ( jQuery.isFunction( value ) ) { + this.each(function(i){ + var self = jQuery( this ); + + self.html( value.call(this, i, self.html()) ); + }); + + } else { + this.empty().append( value ); + } + + return this; + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, fragment, parent, + value = args[0], + scripts = []; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = jQuery.buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || (l > 1 && i < lastIndex) ? + jQuery.clone( fragment, true, true ) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, evalScript ); + } + } + + return this; + } +}); + +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var internalKey = jQuery.expando, + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); + + // Switch to use the internal data object, if it exists, for the next + // stage of data copying + if ( (oldData = oldData[ internalKey ]) ) { + var events = oldData.events; + curData = curData[ internalKey ] = jQuery.extend({}, oldData); + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( var type in events ) { + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); + } + } + } + } +} + +function cloneFixAttributes(src, dest) { + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + var nodeName = dest.nodeName.toLowerCase(); + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + dest.clearAttributes(); + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + dest.mergeAttributes(src); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, + doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + + cacheable = true; + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults ) { + if ( cacheresults !== 1 ) { + fragment = cacheresults; + } + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], + insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var clone = elem.cloneNode(true), + srcElements, + destElements, + i; + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName + // instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + // Return the cloned set + return clone; +}, + clean: function( elems, context, fragment, scripts ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + var ret = []; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" && !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + + } else if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( var j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + for ( i = 0; ret[i]; i++ ) { + if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); + + } else { + if ( ret[i].nodeType === 1 ) { + ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); + } + fragment.appendChild( ret[i] ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + continue; + } + + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ] && cache[ id ][ internalKey ]; + + if ( data && data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + + + + +var ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rdashAlpha = /-([a-z])/ig, + rupper = /([A-Z])/g, + rnumpx = /^-?\d+(?:px)?$/i, + rnum = /^-?\d/, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssWidth = [ "Left", "Right" ], + cssHeight = [ "Top", "Bottom" ], + curCSS, + + getComputedStyle, + currentStyle, + + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn.css = function( name, value ) { + // Setting 'undefined' is a no-op + if ( arguments.length === 2 && value === undefined ) { + return this; + } + + return jQuery.access( this, name, value, true, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }); +}; + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity", "opacity" ); + return ret === "" ? "1" : ret; + + } else { + return elem.style.opacity; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "zIndex": true, + "fontWeight": true, + "opacity": true, + "zoom": true, + "lineHeight": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, origName = jQuery.camelCase( name ), + style = elem.style, hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // Check if we're setting a value + if ( value !== undefined ) { + // Make sure that NaN and null values aren't set. See: #7116 + if ( typeof value === "number" && isNaN( value ) || value == null ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra ) { + // Make sure that we're working with the right name + var ret, origName = jQuery.camelCase( name ), + hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { + return ret; + + // Otherwise, if a way to get the computed value exists, use that + } else if ( curCSS ) { + return curCSS( elem, name, origName ); + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + }, + + camelCase: function( string ) { + return string.replace( rdashAlpha, fcamelCase ); + } +}); + +// DEPRECATED, Use jQuery.css() instead +jQuery.curCSS = jQuery.css; + +jQuery.each(["height", "width"], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + var val; + + if ( computed ) { + if ( elem.offsetWidth !== 0 ) { + val = getWH( elem, name, extra ); + + } else { + jQuery.swap( elem, cssShow, function() { + val = getWH( elem, name, extra ); + }); + } + + if ( val <= 0 ) { + val = curCSS( elem, name, name ); + + if ( val === "0px" && currentStyle ) { + val = currentStyle( elem, name, name ); + } + + if ( val != null ) { + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + } + + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + + return typeof val === "string" ? val : val + "px"; + } + }, + + set: function( elem, value ) { + if ( rnumpx.test( value ) ) { + // ignore negative width and height values #1599 + value = parseFloat(value); + + if ( value >= 0 ) { + return value + "px"; + } + + } else { + return value; + } + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? + (parseFloat(RegExp.$1) / 100) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // Set the alpha filter to set the opacity + var opacity = jQuery.isNaN(value) ? + "" : + "alpha(opacity=" + value * 100 + ")", + filter = style.filter || ""; + + style.filter = ralpha.test(filter) ? + filter.replace(ralpha, opacity) : + style.filter + ' ' + opacity; + } + }; +} + +if ( document.defaultView && document.defaultView.getComputedStyle ) { + getComputedStyle = function( elem, newName, name ) { + var ret, defaultView, computedStyle; + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + if ( !(defaultView = elem.ownerDocument.defaultView) ) { + return undefined; + } + + if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { + ret = computedStyle.getPropertyValue( name ); + if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret; + }; +} + +if ( document.documentElement.currentStyle ) { + currentStyle = function( elem, name ) { + var left, + ret = elem.currentStyle && elem.currentStyle[ name ], + rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], + style = elem.style; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { + // Remember the original values + left = style.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : (ret || 0); + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +curCSS = getComputedStyle || currentStyle; + +function getWH( elem, name, extra ) { + var which = name === "width" ? cssWidth : cssHeight, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) { + return val; + } + + jQuery.each( which, function() { + if ( !extra ) { + val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0; + } + + if ( extra === "margin" ) { + val += parseFloat(jQuery.css( elem, "margin" + this )) || 0; + + } else { + val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0; + } + }); + + return val; +} + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, + height = elem.offsetHeight; + + return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + + + + +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /(?:^file|^widget|\-extension):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rselectTextarea = /^(?:select|textarea)/i, + rspacesAjax = /\s+/, + rts = /([?&])_=[^&]*/, + rucHeaders = /(^|\-)([a-z])/g, + rucHeadersFunc = function( _, $1, $2 ) { + return $1 + $2.toUpperCase(); + }, + rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts; + +// #8138, IE may throw an exception when accessing +// a field from document.location if document.domain has been set +try { + ajaxLocation = document.location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ); + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for(; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +//Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf( " " ); + if ( off >= 0 ) { + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; + // If successful, inject the HTML into all the matched elements + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + responseText ); + } + + if ( callback ) { + self.each( callback, [ responseText, status, jqXHR ] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.bind( o, f ); + }; +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +} ); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function ( target, settings ) { + if ( !settings ) { + // Only one parameter, we extend ajaxSettings + settings = target; + target = jQuery.extend( true, jQuery.ajaxSettings, settings ); + } else { + // target was provided, we extend into it + jQuery.extend( true, target, jQuery.ajaxSettings, settings ); + } + // Flatten fields we don't want deep extended + for( var field in { context: 1, url: 1 } ) { + if ( field in settings ) { + target[ field ] = settings[ field ]; + } else if( field in jQuery.ajaxSettings ) { + target[ field ] = jQuery.ajaxSettings[ field ]; + } + } + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + traditional: false, + headers: {}, + crossDomain: null, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": "*/*" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery._Deferred(), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, statusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status ? 4 : 0; + + var isSuccess, + success, + error, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = statusText; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( !s.crossDomain ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + requestHeaders[ "Content-Type" ] = s.contentType; + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ]; + } + if ( jQuery.etag[ ifModifiedKey ] ) { + requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ]; + } + } + + // Set the Accepts header for the server, depending on the dataType + requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : + s.accepts[ "*" ]; + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( status < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + jQuery.error( e ); + } + } + } + + return jqXHR; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray( obj ) && obj.length ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // If we see an array here, it is empty and should be treated as an empty + // object + if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) { + add( prefix, "" ); + + // Serialize object item. + } else { + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|()\?\?()/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var dataIsString = ( typeof s.data === "string" ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + originalSettings.jsonpCallback || + originalSettings.jsonp != null || + s.jsonp !== false && ( jsre.test( s.url ) || + dataIsString && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2", + cleanUp = function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( dataIsString ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Install cleanUp function + jqXHR.then( cleanUp, cleanUp ); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +} ); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +} ); + + + + +var // #5280: next active xhr id and list of active xhrs' callbacks + xhrId = jQuery.now(), + xhrCallbacks, + + // XHR used to determine supports properties + testXHR; + +// #5280: Internet Explorer will keep connections alive if we don't abort on unload +function xhrOnUnloadAbort() { + jQuery( window ).unload(function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + }); +} + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Test if we can create an xhr object +testXHR = jQuery.ajaxSettings.xhr(); +jQuery.support.ajax = !!testXHR; + +// Does this browser support crossDomain XHR requests +jQuery.support.cors = testXHR && ( "withCredentials" in testXHR ); + +// No need for the temporary xhr anymore +testXHR = undefined; + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // Requested-With header + // Not set for crossDomain requests with no content + // (see why at http://trac.dojotoolkit.org/ticket/9486) + // Won't change header if already provided + if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + delete xhrCallbacks[ handle ]; + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + xhrOnUnloadAbort(); + } + // Add to list of active xhrs callbacks + handle = xhrId++; + xhr.onreadystatechange = xhrCallbacks[ handle ] = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} + + + + +var elemdisplay = {}, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ]; + +jQuery.fn.extend({ + show: function( speed, easing, callback ) { + var elem, display; + + if ( speed || speed === 0 ) { + return this.animate( genFx("show", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + elem = this[i]; + display = elem.style.display; + + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + elem = this[i]; + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } + } + + return this; + } + }, + + hide: function( speed, easing, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + var display = jQuery.css( this[i], "display" ); + + if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { + jQuery._data( this[i], "olddisplay", display ); + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + this[i].style.display = "none"; + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2, callback ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2, callback); + } + + return this; + }, + + fadeTo: function( speed, to, easing, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, easing, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete ); + } + + return this[ optall.queue === false ? "each" : "queue" ](function() { + // XXX 'this' does not always have a nodeName when running the + // test suite + + var opt = jQuery.extend({}, optall), p, + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), + self = this; + + for ( p in prop ) { + var name = jQuery.camelCase( p ); + + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + p = name; + } + + if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { + return opt.complete.call(this); + } + + if ( isElement && ( p === "height" || p === "width" ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height + // animated + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { + if ( !jQuery.support.inlineBlockNeedsLayout ) { + this.style.display = "inline-block"; + + } else { + var display = defaultDisplay(this.nodeName); + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( display === "inline" ) { + this.style.display = "inline-block"; + + } else { + this.style.display = "inline"; + this.style.zoom = 1; + } + } + } + } + + if ( jQuery.isArray( prop[p] ) ) { + // Create (if needed) and add to specialEasing + (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; + prop[p] = prop[p][0]; + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + opt.curAnim = jQuery.extend({}, prop); + + jQuery.each( prop, function( name, val ) { + var e = new jQuery.fx( self, opt, name ); + + if ( rfxtypes.test(val) ) { + e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); + + } else { + var parts = rfxnum.exec(val), + start = e.cur(); + + if ( parts ) { + var end = parseFloat( parts[2] ), + unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" ) { + jQuery.style( self, name, (end || 1) + unit); + start = ((end || 1) / e.cur()) * start; + jQuery.style( self, name, start + unit); + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ((parts[1] === "-=" ? -1 : 1) * end) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + }); + + // For JS strict compliance + return true; + }); + }, + + stop: function( clearQueue, gotoEnd ) { + var timers = jQuery.timers; + + if ( clearQueue ) { + this.queue([]); + } + + this.each(function() { + // go in reverse order so anything added to the queue during the loop is ignored + for ( var i = timers.length - 1; i >= 0; i-- ) { + if ( timers[i].elem === this ) { + if (gotoEnd) { + // force the next step to be the last + timers[i](true); + } + + timers.splice(i, 1); + } + } + }); + + // start the next in the queue if the last step wasn't forced + if ( !gotoEnd ) { + this.dequeue(); + } + + return this; + } + +}); + +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show", 1), + slideUp: genFx("hide", 1), + slideToggle: genFx("toggle", 1), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; + + // Queueing + opt.old = opt.complete; + opt.complete = function() { + if ( opt.queue !== false ) { + jQuery(this).dequeue(); + } + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + if ( !options.orig ) { + options.orig = {}; + } + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + }, + + // Get the current size + cur: function() { + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { + return this.elem[ this.prop ]; + } + + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + var self = this, + fx = jQuery.fx; + + this.startTime = jQuery.now(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); + this.now = this.start; + this.pos = this.state = 0; + + function t( gotoEnd ) { + return self.step(gotoEnd); + } + + t.elem = this.elem; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + timerId = setInterval(fx.tick, fx.interval); + } + }, + + // Simple 'show' function + show: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any + // flash of content + this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var t = jQuery.now(), done = true; + + if ( gotoEnd || t >= this.options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + this.options.curAnim[ this.prop ] = true; + + for ( var i in this.options.curAnim ) { + if ( this.options.curAnim[i] !== true ) { + done = false; + } + } + + if ( done ) { + // Reset the overflow + if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { + var elem = this.elem, + options = this.options; + + jQuery.each( [ "", "X", "Y" ], function (index, value) { + elem.style[ "overflow" + value ] = options.overflow[index]; + } ); + } + + // Hide the element if the "hide" operation was done + if ( this.options.hide ) { + jQuery(this.elem).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( this.options.hide || this.options.show ) { + for ( var p in this.options.curAnim ) { + jQuery.style( this.elem, p, this.options.orig[p] ); + } + } + + // Execute the complete function + this.options.complete.call( this.elem ); + } + + return false; + + } else { + var n = t - this.startTime; + this.state = n / this.options.duration; + + // Perform the easing function, defaults to swing + var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop]; + var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear"); + this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration); + this.now = this.start + ((this.end - this.start) * this.pos); + + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + var timers = jQuery.timers; + + for ( var i = 0; i < timers.length; i++ ) { + if ( !timers[i]() ) { + timers.splice(i--, 1); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + interval: 13, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style( fx.elem, "opacity", fx.now ); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +function defaultDisplay( nodeName ) { + if ( !elemdisplay[ nodeName ] ) { + var elem = jQuery("<" + nodeName + ">").appendTo("body"), + display = elem.css("display"); + + elem.remove(); + + if ( display === "none" || display === "" ) { + display = "block"; + } + + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + + + + +var rtable = /^t(?:able|d|h)$/i, + rroot = /^(?:body|html)$/i; + +if ( "getBoundingClientRect" in document.documentElement ) { + jQuery.fn.offset = function( options ) { + var elem = this[0], box; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + try { + box = elem.getBoundingClientRect(); + } catch(e) {} + + var doc = elem.ownerDocument, + docElem = doc.documentElement; + + // Make sure we're not dealing with a disconnected DOM node + if ( !box || !jQuery.contains( docElem, elem ) ) { + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; + } + + var body = doc.body, + win = getWindow(doc), + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ), + scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft), + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: top, left: left }; + }; + +} else { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + jQuery.offset.initialize(); + + var computedStyle, + offsetParent = elem.offsetParent, + prevOffsetParent = elem, + doc = elem.ownerDocument, + docElem = doc.documentElement, + body = doc.body, + defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, + left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent; + offsetParent = elem.offsetParent; + } + + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.offset = { + initialize: function() { + var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0, + html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; + + jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + innerDiv = container.firstChild; + checkDiv = innerDiv.firstChild; + td = innerDiv.nextSibling.firstChild.firstChild; + + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); + + checkDiv.style.position = "fixed"; + checkDiv.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); + checkDiv.style.position = checkDiv.style.top = ""; + + innerDiv.style.overflow = "hidden"; + innerDiv.style.position = "relative"; + + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); + + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + body.removeChild( container ); + body = container = innerDiv = checkDiv = table = td = null; + jQuery.offset.initialize = jQuery.noop; + }, + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + jQuery.offset.initialize(); + + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1), + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is absolute + if ( calculatePosition ) { + curPosition = curElem.position(); + } + + curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0; + curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0; + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if (options.top != null) { + props.top = (options.top - curOffset.top) + curTop; + } + if (options.left != null) { + props.left = (options.left - curOffset.left) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ["Left", "Top"], function( i, name ) { + var method = "scroll" + name; + + jQuery.fn[ method ] = function(val) { + var elem = this[0], win; + + if ( !elem ) { + return null; + } + + if ( val !== undefined ) { + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery(win).scrollLeft(), + i ? val : jQuery(win).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); + } else { + win = getWindow( elem ); + + // Return the scroll offset + return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} + + + + +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function( i, name ) { + + var type = name.toLowerCase(); + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function() { + return this[0] ? + parseFloat( jQuery.css( this[0], type, "padding" ) ) : + null; + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function( margin ) { + return this[0] ? + parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) : + null; + }; + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + var elem = this[0]; + if ( !elem ) { + return size == null ? null : this; + } + + if ( jQuery.isFunction( size ) ) { + return this.each(function( i ) { + var self = jQuery( this ); + self[ type ]( size.call( this, i, self[ type ]() ) ); + }); + } + + if ( jQuery.isWindow( elem ) ) { + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + var docElemProp = elem.document.documentElement[ "client" + name ]; + return elem.document.compatMode === "CSS1Compat" && docElemProp || + elem.document.body[ "client" + name ] || docElemProp; + + // Get document width or height + } else if ( elem.nodeType === 9 ) { + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + return Math.max( + elem.documentElement["client" + name], + elem.body["scroll" + name], elem.documentElement["scroll" + name], + elem.body["offset" + name], elem.documentElement["offset" + name] + ); + + // Get or set width or height on the element + } else if ( size === undefined ) { + var orig = jQuery.css( elem, type ), + ret = parseFloat( orig ); + + return jQuery.isNaN( ret ) ? orig : ret; + + // Set the width or height on the element (default to pixels if value is unitless) + } else { + return this.css( type, typeof size === "string" ? size : size + "px" ); + } + }; + +}); + + +window.jQuery = window.$ = jQuery; +})(window); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png Binary files differnew file mode 100644 index 0000000..5b5dab2 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png Binary files differnew file mode 100644 index 0000000..ac8b229 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png Binary files differnew file mode 100644 index 0000000..ad3d634 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png Binary files differnew file mode 100644 index 0000000..42ccba2 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png Binary files differnew file mode 100644 index 0000000..5a46b47 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png Binary files differnew file mode 100644 index 0000000..86c2baa --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png Binary files differnew file mode 100644 index 0000000..4443fdc --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png Binary files differnew file mode 100644 index 0000000..7c9fa6c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_222222_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_222222_256x240.png Binary files differnew file mode 100644 index 0000000..ee039dc --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_222222_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png Binary files differnew file mode 100644 index 0000000..45e8928 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_454545_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_454545_256x240.png Binary files differnew file mode 100644 index 0000000..7ec70d1 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_454545_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_888888_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_888888_256x240.png Binary files differnew file mode 100644 index 0000000..5ba708c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_888888_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png Binary files differnew file mode 100644 index 0000000..7930a55 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.all.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.all.css new file mode 100644 index 0000000..603aafd --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.all.css @@ -0,0 +1,11 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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 + */ +@import "jquery.ui.base.css"; +@import "jquery.ui.theme.css"; diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.base.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.base.css new file mode 100644 index 0000000..d0b70be --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.base.css @@ -0,0 +1,2 @@ +@import url("jquery.ui.core.css"); +@import url("jquery.ui.datepicker.css");
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.core.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.core.css new file mode 100644 index 0000000..ea82f08 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.core.css @@ -0,0 +1,41 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.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%; } diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.datepicker.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.datepicker.css new file mode 100644 index 0000000..b370444 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.datepicker.css @@ -0,0 +1,68 @@ +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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%; } + +/* 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/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.theme.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.theme.css new file mode 100644 index 0000000..c101864 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/base/jquery.ui.theme.css @@ -0,0 +1,252 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; 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 #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; 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 #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.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)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* 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-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png Binary files differnew file mode 100644 index 0000000..954e22d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png Binary files differnew file mode 100644 index 0000000..64ece57 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png Binary files differnew file mode 100644 index 0000000..abdc010 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png Binary files differnew file mode 100644 index 0000000..9b383f4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png Binary files differnew file mode 100644 index 0000000..859c264 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png Binary files differnew file mode 100644 index 0000000..42ccba2 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png Binary files differnew file mode 100644 index 0000000..39d5824 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png Binary files differnew file mode 100644 index 0000000..f127367 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png Binary files differnew file mode 100644 index 0000000..359397a --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_222222_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_222222_256x240.png Binary files differnew file mode 100644 index 0000000..b273ff1 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_222222_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_228ef1_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_228ef1_256x240.png Binary files differnew file mode 100644 index 0000000..a641a37 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_228ef1_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png Binary files differnew file mode 100644 index 0000000..85e63e9 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png Binary files differnew file mode 100644 index 0000000..e117eff --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffffff_256x240.png b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffffff_256x240.png Binary files differnew file mode 100644 index 0000000..42f8f99 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/images/ui-icons_ffffff_256x240.png diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery-ui-1.8.13.custom.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery-ui-1.8.13.custom.css new file mode 100644 index 0000000..2d2810d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery-ui-1.8.13.custom.css @@ -0,0 +1,362 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.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.13 + * + * Copyright 2011, 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-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-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; -webkit-border-radius: 5px; border-radius: 5px; }/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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%; } + +/* 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/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.all.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.all.css new file mode 100644 index 0000000..603aafd --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.all.css @@ -0,0 +1,11 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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 + */ +@import "jquery.ui.base.css"; +@import "jquery.ui.theme.css"; diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.base.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.base.css new file mode 100644 index 0000000..d0b70be --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.base.css @@ -0,0 +1,2 @@ +@import url("jquery.ui.core.css"); +@import url("jquery.ui.datepicker.css");
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.core.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.core.css new file mode 100644 index 0000000..ea82f08 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.core.css @@ -0,0 +1,41 @@ +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.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%; } diff --git a/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.datepicker.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.datepicker.css new file mode 100644 index 0000000..b370444 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.datepicker.css @@ -0,0 +1,68 @@ +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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%; } + +/* 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/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.theme.css b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.theme.css new file mode 100644 index 0000000..b924a51 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/themes/ui-lightness/jquery.ui.theme.css @@ -0,0 +1,254 @@ + + +/* + * jQuery UI CSS Framework 1.8.13 + * + * Copyright 2011, 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-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-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; -webkit-border-radius: 5px; border-radius: 5px; }
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery-ui-i18n.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery-ui-i18n.js new file mode 100644 index 0000000..eaaa576 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery-ui-i18n.js @@ -0,0 +1,1379 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); +/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/ +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */ + +jQuery(function($){ + $.datepicker.regional['ar-DZ'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', + 'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar-DZ']); +}); +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Alhourani -- me@khaledalhourani.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +jQuery(function($) { + $.datepicker.regional['az'] = { + closeText: 'Bağla', + prevText: '<Geri', + nextText: 'İrəli>', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun', + 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun', + 'İyul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['az']); +});/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '<назад', + nextText: 'напред>', + nextBigText: '>>', + currentText: 'днес', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); +/* Bosnian i18n for the jQuery UI date picker plugin. */ +/* Written by Kenan Konjo. */ +jQuery(function($){ + $.datepicker.regional['bs'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Juni', + 'Juli','August','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bs']); +});/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + closeText: 'Tancar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Avui', + monthNames: ['Gener','Febrer','Març','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +});/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '<Dříve', + nextText: 'Později>', + currentText: 'Nyní', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '<Forrige', + nextText: 'Næste>', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '<zurück', + nextText: 'Vor>', + currentText: 'heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'Wo', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'Προηγούμενος', + nextText: 'Επόμενος', + currentText: 'Τρέχων Μήνας', + monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος', + 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'], + monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'], + dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'], + dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'], + dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +});/* English/Australia initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-AU'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-AU']); +}); +/* English/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by Stuart. */ +jQuery(function($){ + $.datepicker.regional['en-GB'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-GB']); +}); +/* English/New Zealand initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-NZ'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-NZ']); +}); +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '<Anta', + nextText: 'Sekv>', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aŭg','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '<Ant', + nextText: 'Sig>', + currentText: 'Hoy', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +});/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +jQuery(function($){ + $.datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['et']); +}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +jQuery(function($){ + $.datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '<Aur', + nextText: 'Hur>', + currentText: 'Gaur', + monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina', + 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'], + monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka', + 'Uzt','Abu','Ira','Urr','Aza','Abe'], + dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'], + dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'], + dayNamesMin: ['Ig','As','As','As','Os','Os','La'], + weekHeader: 'Wk', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eu']); +});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '<قبلي', + nextText: 'بعدي>', + currentText: 'امروز', + monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسفند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['يکشنبه','دوشنبه','سهشنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'], + dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'], + weekHeader: 'هف', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +});/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '«Edellinen', + nextText: 'Seuraava»', + currentText: 'Tänään', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', + 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä', + 'Heinä','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +jQuery(function($){ + $.datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '<Fyrra', + nextText: 'Næsta>', + currentText: 'Í dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fo']); +}); +/* Swiss-French initialisation for the jQuery UI date picker plugin. */ +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */ +jQuery(function($){ + $.datepicker.regional['fr-CH'] = { + closeText: 'Fermer', + prevText: '<Préc', + nextText: 'Suiv>', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr-CH']); +});/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault <stephane.raimbault@gmail.com> */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin', + 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); +/* Galician localization for 'UI date picker' jQuery extension. */ +/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */ +jQuery(function($){ + $.datepicker.regional['gl'] = { + closeText: 'Pechar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Hoxe', + monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño', + 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'], + monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ', + 'Xul','Ago','Set','Out','Nov','Dec'], + dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['gl']); +});/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '<הקודם', + nextText: 'הבא>', + currentText: 'היום', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +});/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezárás', + prevText: '« vissza', + nextText: 'előre »', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hé', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + closeText: 'Փակել', + prevText: '<Նախ.', + nextText: 'Հաջ.>', + currentText: 'Այսօր', + monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս', + 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'], + monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս', + 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'], + dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'], + dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + weekHeader: 'ՇԲՏ', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +});/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '<mundur', + nextText: 'maju>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +});/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '< Fyrri', + nextText: 'Næsti >', + currentText: 'Í dag', + monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní', + 'Júlí','Ágúst','September','Október','Nóvember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún', + 'Júl','Ágú','Sep','Okt','Nóv','Des'], + dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'], + dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'], + dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'], + weekHeader: 'Vika', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['is']); +});/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '<Prec', + nextText: 'Succ>', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: '閉じる', + prevText: '<前', + nextText: '次>', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +});/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + closeText: '닫기', + prevText: '이전달', + nextText: '다음달', + currentText: '오늘', + monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + dayNames: ['일','월','화','수','목','금','토'], + dayNamesShort: ['일','월','화','수','목','금','토'], + dayNamesMin: ['일','월','화','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '년'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +});/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['kz'] = { + closeText: 'Жабу', + prevText: '<Алдыңғы', + nextText: 'Келесі>', + currentText: 'Бүгін', + monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым', + 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'], + monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау', + 'Шіл','Там','Қыр','Қаз','Қар','Жел'], + dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'], + dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'], + dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['kz']); +}); +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '<Atgal', + nextText: 'Pirmyn>', + currentText: 'Šiandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + closeText: 'Aizvērt', + prevText: 'Iepr', + nextText: 'Nāka', + currentText: 'Šodien', + monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs', + 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn', + 'Jūl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Nav', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +});/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Saji Nediyanchath (saji89@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ml'] = { + closeText: 'ശരി', + prevText: 'മുന്നത്തെ', + nextText: 'അടുത്തത് ', + currentText: 'ഇന്ന്', + monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്ച്ച്','ഏപ്രില്','മേയ്','ജൂണ്', + 'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്','ഒക്ടോബര്','നവംബര്','ഡിസംബര്'], + monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്', 'ഏപ്രി', 'മേയ്', 'ജൂണ്', + 'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'], + dayNames: ['ഞായര്', 'തിങ്കള്', 'ചൊവ്വ', 'ബുധന്', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], + dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], + dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'], + weekHeader: 'ആ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ml']); +}); +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +jQuery(function($){ + $.datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '<Sebelum', + nextText: 'Selepas>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ms']); +});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: '←', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +});/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '«Forrige', + nextText: 'Neste»', + currentText: 'I dag', + monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'], + dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dayNamesMin: ['sø','ma','ti','on','to','fr','lø'], + weekHeader: 'Uke', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + }; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '<Poprzedni', + nextText: 'Następny>', + currentText: 'Dziś', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Próximo>', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +});/* Portuguese initialisation for the jQuery UI date picker plugin. */ +jQuery(function($){ + $.datepicker.regional['pt'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Seguinte', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sem', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt']); +});/* Romansh initialisation for the jQuery UI date picker plugin. */ +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */ +jQuery(function($){ + $.datepicker.regional['rm'] = { + closeText: 'Serrar', + prevText: '<Suandant', + nextText: 'Precedent>', + currentText: 'Actual', + monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'], + monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'], + dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'], + dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'], + dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'], + weekHeader: 'emna', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['rm']); +}); +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'Închide', + prevText: '« Luna precedentă', + nextText: 'Luna următoare »', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Сегодня', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Нед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +});/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'Zavrieť', + prevText: '<Predchádzajúci', + nextText: 'Nasledujúci>', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = č, s = š z = ž C = Č S = Š Z = Ž */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '<Prejšnji', + nextText: 'Naslednji>', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '<mbrapa', + nextText: 'Përpara>', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr-SR'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Jun', + 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Sed', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr-SR']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '<', + nextText: '>', + currentText: 'Данас', + monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун', + 'Јул','Август','Септембар','Октобар','Новембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун', + 'Јул','Авг','Сеп','Окт','Нов','Дец'], + dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr']); +}); +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '«Förra', + nextText: 'Nästa»', + currentText: 'Idag', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +jQuery(function($){ + $.datepicker.regional['ta'] = { + closeText: 'மூடு', + prevText: 'முன்னையது', + nextText: 'அடுத்தது', + currentText: 'இன்று', + monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி', + 'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'], + monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி', + 'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'], + dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'], + dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'], + dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'], + weekHeader: 'Не', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ta']); +}); +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '« ย้อน', + nextText: 'ถัดไป »', + currentText: 'วันนี้', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +});/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['tj'] = { + closeText: 'Идома', + prevText: '<Қафо', + nextText: 'Пеш>', + currentText: 'Имрӯз', + monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн', + 'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'], + dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'], + dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'], + weekHeader: 'Хф', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tj']); +});/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '<geri', + nextText: 'ileri>', + currentText: 'bugün', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '<', + nextText: '>', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Не', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +});/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Đóng', + prevText: '<Trước', + nextText: 'Tiếp>', + currentText: 'Hôm nay', + monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by SCCY (samuelcychan@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-HK'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-HK']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-af.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-af.js new file mode 100644 index 0000000..0922ef7 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-af.js @@ -0,0 +1,23 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js new file mode 100644 index 0000000..e0e1685 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js @@ -0,0 +1,23 @@ +/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/ +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */ + +jQuery(function($){ + $.datepicker.regional['ar-DZ'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', + 'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar-DZ']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js new file mode 100644 index 0000000..743a15d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js @@ -0,0 +1,23 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Alhourani -- me@khaledalhourani.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-az.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-az.js new file mode 100644 index 0000000..57802a4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-az.js @@ -0,0 +1,23 @@ +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +jQuery(function($) { + $.datepicker.regional['az'] = { + closeText: 'Bağla', + prevText: '<Geri', + nextText: 'İrəli>', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun', + 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun', + 'İyul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['az']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js new file mode 100644 index 0000000..c19d20f --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js @@ -0,0 +1,24 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '<назад', + nextText: 'напред>', + nextBigText: '>>', + currentText: 'днес', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js new file mode 100644 index 0000000..d4dc8b0 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js @@ -0,0 +1,23 @@ +/* Bosnian i18n for the jQuery UI date picker plugin. */ +/* Written by Kenan Konjo. */ +jQuery(function($){ + $.datepicker.regional['bs'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Juni', + 'Juli','August','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bs']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js new file mode 100644 index 0000000..b128e69 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js @@ -0,0 +1,23 @@ +/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + closeText: 'Tancar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Avui', + monthNames: ['Gener','Febrer','Març','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js new file mode 100644 index 0000000..9805bcd --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js @@ -0,0 +1,23 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '<Dříve', + nextText: 'Později>', + currentText: 'Nyní', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-da.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-da.js new file mode 100644 index 0000000..176044e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-da.js @@ -0,0 +1,23 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '<Forrige', + nextText: 'Næste>', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-de.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-de.js new file mode 100644 index 0000000..166f537 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-de.js @@ -0,0 +1,23 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '<zurück', + nextText: 'Vor>', + currentText: 'heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'Wo', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-el.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-el.js new file mode 100644 index 0000000..6d775f9 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-el.js @@ -0,0 +1,23 @@ +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'Προηγούμενος', + nextText: 'Επόμενος', + currentText: 'Τρέχων Μήνας', + monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος', + 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'], + monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'], + dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'], + dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'], + dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js new file mode 100644 index 0000000..c1a1020 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js @@ -0,0 +1,23 @@ +/* English/Australia initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-AU'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-AU']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js new file mode 100644 index 0000000..16a096e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js @@ -0,0 +1,23 @@ +/* English/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by Stuart. */ +jQuery(function($){ + $.datepicker.regional['en-GB'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-GB']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js new file mode 100644 index 0000000..7819df0 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js @@ -0,0 +1,23 @@ +/* English/New Zealand initialisation for the jQuery UI date picker plugin. */ +/* Based on the en-GB initialisation. */ +jQuery(function($){ + $.datepicker.regional['en-NZ'] = { + 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: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-NZ']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js new file mode 100644 index 0000000..6cabc2c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js @@ -0,0 +1,23 @@ +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '<Anta', + nextText: 'Sekv>', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aŭg','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-es.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-es.js new file mode 100644 index 0000000..a02133d --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-es.js @@ -0,0 +1,23 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '<Ant', + nextText: 'Sig>', + currentText: 'Hoy', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-et.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-et.js new file mode 100644 index 0000000..92f81f6 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-et.js @@ -0,0 +1,23 @@ +/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +jQuery(function($){ + $.datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['et']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js new file mode 100644 index 0000000..bee4bfb --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js @@ -0,0 +1,23 @@ +/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +jQuery(function($){ + $.datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '<Aur', + nextText: 'Hur>', + currentText: 'Gaur', + monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina', + 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'], + monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka', + 'Uzt','Abu','Ira','Urr','Aza','Abe'], + dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'], + dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'], + dayNamesMin: ['Ig','As','As','As','Os','Os','La'], + weekHeader: 'Wk', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eu']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js new file mode 100644 index 0000000..81de4da --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js @@ -0,0 +1,23 @@ +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '<قبلي', + nextText: 'بعدي>', + currentText: 'امروز', + monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسفند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['يکشنبه','دوشنبه','سهشنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'], + dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'], + weekHeader: 'هف', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js new file mode 100644 index 0000000..e1f25fd --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js @@ -0,0 +1,23 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '«Edellinen', + nextText: 'Seuraava»', + currentText: 'Tänään', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', + 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä', + 'Heinä','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js new file mode 100644 index 0000000..8a6cb99 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js @@ -0,0 +1,23 @@ +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +jQuery(function($){ + $.datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '<Fyrra', + nextText: 'Næsta>', + currentText: 'Í dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fo']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js new file mode 100644 index 0000000..244eacf --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js @@ -0,0 +1,23 @@ +/* Swiss-French initialisation for the jQuery UI date picker plugin. */ +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */ +jQuery(function($){ + $.datepicker.regional['fr-CH'] = { + closeText: 'Fermer', + prevText: '<Préc', + nextText: 'Suiv>', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr-CH']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js new file mode 100644 index 0000000..7e79363 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js @@ -0,0 +1,25 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault <stephane.raimbault@gmail.com> */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin', + 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js new file mode 100644 index 0000000..278403e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js @@ -0,0 +1,23 @@ +/* Galician localization for 'UI date picker' jQuery extension. */ +/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */ +jQuery(function($){ + $.datepicker.regional['gl'] = { + closeText: 'Pechar', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Hoxe', + monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño', + 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'], + monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ', + 'Xul','Ago','Set','Out','Nov','Dec'], + dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['gl']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-he.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-he.js new file mode 100644 index 0000000..88a7866 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-he.js @@ -0,0 +1,23 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '<הקודם', + nextText: 'הבא>', + currentText: 'היום', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js new file mode 100644 index 0000000..1eb3dd9 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js @@ -0,0 +1,23 @@ +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js new file mode 100644 index 0000000..46e63f5 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js @@ -0,0 +1,23 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezárás', + prevText: '« vissza', + nextText: 'előre »', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hé', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js new file mode 100644 index 0000000..c6cc194 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js @@ -0,0 +1,23 @@ +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + closeText: 'Փակել', + prevText: '<Նախ.', + nextText: 'Հաջ.>', + currentText: 'Այսօր', + monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս', + 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'], + monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս', + 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'], + dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'], + dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + weekHeader: 'ՇԲՏ', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-id.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-id.js new file mode 100644 index 0000000..c626fbb --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-id.js @@ -0,0 +1,23 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '<mundur', + nextText: 'maju>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-is.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-is.js new file mode 100644 index 0000000..c53235a --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-is.js @@ -0,0 +1,23 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '< Fyrri', + nextText: 'Næsti >', + currentText: 'Í dag', + monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní', + 'Júlí','Ágúst','September','Október','Nóvember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún', + 'Júl','Ágú','Sep','Okt','Nóv','Des'], + dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'], + dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'], + dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'], + weekHeader: 'Vika', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['is']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-it.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-it.js new file mode 100644 index 0000000..59da2df --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-it.js @@ -0,0 +1,23 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '<Prec', + nextText: 'Succ>', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js new file mode 100644 index 0000000..7eb4268 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js @@ -0,0 +1,23 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: '閉じる', + prevText: '<前', + nextText: '次>', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js new file mode 100644 index 0000000..5b35316 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js @@ -0,0 +1,23 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + closeText: '닫기', + prevText: '이전달', + nextText: '다음달', + currentText: '오늘', + monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + dayNames: ['일','월','화','수','목','금','토'], + dayNamesShort: ['일','월','화','수','목','금','토'], + dayNamesMin: ['일','월','화','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '년'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js new file mode 100644 index 0000000..f1f897b --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js @@ -0,0 +1,23 @@ +/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['kz'] = { + closeText: 'Жабу', + prevText: '<Алдыңғы', + nextText: 'Келесі>', + currentText: 'Бүгін', + monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым', + 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'], + monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау', + 'Шіл','Там','Қыр','Қаз','Қар','Жел'], + dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'], + dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'], + dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['kz']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js new file mode 100644 index 0000000..67d5119 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js @@ -0,0 +1,23 @@ +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '<Atgal', + nextText: 'Pirmyn>', + currentText: 'Šiandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js new file mode 100644 index 0000000..003934e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js @@ -0,0 +1,23 @@ +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + closeText: 'Aizvērt', + prevText: 'Iepr', + nextText: 'Nāka', + currentText: 'Šodien', + monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs', + 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn', + 'Jūl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Nav', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js new file mode 100644 index 0000000..1e3432c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js @@ -0,0 +1,23 @@ +/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Saji Nediyanchath (saji89@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ml'] = { + closeText: 'ശരി', + prevText: 'മുന്നത്തെ', + nextText: 'അടുത്തത് ', + currentText: 'ഇന്ന്', + monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്ച്ച്','ഏപ്രില്','മേയ്','ജൂണ്', + 'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്','ഒക്ടോബര്','നവംബര്','ഡിസംബര്'], + monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്', 'ഏപ്രി', 'മേയ്', 'ജൂണ്', + 'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'], + dayNames: ['ഞായര്', 'തിങ്കള്', 'ചൊവ്വ', 'ബുധന്', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], + dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], + dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'], + weekHeader: 'ആ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ml']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js new file mode 100644 index 0000000..e953ac0 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js @@ -0,0 +1,23 @@ +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +jQuery(function($){ + $.datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '<Sebelum', + nextText: 'Selepas>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ms']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js new file mode 100644 index 0000000..0963408 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js @@ -0,0 +1,23 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: '←', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-no.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-no.js new file mode 100644 index 0000000..2507043 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-no.js @@ -0,0 +1,23 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '«Forrige', + nextText: 'Neste»', + currentText: 'I dag', + monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'], + dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dayNamesMin: ['sø','ma','ti','on','to','fr','lø'], + weekHeader: 'Uke', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + }; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js new file mode 100644 index 0000000..61fa29c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js @@ -0,0 +1,23 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '<Poprzedni', + nextText: 'Następny>', + currentText: 'Dziś', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js new file mode 100644 index 0000000..3cc8c79 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js @@ -0,0 +1,23 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Próximo>', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js new file mode 100644 index 0000000..f09f5ae --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js @@ -0,0 +1,22 @@ +/* Portuguese initialisation for the jQuery UI date picker plugin. */ +jQuery(function($){ + $.datepicker.regional['pt'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Seguinte', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sem', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js new file mode 100644 index 0000000..cf03cd4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js @@ -0,0 +1,21 @@ +/* Romansh initialisation for the jQuery UI date picker plugin. */ +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */ +jQuery(function($){ + $.datepicker.regional['rm'] = { + closeText: 'Serrar', + prevText: '<Suandant', + nextText: 'Precedent>', + currentText: 'Actual', + monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'], + monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'], + dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'], + dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'], + dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'], + weekHeader: 'emna', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['rm']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js new file mode 100644 index 0000000..6b140af --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js @@ -0,0 +1,26 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'Închide', + prevText: '« Luna precedentă', + nextText: 'Luna următoare »', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js new file mode 100644 index 0000000..50a4613 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js @@ -0,0 +1,23 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Сегодня', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Нед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js new file mode 100644 index 0000000..078d1b0 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js @@ -0,0 +1,23 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'Zavrieť', + prevText: '<Predchádzajúci', + nextText: 'Nasledujúci>', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js new file mode 100644 index 0000000..5165501 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js @@ -0,0 +1,24 @@ +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = č, s = š z = ž C = Č S = Š Z = Ž */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '<Prejšnji', + nextText: 'Naslednji>', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js new file mode 100644 index 0000000..21974c5 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js @@ -0,0 +1,23 @@ +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '<mbrapa', + nextText: 'Përpara>', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js new file mode 100644 index 0000000..e7a8683 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js @@ -0,0 +1,23 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr-SR'] = { + closeText: 'Zatvori', + prevText: '<', + nextText: '>', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Jun', + 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + weekHeader: 'Sed', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr-SR']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js new file mode 100644 index 0000000..0bd240e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js @@ -0,0 +1,23 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '<', + nextText: '>', + currentText: 'Данас', + monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун', + 'Јул','Август','Септембар','Октобар','Новембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун', + 'Јул','Авг','Сеп','Окт','Нов','Дец'], + dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js new file mode 100644 index 0000000..e5f549f --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js @@ -0,0 +1,23 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '«Förra', + nextText: 'Nästa»', + currentText: 'Idag', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js new file mode 100644 index 0000000..40431ed --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js @@ -0,0 +1,23 @@ +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +jQuery(function($){ + $.datepicker.regional['ta'] = { + closeText: 'மூடு', + prevText: 'முன்னையது', + nextText: 'அடுத்தது', + currentText: 'இன்று', + monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி', + 'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'], + monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி', + 'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'], + dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'], + dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'], + dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'], + weekHeader: 'Не', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ta']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-th.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-th.js new file mode 100644 index 0000000..2e5300c --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-th.js @@ -0,0 +1,23 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '« ย้อน', + nextText: 'ถัดไป »', + currentText: 'วันนี้', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js new file mode 100644 index 0000000..ed66239 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js @@ -0,0 +1,23 @@ +/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['tj'] = { + closeText: 'Идома', + prevText: '<Қафо', + nextText: 'Пеш>', + currentText: 'Имрӯз', + monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн', + 'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'], + dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'], + dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'], + weekHeader: 'Хф', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tj']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js new file mode 100644 index 0000000..dedfc7f --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js @@ -0,0 +1,23 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '<geri', + nextText: 'ileri>', + currentText: 'bugün', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js new file mode 100644 index 0000000..112b40e --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js @@ -0,0 +1,23 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '<', + nextText: '>', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Не', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +});
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js new file mode 100644 index 0000000..1d8f7bb --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js @@ -0,0 +1,23 @@ +/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Đóng', + prevText: '<Trước', + nextText: 'Tiếp>', + currentText: 'Hôm nay', + monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js new file mode 100644 index 0000000..6c4883f --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js new file mode 100644 index 0000000..06c4c62 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by SCCY (samuelcychan@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-HK'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-HK']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js new file mode 100644 index 0000000..dd51e35 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery-ui-1.8.13.custom.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery-ui-1.8.13.custom.js new file mode 100644 index 0000000..5bdc214 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery-ui-1.8.13.custom.js @@ -0,0 +1,2103 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function( $, undefined ) { + +// prevent duplicate loading +// this is only a problem because we proxy existing functions +// and we don't want to double proxy them +$.ui = $.ui || {}; +if ( $.ui.version ) { + return; +} + +$.extend( $.ui, { + version: "1.8.13", + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, // COMMAND + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, // COMMAND_RIGHT + 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 // COMMAND + } +}); + +// plugins +$.fn.extend({ + _focus: $.fn.focus, + focus: function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + this._focus.apply( this, arguments ); + }, + + scrollParent: function() { + var scrollParent; + if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0; + if ( border ) { + size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + var map = element.parentNode, + mapName = map.name, + img; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) + ? !element.disabled + : "a" == nodeName + ? element.href || isTabIndexNotNaN + : isTabIndexNotNaN) + // the element and all of its ancestors must be visible + && visible( element ); +} + +function visible( element ) { + return !$( element ).parents().andSelf().filter(function() { + return $.curCSS( this, "visibility" ) === "hidden" || + $.expr.filters.hidden( this ); + }).length; +} + +$.extend( $.expr[ ":" ], { + data: function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support +$(function() { + var body = document.body, + div = body.appendChild( div = document.createElement( "div" ) ); + + $.extend( div.style, { + minHeight: "100px", + height: "auto", + padding: 0, + borderWidth: 0 + }); + + $.support.minHeight = div.offsetHeight === 100; + $.support.selectstart = "onselectstart" in div; + + // set display to none to avoid a layout bug in IE + // http://dev.jquery.com/ticket/4014 + body.removeChild( div ).style.display = "none"; +}); + + + + + +// deprecated +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function( module, option, set ) { + var proto = $.ui[ module ].prototype; + for ( var i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode ) { + return; + } + + for ( var i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains() + contains: function( a, b ) { + return document.compareDocumentPosition ? + a.compareDocumentPosition( b ) & 16 : + a !== b && a.contains( b ); + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + }, + + // these are odd functions, fix the API or move into individual plugins + isOverAxis: function( x, reference, size ) { + //Determines when x coordinate is over "b" element axis + return ( x > reference ) && ( x < ( reference + size ) ); + }, + isOver: function( y, x, top, left, height, width ) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width ); + } +}); + +})( jQuery ); +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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 + * + * Depends: + * jquery.ui.core.js + */ +(function( $, undefined ) { + +$.extend($.ui, { datepicker: { version: "1.8.13" } }); + +var PROP_NAME = 'datepicker'; +var dpuuid = new Date().getTime(); +var instActive; + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'fadeIn', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'fast', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false // True to size the input for the date format, false to leave as is + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + 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(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) { + this.uuid += 1; + target.id = 'dp' + this.uuid; + } + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) + return; + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + this._autoSize(inst); + $.data(target, PROP_NAME, inst); + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (inst.append) + inst.append.remove(); + if (appendText) { + inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>'); + input[isRTL ? 'before' : 'after'](inst.append); + } + input.unbind('focus', this._showDatepicker); + if (inst.trigger) + inst.trigger.remove(); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + inst.trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0]) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(input[0]); + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var date = new Date(2009, 12 - 1, 20); // Ensure double digits + var dateFormat = this._get(inst, 'dateFormat'); + if (dateFormat.match(/[DM]/)) { + var findMax = function(names) { + var max = 0; + var maxI = 0; + for (var i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + 'monthNames' : 'monthNamesShort')))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay()); + } + inst.input.attr('size', this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) + return; + divSpan.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + inst.dpDiv.show(); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param date string or Date - the initial date to display + @param onSelect function - the function to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + this.uuid += 1; + var id = 'dp' + this.uuid; + this._dialogInput = $('<input type="text" id="' + id + + '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor == Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = document.documentElement.clientWidth; + var browserHeight = document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress). + unbind('keyup', this._doKeyUp); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = false; + inst.trigger.filter('button'). + each(function() { this.disabled = false; }).end(). + filter('img').css({opacity: '1.0', cursor: ''}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().removeClass('ui-state-disabled'); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + removeAttr("disabled"); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = true; + inst.trigger.filter('button'). + each(function() { this.disabled = true; }).end(). + filter('img').css({opacity: '0.5', cursor: 'default'}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().addClass('ui-state-disabled'); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + attr("disabled", "disabled"); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Retrieve the instance data for the target control. + @param target element - the target input field or division or span + @return object - the associated instance data + @throws error if a jQuery problem getting data */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw 'Missing instance data for this datepicker'; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or retrieve, + when retrieving also 'all' for all instance settings or + 'defaults' for all global defaults + @param value any - the new value for the setting + (omit if above is an object or to retrieve a value) */ + _optionDatepicker: function(target, name, value) { + var inst = this._getInst(target); + if (arguments.length == 2 && typeof name == 'string') { + return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) : + (inst ? (name == 'all' ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst) { + if (this._curInst == inst) { + this._hideDatepicker(); + } + var date = this._getDateDatepicker(target, true); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined) + inst.settings.minDate = this._formatDate(inst, minDate); + if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined) + inst.settings.maxDate = this._formatDate(inst, maxDate); + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + @param target element - the target input field or division or span */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @param noDefault boolean - true if no default date is to be used + @return Date - the current date */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) + this._setDateFromField(inst, noDefault); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var inst = $.datepicker._getInst(event.target); + var handled = true; + var isRTL = inst.dpDiv.is('.ui-datepicker-rtl'); + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + + $.datepicker._currentClass + ')', inst.dpDiv); + if (sel[0]) + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + else + $.datepicker._hideDatepicker(); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D'); + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D'); + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else { + handled = false; + } + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var inst = $.datepicker._getInst(event.target); + if ($.datepicker._get(inst, 'constrainInput')) { + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var inst = $.datepicker._getInst(event.target); + if (inst.input.val() != inst.lastVal) { + try { + var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (event) { + $.datepicker.log(event); + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst != inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + } + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim'); + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !! cover.length ){ + var borders = $.datepicker._getBorders(inst.dpDiv); + cover.css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}); + } + }; + inst.dpDiv.zIndex($(input).zIndex()+1); + $.datepicker._datepickerShowing = true; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess); + if (!showAnim || !duration) + postProcess(); + if (inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var self = this; + var borders = $.datepicker._getBorders(inst.dpDiv); + instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6 + cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}) + } + inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover(); + var numMonths = this._getNumberOfMonths(inst); + var cols = numMonths[1]; + var width = 17; + inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width(''); + if (cols > 1) + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em'); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input && + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement) + inst.input.focus(); + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + var origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + /* Retrieve the size of left and top borders for an element. + @param elem (jQuery object) the element of interest + @return (number[2]) the left and top borders */ + _getBorders: function(elem) { + var convert = function(value) { + return {thin: 1, medium: 2, thick: 3}[value] || value; + }; + return [parseFloat(convert(elem.css('border-left-width'))), + parseFloat(convert(elem.css('border-top-width')))]; + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(); + var dpHeight = inst.dpDiv.outerHeight(); + var inputWidth = inst.input ? inst.input.outerWidth() : 0; + var inputHeight = inst.input ? inst.input.outerHeight() : 0; + var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft(); + var viewHeight = document.documentElement.clientHeight + $(document).scrollTop(); + + offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var inst = this._getInst(obj); + var isRTL = this._get(inst, 'isRTL'); + while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling']; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker */ + _hideDatepicker: function(input) { + var inst = this._curInst; + if (!inst || (input && inst != $.data(input, PROP_NAME))) + return; + if (this._datepickerShowing) { + var showAnim = this._get(inst, 'showAnim'); + var duration = this._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + this._curInst = null; + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess); + if (!showAnim) + postProcess(); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar'); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if ($target[0].id != $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length == 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = this._getInst(target[0]); + inst._selectingMonthYear = false; + inst['selected' + (period == 'M' ? 'Month' : 'Year')] = + inst['draw' + (period == 'M' ? 'Month' : 'Year')] = + parseInt(select.options[select.selectedIndex].value,10); + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (inst.input && inst._selectingMonthYear) { + setTimeout(function() { + inst.input.focus(); + }, 0); + } + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var target = $(id); + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + var inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = this._getInst(target[0]); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input.focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); + var date = this._getDate(inst); + var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getTime()); + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var doy = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + var isDoubled = lookAhead(match); + var size = (match == '@' ? 14 : (match == '!' ? 20 : + (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2)))); + var digits = new RegExp('^\\d{1,' + size + '}'); + var num = value.substring(iValue).match(digits); + if (!num) + throw 'Missing number at position ' + iValue; + iValue += num[0].length; + return parseInt(num[0], 10); + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + var index = -1; + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index != -1) + return index + 1; + else + throw 'Unknown name at position ' + iValue; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + var date = new Date((getNumber('!') - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year == -1) + year = new Date().getFullYear(); + else if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + if (doy > -1) { + month = 1; + day = doy; + do { + var dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) + break; + month++; + day -= dim; + } while (true); + } + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/00 + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + 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', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + o - day of year (no leading zeros) + oo - day of year (three digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + ! - Windows ticks (100ns since 01/01/0001) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value, len) { + var num = '' + value; + if (lookAhead(match)) + while (num.length < len) + num = '0' + num; + return num; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'o': + output += formatNumber('o', + (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() == inst.lastVal) { + return; + } + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.lastVal = inst.input ? inst.input.val() : null; + var date, defaultDate; + date = defaultDate = this._getDefaultDate(inst); + var settings = this._getFormatConfig(inst); + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + this.log(event); + dates = (noDefault ? '' : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += parseInt(matches[1],10); break; + case 'w' : case 'W' : + day += parseInt(matches[1],10) * 7; break; + case 'm' : case 'M' : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date; + var origMonth = inst.selectedMonth; + var origYear = inst.selectedYear; + var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange) + this._notifyChange(inst); + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var isRTL = this._get(inst, 'isRTL'); + var showButtonPanel = this._get(inst, 'showButtonPanel'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth - showCurrentAtPos; + var drawYear = inst.drawYear; + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>')); + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>')); + var currentText = this._get(inst, 'currentText'); + var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : ''); + var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._gotoToday(\'#' + inst.id + '\');"' + + '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : ''; + var firstDay = parseInt(this._get(inst, 'firstDay'),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + var showWeek = this._get(inst, 'showWeek'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var monthNamesShort = this._get(inst, 'monthNamesShort'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var selectOtherMonths = this._get(inst, 'selectOtherMonths'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var defaultDate = this._getDefaultDate(inst); + var html = ''; + for (var row = 0; row < numMonths[0]; row++) { + var group = ''; + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + var cornerClass = ' ui-corner-all'; + var calender = ''; + if (isMultiMonth) { + calender += '<div class="ui-datepicker-group'; + if (numMonths[1] > 1) + switch (col) { + case 0: calender += ' ui-datepicker-group-first'; + cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break; + case numMonths[1]-1: calender += ' ui-datepicker-group-last'; + cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break; + default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break; + } + calender += '">'; + } + calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' + + (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + '</div><table class="ui-datepicker-calendar"><thead>' + + '<tr>'; + var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' + + '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>'; + } + calender += thead + '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += '<tr>'; + var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' + + this._get(inst, 'calculateWeek')(printDate) + '</td>'); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += '<td class="' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months + ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key + (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ? + // or defaultDate is current printedDate and defaultDate is selectedDate + ' ' + this._dayOverClass : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' + + inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions + (otherMonth && !showOtherMonths ? ' ' : // display for other months + (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' + + (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') + + (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day + (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months + '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += '</tbody></table>' + (isMultiMonth ? '</div>' + + ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : ''); + group += calender; + } + html += group; + } + html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '<div class="ui-datepicker-title">'; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += '<select class="ui-datepicker-month" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + monthHtml += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNamesShort[month] + '</option>'; + } + monthHtml += '</select>'; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : ''); + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ''; + if (secondary || !changeYear) + html += '<span class="ui-datepicker-year">' + drawYear + '</span>'; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += '<select class="ui-datepicker-year" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (; year <= endYear; year++) { + inst.yearshtml += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + inst.yearshtml += '</select>'; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml; + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var newDate = (minDate && date < minDate ? minDate : date); + newDate = (maxDate && newDate > maxDate ? maxDate : newDate); + return newDate; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function bindHover(dpDiv) { + var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a'; + return dpDiv.delegate(selector, 'mouseout', function() { + $(this).removeClass('ui-state-hover'); + if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover'); + if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover'); + }) + .delegate(selector, 'mouseover', function(){ + if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover'); + if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover'); + if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover'); + } + }); +} + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.13"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.core.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.core.js new file mode 100644 index 0000000..b175bd4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.core.js @@ -0,0 +1,312 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function( $, undefined ) { + +// prevent duplicate loading +// this is only a problem because we proxy existing functions +// and we don't want to double proxy them +$.ui = $.ui || {}; +if ( $.ui.version ) { + return; +} + +$.extend( $.ui, { + version: "1.8.13", + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, // COMMAND + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, // COMMAND_RIGHT + 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 // COMMAND + } +}); + +// plugins +$.fn.extend({ + _focus: $.fn.focus, + focus: function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + this._focus.apply( this, arguments ); + }, + + scrollParent: function() { + var scrollParent; + if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0; + if ( border ) { + size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + var map = element.parentNode, + mapName = map.name, + img; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) + ? !element.disabled + : "a" == nodeName + ? element.href || isTabIndexNotNaN + : isTabIndexNotNaN) + // the element and all of its ancestors must be visible + && visible( element ); +} + +function visible( element ) { + return !$( element ).parents().andSelf().filter(function() { + return $.curCSS( this, "visibility" ) === "hidden" || + $.expr.filters.hidden( this ); + }).length; +} + +$.extend( $.expr[ ":" ], { + data: function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support +$(function() { + var body = document.body, + div = body.appendChild( div = document.createElement( "div" ) ); + + $.extend( div.style, { + minHeight: "100px", + height: "auto", + padding: 0, + borderWidth: 0 + }); + + $.support.minHeight = div.offsetHeight === 100; + $.support.selectstart = "onselectstart" in div; + + // set display to none to avoid a layout bug in IE + // http://dev.jquery.com/ticket/4014 + body.removeChild( div ).style.display = "none"; +}); + + + + + +// deprecated +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function( module, option, set ) { + var proto = $.ui[ module ].prototype; + for ( var i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode ) { + return; + } + + for ( var i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains() + contains: function( a, b ) { + return document.compareDocumentPosition ? + a.compareDocumentPosition( b ) & 16 : + a !== b && a.contains( b ); + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + }, + + // these are odd functions, fix the API or move into individual plugins + isOverAxis: function( x, reference, size ) { + //Determines when x coordinate is over "b" element axis + return ( x > reference ) && ( x < ( reference + size ) ); + }, + isOver: function( y, x, top, left, height, width ) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width ); + } +}); + +})( jQuery ); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.datepicker.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.datepicker.js new file mode 100644 index 0000000..17f4286 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/jquery.ui.datepicker.js @@ -0,0 +1,1791 @@ +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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 + * + * Depends: + * jquery.ui.core.js + */ +(function( $, undefined ) { + +$.extend($.ui, { datepicker: { version: "1.8.13" } }); + +var PROP_NAME = 'datepicker'; +var dpuuid = new Date().getTime(); +var instActive; + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'fadeIn', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'fast', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false // True to size the input for the date format, false to leave as is + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + 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(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) { + this.uuid += 1; + target.id = 'dp' + this.uuid; + } + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) + return; + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + this._autoSize(inst); + $.data(target, PROP_NAME, inst); + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (inst.append) + inst.append.remove(); + if (appendText) { + inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>'); + input[isRTL ? 'before' : 'after'](inst.append); + } + input.unbind('focus', this._showDatepicker); + if (inst.trigger) + inst.trigger.remove(); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + inst.trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0]) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(input[0]); + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var date = new Date(2009, 12 - 1, 20); // Ensure double digits + var dateFormat = this._get(inst, 'dateFormat'); + if (dateFormat.match(/[DM]/)) { + var findMax = function(names) { + var max = 0; + var maxI = 0; + for (var i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + 'monthNames' : 'monthNamesShort')))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay()); + } + inst.input.attr('size', this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) + return; + divSpan.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + inst.dpDiv.show(); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param date string or Date - the initial date to display + @param onSelect function - the function to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + this.uuid += 1; + var id = 'dp' + this.uuid; + this._dialogInput = $('<input type="text" id="' + id + + '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor == Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = document.documentElement.clientWidth; + var browserHeight = document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress). + unbind('keyup', this._doKeyUp); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = false; + inst.trigger.filter('button'). + each(function() { this.disabled = false; }).end(). + filter('img').css({opacity: '1.0', cursor: ''}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().removeClass('ui-state-disabled'); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + removeAttr("disabled"); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = true; + inst.trigger.filter('button'). + each(function() { this.disabled = true; }).end(). + filter('img').css({opacity: '0.5', cursor: 'default'}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().addClass('ui-state-disabled'); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + attr("disabled", "disabled"); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Retrieve the instance data for the target control. + @param target element - the target input field or division or span + @return object - the associated instance data + @throws error if a jQuery problem getting data */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw 'Missing instance data for this datepicker'; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or retrieve, + when retrieving also 'all' for all instance settings or + 'defaults' for all global defaults + @param value any - the new value for the setting + (omit if above is an object or to retrieve a value) */ + _optionDatepicker: function(target, name, value) { + var inst = this._getInst(target); + if (arguments.length == 2 && typeof name == 'string') { + return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) : + (inst ? (name == 'all' ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst) { + if (this._curInst == inst) { + this._hideDatepicker(); + } + var date = this._getDateDatepicker(target, true); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined) + inst.settings.minDate = this._formatDate(inst, minDate); + if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined) + inst.settings.maxDate = this._formatDate(inst, maxDate); + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + @param target element - the target input field or division or span */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @param noDefault boolean - true if no default date is to be used + @return Date - the current date */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) + this._setDateFromField(inst, noDefault); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var inst = $.datepicker._getInst(event.target); + var handled = true; + var isRTL = inst.dpDiv.is('.ui-datepicker-rtl'); + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + + $.datepicker._currentClass + ')', inst.dpDiv); + if (sel[0]) + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + else + $.datepicker._hideDatepicker(); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D'); + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D'); + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else { + handled = false; + } + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var inst = $.datepicker._getInst(event.target); + if ($.datepicker._get(inst, 'constrainInput')) { + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var inst = $.datepicker._getInst(event.target); + if (inst.input.val() != inst.lastVal) { + try { + var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (event) { + $.datepicker.log(event); + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst != inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + } + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim'); + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !! cover.length ){ + var borders = $.datepicker._getBorders(inst.dpDiv); + cover.css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}); + } + }; + inst.dpDiv.zIndex($(input).zIndex()+1); + $.datepicker._datepickerShowing = true; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess); + if (!showAnim || !duration) + postProcess(); + if (inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var self = this; + var borders = $.datepicker._getBorders(inst.dpDiv); + instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6 + cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}) + } + inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover(); + var numMonths = this._getNumberOfMonths(inst); + var cols = numMonths[1]; + var width = 17; + inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width(''); + if (cols > 1) + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em'); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input && + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement) + inst.input.focus(); + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + var origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + /* Retrieve the size of left and top borders for an element. + @param elem (jQuery object) the element of interest + @return (number[2]) the left and top borders */ + _getBorders: function(elem) { + var convert = function(value) { + return {thin: 1, medium: 2, thick: 3}[value] || value; + }; + return [parseFloat(convert(elem.css('border-left-width'))), + parseFloat(convert(elem.css('border-top-width')))]; + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(); + var dpHeight = inst.dpDiv.outerHeight(); + var inputWidth = inst.input ? inst.input.outerWidth() : 0; + var inputHeight = inst.input ? inst.input.outerHeight() : 0; + var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft(); + var viewHeight = document.documentElement.clientHeight + $(document).scrollTop(); + + offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var inst = this._getInst(obj); + var isRTL = this._get(inst, 'isRTL'); + while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling']; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker */ + _hideDatepicker: function(input) { + var inst = this._curInst; + if (!inst || (input && inst != $.data(input, PROP_NAME))) + return; + if (this._datepickerShowing) { + var showAnim = this._get(inst, 'showAnim'); + var duration = this._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + this._curInst = null; + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess); + if (!showAnim) + postProcess(); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar'); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if ($target[0].id != $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length == 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = this._getInst(target[0]); + inst._selectingMonthYear = false; + inst['selected' + (period == 'M' ? 'Month' : 'Year')] = + inst['draw' + (period == 'M' ? 'Month' : 'Year')] = + parseInt(select.options[select.selectedIndex].value,10); + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (inst.input && inst._selectingMonthYear) { + setTimeout(function() { + inst.input.focus(); + }, 0); + } + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var target = $(id); + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + var inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = this._getInst(target[0]); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input.focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); + var date = this._getDate(inst); + var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getTime()); + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var doy = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + var isDoubled = lookAhead(match); + var size = (match == '@' ? 14 : (match == '!' ? 20 : + (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2)))); + var digits = new RegExp('^\\d{1,' + size + '}'); + var num = value.substring(iValue).match(digits); + if (!num) + throw 'Missing number at position ' + iValue; + iValue += num[0].length; + return parseInt(num[0], 10); + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + var index = -1; + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index != -1) + return index + 1; + else + throw 'Unknown name at position ' + iValue; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + var date = new Date((getNumber('!') - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year == -1) + year = new Date().getFullYear(); + else if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + if (doy > -1) { + month = 1; + day = doy; + do { + var dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) + break; + month++; + day -= dim; + } while (true); + } + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/00 + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + 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', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + o - day of year (no leading zeros) + oo - day of year (three digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + ! - Windows ticks (100ns since 01/01/0001) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value, len) { + var num = '' + value; + if (lookAhead(match)) + while (num.length < len) + num = '0' + num; + return num; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'o': + output += formatNumber('o', + (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() == inst.lastVal) { + return; + } + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.lastVal = inst.input ? inst.input.val() : null; + var date, defaultDate; + date = defaultDate = this._getDefaultDate(inst); + var settings = this._getFormatConfig(inst); + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + this.log(event); + dates = (noDefault ? '' : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += parseInt(matches[1],10); break; + case 'w' : case 'W' : + day += parseInt(matches[1],10) * 7; break; + case 'm' : case 'M' : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date; + var origMonth = inst.selectedMonth; + var origYear = inst.selectedYear; + var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange) + this._notifyChange(inst); + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var isRTL = this._get(inst, 'isRTL'); + var showButtonPanel = this._get(inst, 'showButtonPanel'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth - showCurrentAtPos; + var drawYear = inst.drawYear; + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>')); + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>')); + var currentText = this._get(inst, 'currentText'); + var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : ''); + var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._gotoToday(\'#' + inst.id + '\');"' + + '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : ''; + var firstDay = parseInt(this._get(inst, 'firstDay'),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + var showWeek = this._get(inst, 'showWeek'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var monthNamesShort = this._get(inst, 'monthNamesShort'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var selectOtherMonths = this._get(inst, 'selectOtherMonths'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var defaultDate = this._getDefaultDate(inst); + var html = ''; + for (var row = 0; row < numMonths[0]; row++) { + var group = ''; + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + var cornerClass = ' ui-corner-all'; + var calender = ''; + if (isMultiMonth) { + calender += '<div class="ui-datepicker-group'; + if (numMonths[1] > 1) + switch (col) { + case 0: calender += ' ui-datepicker-group-first'; + cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break; + case numMonths[1]-1: calender += ' ui-datepicker-group-last'; + cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break; + default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break; + } + calender += '">'; + } + calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' + + (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + '</div><table class="ui-datepicker-calendar"><thead>' + + '<tr>'; + var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' + + '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>'; + } + calender += thead + '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += '<tr>'; + var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' + + this._get(inst, 'calculateWeek')(printDate) + '</td>'); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += '<td class="' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months + ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key + (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ? + // or defaultDate is current printedDate and defaultDate is selectedDate + ' ' + this._dayOverClass : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' + + inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions + (otherMonth && !showOtherMonths ? ' ' : // display for other months + (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' + + (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') + + (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day + (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months + '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += '</tbody></table>' + (isMultiMonth ? '</div>' + + ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : ''); + group += calender; + } + html += group; + } + html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '<div class="ui-datepicker-title">'; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += '<select class="ui-datepicker-month" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + monthHtml += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNamesShort[month] + '</option>'; + } + monthHtml += '</select>'; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : ''); + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ''; + if (secondary || !changeYear) + html += '<span class="ui-datepicker-year">' + drawYear + '</span>'; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += '<select class="ui-datepicker-year" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (; year <= endYear; year++) { + inst.yearshtml += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + inst.yearshtml += '</select>'; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml; + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var newDate = (minDate && date < minDate ? minDate : date); + newDate = (maxDate && newDate > maxDate ? maxDate : newDate); + return newDate; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function bindHover(dpDiv) { + var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a'; + return dpDiv.delegate(selector, 'mouseout', function() { + $(this).removeClass('ui-state-hover'); + if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover'); + if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover'); + }) + .delegate(selector, 'mouseover', function(){ + if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover'); + if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover'); + if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover'); + } + }); +} + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.13"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.core.min.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.core.min.js new file mode 100644 index 0000000..2ec09ed --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.core.min.js @@ -0,0 +1,17 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.13", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus(); +b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this, +"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth, +outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b); +return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e= +0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.datepicker.min.js b/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.datepicker.min.js new file mode 100644 index 0000000..f1573e4 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/ui/minified/jquery.ui.datepicker.min.js @@ -0,0 +1,82 @@ +/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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 + * + * Depends: + * jquery.ui.core.js + */ +(function(d,B){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a", +"mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a","mouseover",function(){if(!d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==B)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.13"}});var z=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)}, +_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a, +b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker); +if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]); +return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a); +if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); +this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/ +2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a, +"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled= +false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled= +true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==B&&f.minDate===B)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==B&&f.maxDate===B)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a= +this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker(); +c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b, +"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target, +-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault(); +a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==B?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a); +d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal= +null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos= +null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0], +top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover"); +c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]}, +_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e- +g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= +null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort, +g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var C=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&C?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,C,K){p=d.map(o(p)?K:C,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w= +x[1];if(b.substr(s,w.length).toLowerCase()==w.toLowerCase()){E=x[0];s+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(A))throw"Unexpected literal at position "+s;s++},s=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v= +new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!= +c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames, +h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break; +case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+ +1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==B?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null, +f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b, +c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+= +parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; +a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+z+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +z+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){for(var O= +"",G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&x==0?c? +f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var D=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;D+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}y+=D+"</tr></thead><tbody>";D=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +D);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;D=l?6:Math.ceil((t+D)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<D;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],F=q.getMonth()!=g,L=F&&!K||!I[0]||k&&q<k||o&&q>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(q.getTime()==P.getTime()&&g==a.selectedMonth&& +a._keyEvent||E.getTime()==q.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+z+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(F&&!C?" ":L?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)? +r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+= +(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a, +"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a, +b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!= +"string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay)); +return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&& +arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.13";window["DP_jQuery_"+z]=d})(jQuery); diff --git a/frontend/static/other_rooms/datepicker/development-bundle/version.txt b/frontend/static/other_rooms/datepicker/development-bundle/version.txt new file mode 100644 index 0000000..59009bc --- /dev/null +++ b/frontend/static/other_rooms/datepicker/development-bundle/version.txt @@ -0,0 +1 @@ +1.8.13 diff --git a/frontend/static/other_rooms/datepicker/js/jquery-1.5.1.min.js b/frontend/static/other_rooms/datepicker/js/jquery-1.5.1.min.js new file mode 100644 index 0000000..6437874 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/js/jquery-1.5.1.min.js @@ -0,0 +1,16 @@ +/*! + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ +(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,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=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.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 e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(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(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,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"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.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?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){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,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.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]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),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]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.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!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},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 b<c[3]-0},gt:function(a,b,c){return b>c[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=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||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=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":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=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=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(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.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:[]}},l.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&&(l.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 href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},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 P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(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(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(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=d(arguments[0]);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,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.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 d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.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?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.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(!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 bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.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):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file diff --git a/frontend/static/other_rooms/datepicker/js/jquery-ui-1.8.13.custom.min.js b/frontend/static/other_rooms/datepicker/js/jquery-ui-1.8.13.custom.min.js new file mode 100644 index 0000000..07ba984 --- /dev/null +++ b/frontend/static/other_rooms/datepicker/js/jquery-ui-1.8.13.custom.min.js @@ -0,0 +1,100 @@ +/*! + * jQuery UI 1.8.13 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.13", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus(); +b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this, +"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth, +outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b); +return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e= +0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); +;/* + * jQuery UI Datepicker 1.8.13 + * + * Copyright 2011, 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 + * + * Depends: + * jquery.ui.core.js + */ +(function(d,B){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a", +"mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).delegate("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a","mouseover",function(){if(!d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==B)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.13"}});var z=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)}, +_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a, +b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker); +if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]); +return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a); +if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); +this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/ +2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a, +"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled= +false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled= +true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==B&&f.minDate===B)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==B&&f.maxDate===B)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a= +this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker(); +c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b, +"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target, +-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault(); +a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==B?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a); +d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal= +null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos= +null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0], +top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover"); +c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]}, +_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e- +g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= +null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort, +g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var C=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&C?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,C,K){p=d.map(o(p)?K:C,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w= +x[1];if(b.substr(s,w.length).toLowerCase()==w.toLowerCase()){E=x[0];s+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(A))throw"Unexpected literal at position "+s;s++},s=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v= +new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!= +c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames, +h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break; +case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+ +1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==B?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null, +f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b, +c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+= +parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; +a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+z+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+z+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +z+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){for(var O= +"",G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&x==0?c? +f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var D=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;D+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}y+=D+"</tr></thead><tbody>";D=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +D);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;D=l?6:Math.ceil((t+D)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<D;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],F=q.getMonth()!=g,L=F&&!K||!I[0]||k&&q<k||o&&q>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(q.getTime()==P.getTime()&&g==a.selectedMonth&& +a._keyEvent||E.getTime()==q.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+z+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(F&&!C?" ":L?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)? +r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+z+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+z+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+= +(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a, +"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a, +b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!= +"string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay)); +return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&& +arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.13";window["DP_jQuery_"+z]=d})(jQuery); +;
\ No newline at end of file diff --git a/frontend/static/other_rooms/embed-test.html b/frontend/static/other_rooms/embed-test.html new file mode 100644 index 0000000..6069fcc --- /dev/null +++ b/frontend/static/other_rooms/embed-test.html @@ -0,0 +1,48 @@ +<!doctype html> +<html> +<head> +<title>SJ EMBED TEST</title> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.18, rgb(219,107,172)), + color-stop(0.59, rgb(255,186,238)), + color-stop(0.89, rgb(255,224,255)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(219,107,172) 18%, + rgb(255,186,238) 59%, + rgb(255,224,255) 89% +); + + } +#embedded + { + box-shadow: 0px 5px 10px #000; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 250px; + border: 0; + background-color: #000; + } +</style> +<body> +<iframe src="http://scannerjammer.com/main/embed/" id="embedded"></iframe> +</body> +</html> + diff --git a/frontend/static/other_rooms/embed-test2.html b/frontend/static/other_rooms/embed-test2.html new file mode 100644 index 0000000..3e7bb5d --- /dev/null +++ b/frontend/static/other_rooms/embed-test2.html @@ -0,0 +1,48 @@ +<!doctype html> +<html> +<head> +<title>SJ EMBED TEST</title> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.18, rgb(219,107,172)), + color-stop(0.59, rgb(255,186,238)), + color-stop(0.89, rgb(255,224,255)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(219,107,172) 18%, + rgb(255,186,238) 59%, + rgb(255,224,255) 89% +); + + } +#embedded + { + box-shadow: 0px 5px 10px #000; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 360px; + border: 0; + background-color: #000; + } +</style> +<body> +<iframe src="http://scannerjammer.com/main/embed/" id="embedded"></iframe> +</body> +</html> + diff --git a/frontend/static/other_rooms/embed.html b/frontend/static/other_rooms/embed.html new file mode 100644 index 0000000..70d35f1 --- /dev/null +++ b/frontend/static/other_rooms/embed.html @@ -0,0 +1,64 @@ +<!doctype html> +<html> +<head> +<title>RADIO</title> +<link href="/css/sasscss/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/embed.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com:17769/"/> +<meta property="og:image" content="http://scannerjammer.com/img/plant.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +</head> +<body> +<section id="player"> + <section id="projector"> + <section id="screen"></section> + <section id="ytscreen"></section> + <section id="video-title"></section> + </section> + <nav id="controls"> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + <a target="_blank" id="video-link">[link]</a> + <span class='instructions'>Use arrow keys to switch videos</span> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</section> + +<section id="playlistbg"></section> +<section id="playlist"> + <ul id="queue"> + </ul> +</section> +<section id="msg"></section> +</body> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> + serverHost = "scannerjammer.com" + serverPort = 19898 + roomName = window.location.pathname.split("/")[1] + retrograde = false +</script> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery.md5.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/swfobject.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/soundmanager2.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/debug.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/api.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/auth.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/like.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/player.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/vimeo.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/youtube.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/soundcloud.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/audio.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/embed.js"></script> +</html> + diff --git a/frontend/static/other_rooms/img/cloudz1.png b/frontend/static/other_rooms/img/cloudz1.png Binary files differnew file mode 100644 index 0000000..fc83e06 --- /dev/null +++ b/frontend/static/other_rooms/img/cloudz1.png diff --git a/frontend/static/other_rooms/img/cloudz2.png b/frontend/static/other_rooms/img/cloudz2.png Binary files differnew file mode 100644 index 0000000..d563639 --- /dev/null +++ b/frontend/static/other_rooms/img/cloudz2.png diff --git a/frontend/static/other_rooms/img/playlist-banner.gif b/frontend/static/other_rooms/img/playlist-banner.gif Binary files differnew file mode 100644 index 0000000..7486d7a --- /dev/null +++ b/frontend/static/other_rooms/img/playlist-banner.gif diff --git a/frontend/static/other_rooms/liketest.html b/frontend/static/other_rooms/liketest.html new file mode 100644 index 0000000..f9329d4 --- /dev/null +++ b/frontend/static/other_rooms/liketest.html @@ -0,0 +1,70 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso=8859-1" /> +<meta property="og:title" content="ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/"/> +<meta property="og:image" content="http://scannerjammer.com/bgz/waterfall.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<body> + +<h2>IFRAME</h2> + +<h3>http://scannerjammer.com/</h3> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fscannerjammer.com%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h3>http://scannerjammer.com:17769/</h3> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fscannerjammer.com:17769%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h3>http://www.scannerjammer.com/</h3> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.scannerjammer.com%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h3>http://www.scannerjammer.com:17769/</h3> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.scannerjammer.com:17769%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h3>http://www.facebook.com/pages/ScannerJammer/191565564214855</h3> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.facebook.com%2Fpages%2FScannerJammer%2F191565564214855&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h3>https://www.facebook.com/pages/ScannerJammer/191565564214855</h3> +<iframe src="https://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.facebook.com%2Fpages%2FScannerJammer%2F191565564214855&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + +<h2>JAVASCRIPT</h2> + +<h3>http://scannerjammer.com/</h3> +<fb:like href="http://scannerjammer.com/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://scannerjammer.com:17769/</h3> +<fb:like href="http://scannerjammer.com:17769/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://www.scannerjammer.com/</h3> +<fb:like href="http://scannerjammer.com/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://www.scannerjammer.com:17769/</h3> +<fb:like href="http://scannerjammer.com:17769/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://scannerjammer.com</h3> +<fb:like href="http://scannerjammer.com" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://scannerjammer.com:17769</h3> +<fb:like href="http://scannerjammer.com:17769" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://www.scannerjammer.com</h3> +<fb:like href="http://scannerjammer.com" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://www.scannerjammer.com:17769</h3> +<fb:like href="http://scannerjammer.com:17769" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>http://www.facebook.com/pages/ScannerJammer/191565564214855</h3> +<fb:like href="http://www.facebook.com/pages/ScannerJammer/191565564214855" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<h3>https://www.facebook.com/pages/ScannerJammer/191565564214855</h3> +<fb:like href="https://www.facebook.com/pages/ScannerJammer/191565564214855" layout="button_count" show_faces="false" width="90" font=""></fb:like> + +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +</body> +</html> diff --git a/frontend/static/other_rooms/topvids.html b/frontend/static/other_rooms/topvids.html new file mode 100644 index 0000000..549f151 --- /dev/null +++ b/frontend/static/other_rooms/topvids.html @@ -0,0 +1,127 @@ +<!doctype html> +<html> +<head> +<title>TOP VIDEOS ON SCANNERJAMMER</title> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> +<meta property="og:title" content="Top Videos on ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com:17769/"/> +<meta property="og:image" content="http://scannerjammer.com/img/plant.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<link href="/css/sasscss/profile.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/top.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<style type="text/css"> +body + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.11, rgb(49,18,150)), + color-stop(0.67, rgb(143,38,255)), + color-stop(0.84, rgb(157,66,255)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(49,18,150) 11%, + rgb(143,38,255) 67%, + rgb(157,66,255) 84% +); + } +</style> +</head> +<body> +<section id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h1 id="header">TOP VIDEOS</h1> +</section> +<section id="logobg"></section> + +<section id="flower"><img src="http://scannerjammer.com/img/flower-red.gif" height="400" /></section> + +<section id="plant1"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +<section id="plant2"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> + +<section id="player"> + <section id="projector"> + <section id="screen"></section> + <section id="ytscreen"></section> + <section id="video-title"></section> + </section> + <nav id="controls"> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + <button id="like">LIKE</button> + <button id="fullscreen">FULLSCREEN</button> + <a id="video-link" target="_blank">[x]</a> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</section> + +<section id="playlistbg"></section> +<section id="playlist"> + <ol id="queueLinks"></ol> + <ul id="queue"> + </ul> +</section> + +<div id="sitez"> + <div> + <a href="/top">top</a> . + <a href="/directory">directory</a> . + </div> + <div id="likebutton"> + <fb:like href="http://scannerjammer.com:17769/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + </div> +</div> + +<section class="cloudleft"></section> +<section class="cloudright"></section> +<section class="cloudleft shimmer"></section> +<section class="cloudright shimmer"></section> +<section class="cloudleft shimmer2"></section> +<section class="cloudright shimmer2"></section> + +<section id="bg"> +</section> + +<section id="msg"></section> +<section id="plea"> + please enable javascript +</section> +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript"> + serverHost = "scannerjammer.com" + serverPort = 19898 +var todayVideoQueue = %%TODAY%% +var todayVideoQueueTitle = "Today" +var yesterdayVideoQueue = %%YESTERDAY%% +var yesterdayVideoQueueTitle = "Yesterday" +var topVideoQueue = %%TOP%% +var topVideoQueueTitle = "All Time" +</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/soundmanager2.js"></script> +<script type="text/javascript" src="/js/debug.js"></script> +<script type="text/javascript" src="/js/api.js"></script> +<script type="text/javascript" src="/js/auth.js"></script> +<script type="text/javascript" src="/js/like.js"></script> +<script type="text/javascript" src="/js/chat.js"></script> +<script type="text/javascript" src="/js/player.js"></script> +<script type="text/javascript" src="/js/vimeo.js"></script> +<script type="text/javascript" src="/js/youtube.js"></script> +<script type="text/javascript" src="/js/soundcloud.js"></script> +<script type="text/javascript" src="/js/audio.js"></script> +<script type="text/javascript" src="/js/top.js"></script> +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +</html> + diff --git a/frontend/static/radio/default.html b/frontend/static/radio/default.html new file mode 100644 index 0000000..f8c0c77 --- /dev/null +++ b/frontend/static/radio/default.html @@ -0,0 +1,178 @@ +<!doctype html> +<html> +<head> +<title>DISARO 20†† RADIO</title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="DISARO 20†† RADIO"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/disaro/radio/"/> +<meta property="og:image" content="http://scannerjammer.com/img/203479_218847874803841_2580485_n_1308775374.gif" /> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content=""/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + background-image: url(http://i.imgur.com/eHKnU.jpg); + } +#embedded + { + box-shadow: 0px 5px 10px #000; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 360px; + border: 0; + background-color: #000; + } +#container + { + font-family: futura, sans-serif; + color: #fff; + font-size: 36px; + position: absolute; + top: 250px; + left: 50%; + width: 500px; + margin-left: -250px; + text-align: center; + } +#container button + { + font-family: futura, sans-serif; + font-size: 42px; + background-color: #000; + color: #ddd; + padding: 20px 40px; + border: 0; + cursor: pointer; + } +#container button small + { + color: #bbb; + font-size: 24px; + line-height: 24px; + position: relative; + top: -5px; + } +#container button b + { + color: #fff; + font-size: 54px; + } +#container button:hover + { + background-color: #222; + color: #fff; + } +#curtain + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(69,69,69)), + color-stop(1, rgb(0,0,0)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(69,69,69) 0%, + rgb(0,0,0) 100% +); + width: 100%; + height: 100%; + z-index: -1; + position: absolute; + top: 0; + left: 0; + opacity: 0.9; + } +.flip + { + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + display: inline-block; + position: relative; + top: 8px; + } +#likebutton + { + position: absolute; + top: 100px; + left: 50%; + width: 350px; + margin-left: -185px; + background-color: #000; + padding: 10px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + display: none; + } +#about + { + display: none; + position: absolute; + bottom: 100px; + left: 50%; + margin-left: -180px; + background-color: #000; + padding: 10px 15px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + } +#likebutton:hover, #about:hover + { + background-color: #222; + } +#scanjam + { + padding-top: 5px; + } +</style> +<body> +<div id="curtain"> +</div> + +<div id="container"> + <button id="activate"><small>CLICK HERE FOR</small><br/> + DISARO 20<div class="flip">††</div><br/> + <b>RADIO</b> + </button> +</div> + +<div id="likebutton"> +<div id="fb-root" style="background-color: black;"></div><script src="http://connect.facebook.net/en_US/all.js#appId=236917449658413&xfbml=1"></script><fb:like href="http://scannerjammer.com/disaro/radio/" send="false" width="347" show_faces="true" colorscheme="dark" font="" style="background-color: black;"></fb:like> +</div> + +<div id="about"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0"></a> +</div> +</body> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> +function activater () + { + window.open ("/disaro/embed/", "sj_embed", "height=600,width=400,left=20,top=20,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=yes,toolbar=no") + } +document.getElementById("activate").onclick = activater +function loader () + { + $("#likebutton,#about").fadeIn(50) + } +$(document).ready(loader) +</script> +</html> + diff --git a/frontend/static/radio/diornights.html b/frontend/static/radio/diornights.html new file mode 100644 index 0000000..8e79f49 --- /dev/null +++ b/frontend/static/radio/diornights.html @@ -0,0 +1,13 @@ +<html> +<head> +<meta http-equiv="Refresh" + content="0; URL=http://diornights.com/radio/"> +</head> +<body> +<br> +Sending you through to + <a href="http://diornights.com/radio/">Dior Nights Radio</a>..! +<br> +</body> +</html> + diff --git a/frontend/static/radio/disaro.html b/frontend/static/radio/disaro.html new file mode 100644 index 0000000..e4b57cb --- /dev/null +++ b/frontend/static/radio/disaro.html @@ -0,0 +1,178 @@ +<!doctype html> +<html> +<head> +<title>DISARO 20†† RADIO</title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="DISARO 20†† RADIO"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/disaro/radio/"/> +<meta property="og:image" content="http://scannerjammer.com/img/disaro.jpg" /> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content=""/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + background-image: url(http://i.imgur.com/eHKnU.jpg); + } +#embedded + { + box-shadow: 0px 5px 10px #000; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 360px; + border: 0; + background-color: #000; + } +#container + { + font-family: futura, sans-serif; + color: #fff; + font-size: 36px; + position: absolute; + top: 250px; + left: 50%; + width: 500px; + margin-left: -250px; + text-align: center; + } +#container button + { + font-family: futura, sans-serif; + font-size: 42px; + background-color: #000; + color: #ddd; + padding: 20px 40px; + border: 0; + cursor: pointer; + } +#container button small + { + color: #bbb; + font-size: 24px; + line-height: 24px; + position: relative; + top: -5px; + } +#container button b + { + color: #fff; + font-size: 54px; + } +#container button:hover + { + background-color: #222; + color: #fff; + } +#curtain + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(69,69,69)), + color-stop(1, rgb(0,0,0)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(69,69,69) 0%, + rgb(0,0,0) 100% +); + width: 100%; + height: 100%; + z-index: -1; + position: absolute; + top: 0; + left: 0; + opacity: 0.9; + } +.flip + { + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + display: inline-block; + position: relative; + top: 8px; + } +#likebutton + { + position: absolute; + top: 100px; + left: 50%; + width: 350px; + margin-left: -185px; + background-color: #000; + padding: 10px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + display: none; + } +#about + { + display: none; + position: absolute; + bottom: 100px; + left: 50%; + margin-left: -180px; + background-color: #000; + padding: 10px 15px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + } +#likebutton:hover, #about:hover + { + background-color: #222; + } +#scanjam + { + padding-top: 5px; + } +</style> +<body> +<div id="curtain"> +</div> + +<div id="container"> + <button id="activate"><small>CLICK HERE FOR</small><br/> + DISARO 20<div class="flip">††</div><br/> + <b>RADIO</b> + </button> +</div> + +<div id="likebutton"> +<div id="fb-root" style="background-color: black;"></div><script src="http://connect.facebook.net/en_US/all.js#appId=236917449658413&xfbml=1"></script><fb:like href="http://scannerjammer.com/disaro/radio/" send="false" width="347" show_faces="true" colorscheme="dark" font="" style="background-color: black;"></fb:like> +</div> + +<div id="about"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0"></a> +</div> +</body> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> +function activater () + { + window.open ("/disaro/embed/", "sj_embed", "height=600,width=400,left=20,top=20,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=yes,toolbar=no") + } +document.getElementById("activate").onclick = activater +function loader () + { + $("#likebutton,#about").fadeIn(50) + } +$(document).ready(loader) +</script> +</html> + diff --git a/frontend/static/radio/glasspopcorn.html b/frontend/static/radio/glasspopcorn.html new file mode 100644 index 0000000..edeabaa --- /dev/null +++ b/frontend/static/radio/glasspopcorn.html @@ -0,0 +1,204 @@ +<!doctype html> +<html> +<head> +<title>GLASSPOPCORN RADIO</title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="Glasspopcorn Radio"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://glasspopcorn.com/radio/"/> +<meta property="og:image" content="http://scannerjammer.com/img/glasspopradio.gif" /> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content=""/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="" /> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + font-family: Lucida Sans Unicode, Lucida Grande, sans-serif; + background-image: url(http://scannerjammer.com/img/glasspopradio.gif); + background-position: center; + } +#bg + { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: -2; + } +#bg img + { + height: 100%; + width: 100%; + } +#embedded + { + box-shadow: 0px 5px 10px #000; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 360px; + border: 0; + background-color: #000; + } +#container + { + font-family: Lucida Sans Unicode, Lucida Grande, sans-serif; + color: #fff; + font-size: 36px; + position: absolute; + top: 250px; + left: 50%; + width: 500px; + margin-left: -250px; + text-align: center; + opacity: 0.8; + } +#container button + { + font-family: Lucida Sans Unicode, Lucida Grande, sans-serif; + font-size: 42px; + background-color: #333; + color: #ddd; + padding: 20px 40px; + border: 0; + cursor: pointer; + } +#container button small + { + color: #bbb; + font-size: 24px; + line-height: 24px; + position: relative; + top: -5px; + } +#container button b + { + color: #fff; + font-size: 54px; + } +#container button:hover + { + background-color: #222; + color: #fff; + } +#curtain + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(69,69,69)), + color-stop(1, rgb(0,0,0)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(69,69,69) 0%, + rgb(0,0,0) 100% +); + width: 100%; + height: 100%; + z-index: -1; + position: absolute; + top: 0; + left: 0; + opacity: 0.1; + } +.flip + { + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + display: inline-block; + position: relative; + top: 8px; + } +#likebutton + { + position: absolute; + top: 100px; + left: 50%; + width: 350px; + margin-left: -185px; + background-color: #333; + padding: 10px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + display: none; + opacity: 0.8; + } +#about + { + display: none; + position: absolute; + bottom: 100px; + left: 50%; + margin-left: -180px; + background-color: #333; + padding: 10px 15px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + opacity: 0.8; + } +#likebutton:hover, #about:hover + { + background-color: #222; + } +#scanjam + { + padding-top: 5px; + } +</style> +<body> + +<div id="curtain"> +</div> + +<!-- +<div id="bg"> + <img src="http://scannerjammer.com/img/glasspopradio.gif" /> +</div> +--> + +<div id="container"> + <button id="activate"><small>CLICK HERE FOR</small><br/> + GLASSPOPCORN<br/> + <b>RADIO</b> + </button> +</div> + +<div id="likebutton"> +<div id="fb-root" style="background-color: transparent;"></div><script src="http://connect.facebook.net/en_US/all.js#appId=236917449658413&xfbml=1"></script><fb:like href="http://scannerjammer.com/glasspopcorn/radio/" send="false" width="347" show_faces="true" colorscheme="dark" font="" style="background-color: transparent;"></fb:like> +</div> + +<div id="about"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0"></a> +</div> +</body> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> +function activater () + { + window.open ("/glasspopcorn/embed/", "sj_embed", "height=600,width=400,left=20,top=20,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=yes,toolbar=no") + } +document.getElementById("activate").onclick = activater +function loader () + { + $("#likebutton,#about").fadeIn(50) + } +$(document).ready(loader) +</script> +</html> + diff --git a/frontend/static/radio/sewergreats.html b/frontend/static/radio/sewergreats.html new file mode 100644 index 0000000..82c66db --- /dev/null +++ b/frontend/static/radio/sewergreats.html @@ -0,0 +1,219 @@ +<!doctype html> +<html> +<head> +<title>SEWER GREATS RADIO</title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="SEWER GREATS RADIO"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/sewergreats/radio/"/> +<meta property="og:image" content="http://scannerjammer.com/bgz/sewergreatsbg.jpg" /> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content=""/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<style type="text/css"> +html + { + height: 100%; + margin: 0; padding: 0; + } +body + { + margin: 0; padding: 0; + height: 100%; + width: 100%; + } +#bg + { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: -2; + } +#bg img + { + height: 100%; + width: 100%; + } +#embedded + { + box-shadow: 0px 5px 10px #003; + position: fixed; + top: 100px; + right: 100px; + width: 250px; + height: 360px; + border: 0; + background-color: #003; + } +#container + { + font-family: sans-serif; + letter-spacing: -2px; + color: #dd6688; + font-size: 36px; + position: absolute; + top: 250px; + left: 50%; + width: 500px; + margin-left: -250px; + text-align: center; + } +#container button + { + font-family: sans-serif; + font-size: 42px; + background-color: #003; + color: #ff3333; + padding: 20px 40px; + border: 0; + cursor: pointer; + box-shadow: 0 0 90px #f8f; + } +#container button small + { + color: #bb11dd; + font-size: 24px; + line-height: 24px; + position: relative; + top: -5px; + } +#container button b + { + color: #FF7F00; + font-size: 54px; + } +#container button:hover + { + background-color: #0820b6; + } +#curtain + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, rgb(69,69,69)), + color-stop(1, rgb(0,0,0)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(69,69,69) 0%, + rgb(0,0,0) 100% +); + width: 100%; + height: 100%; + z-index: -1; + position: absolute; + top: 0; + left: 0; + opacity: 0.1; + } +.flip + { + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + display: inline-block; + position: relative; + top: 8px; + } +#likebutton + { + position: absolute; + top: 100px; + left: 50%; + width: 350px; + margin-left: -185px; + background-color: #003; + padding: 10px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + display: none; + } +#about + { + display: none; + position: absolute; + bottom: 100px; + left: 50%; + margin-left: -180px; + background-color: #003; + padding: 10px 15px; + color: #ddd; + font-family: trebuchet ms, sans-serif; + text-align: center; + } +#likebutton:hover, #about:hover, #sewage:hover + { + background-color: #0820b6; + } +#scanjam + { + padding-top: 5px; + } +#sewage + { + bottom: 75px; + right: 50px; + position: absolute; + padding: 10px; + background: #003; + color: #eee; + cursor: pointer; + box-shadow: 0 20px 20px #000; + } +#sewage i + { + padding: 0 0 5px 0; + display: block; + font-family: sans-serif; + } +</style> +<body> +<div id="bg"> + <img src="/bgz/sewergreatsbg.jpg" /> +</div> +<div id="curtain"> +</div> + +<div id="container"> + <button id="activate"><small>CLICK HERE FOR</small><br/> + SEWER GREATS<br/> + <b>RADIO!</b> + </button> +</div> + +<div id="likebutton"> +<div id="fb-root" style="background-color: black;"></div><script src="http://connect.facebook.net/en_US/all.js#appId=236917449658413&xfbml=1"></script><fb:like href="http://scannerjammer.com/sewergreats/radio/" send="false" width="347" show_faces="true" colorscheme="dark" font="" style="background-color: black;"></fb:like> +</div> + +<div id="about"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0"></a> +</div> + +<div id="sewage"> + <i>And you might also enjoy ...</i> + <a href="http://sewagetapes.bandcamp.com/"><img src="http://scannerjammer.com/bgz/sewergreatsvol1.jpg" width="250" height="250"/></a> +</div> + +</body> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> +function activater () + { + window.open ("/sewergreats/embed/", "sj_embed", "height=600,width=400,left=20,top=20,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=yes,toolbar=no") + } +document.getElementById("activate").onclick = activater +function loader () + { + $("#likebutton,#about").fadeIn(50) + } +$(document).ready(loader) +</script> +</html> + + diff --git a/frontend/static/register/.htaccess b/frontend/static/register/.htaccess new file mode 100644 index 0000000..717ec6f --- /dev/null +++ b/frontend/static/register/.htaccess @@ -0,0 +1 @@ +DirectoryIndex index.html diff --git a/frontend/static/register/index.html b/frontend/static/register/index.html new file mode 100644 index 0000000..90775cd --- /dev/null +++ b/frontend/static/register/index.html @@ -0,0 +1,178 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER REGISTRATION</title> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<style type="text/css"> +* { padding: 0; margin: 0; } +body + { + background: #040818; + overflow: hidden; + } +#bg + { + position: absolute; + top: 0; + left: 0; + z-index: -1; + display: none; + } +#success, #register, #plant { display: none; } +#success + { + position: absolute; + top: 10%; + left: 50%; + margin-left: -250px; + width: 400px; + background-color: #808; + border-bottom: 2px solid #100; + color: #ccc; + text-align: center; + padding: 30px 50px 50px 50px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + font-family: sans-serif; + font-size: 24px; + } +#success a + { + color: #0ff; + font-weight: bold; + } +#success-username + { + font-weight: bold; + font-size: 36px; + color: #fff; + padding: 10px; + display: block; + } +#register + { + position: absolute; + top: 10%; + left: 30%; + background-image: url(http://asdf.us/scanjam/scanjambg1.jpg); + margin-left: -350px; + width: 600px; + background-color: #000; + color: #fff; + padding: 30px 50px 50px 50px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + font-family: sans-serif; + font-size: 30px; + } +#plant + { + position: absolute; + bottom: 0; + right: 0; + z-index: -1; + } +#register h1 + { + font-size: 48px; + padding-bottom: 20px; + } +img + { + padding-bottom: 20px; + } +#register input + { + font-size: 24px; + clear: right; + width: 200px; + padding: 3px; + margin-bottom: 10px; + background-color: #ddd; + border: 2px solid #333; + } +#register label + { + width: 120px; + font-size: 24px; + padding-right: 20px; + display: inline-block; + text-align: right; + } +#register button + { + font-size: 30px; + background-color: #fff; + opacity: 0.05; + font-weight: bold; + padding: 5px 10px; + } +#register span + { + font-size: 16px; + color: #0ff; + text-shadow: #888 0 0 3px; + } +#register span.error + { + color: #f00; + } +#reset + { + font-size:50%; + } +</style> +<body> +<section id="bg"> + <img src="http://scannerjammer.com/img/glittergutzbg.gif" /> +</section> +<section id="curtain"></section> +<section id="register"> + <img src="http://scannerjammer.com/img/scanjam-title.gif" width="100%" /><br /> + + <h1>official registration form</h1> + <label>username:</label> + <input type="text" id="register-username" maxlength="25" /> + <span id="username-available"></span> + <br /> + + <label>password:</label> + <input type="password" id="register-pw" maxlength="25" /> + <br /> + + <label>again:</label> + <input type="password" id="register-pw2" maxlength="25" /> + <span id="password-match"></span> + <br /> + + <label></label> + <button id="register-go">REGISTER</button> + <br /> + <span id="reset"> Forgot your password? <a href="http://scannerjammer.com/register/reset/index.html">RESET PASSWORD</a></span> +</section> +<section id="success"> + <!-- + <img src="http://scannerjammer.com/img/scanjam-title.gif" width="100%" /><br /> + --> + wow okay awesome! greetings,<br /> + <span id="success-username"></span> + your new ghost is online and active..<br /> + <br /> + <a href="/" id="sj-link">WELCOME TO SCANNERJAMMER</a> +</section> + +<section id="msg"></section> +<section id="plea"> + please enable javascript +</section> +<section id="plant"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/register.js"></script> +</html> + diff --git a/frontend/static/register/reset/.htaccess b/frontend/static/register/reset/.htaccess new file mode 100644 index 0000000..717ec6f --- /dev/null +++ b/frontend/static/register/reset/.htaccess @@ -0,0 +1 @@ +DirectoryIndex index.html diff --git a/frontend/static/register/reset/index.html b/frontend/static/register/reset/index.html new file mode 100644 index 0000000..28339e9 --- /dev/null +++ b/frontend/static/register/reset/index.html @@ -0,0 +1,57 @@ +<html> +<head> +<style type="text/css"> +body +{ +background-image:url(http://www.carbonpictures.com/bucky/data/1826/wood.gif); +} +#desk +{ +position:fixed; +bottom:40px; +left:20px; +z-index:10px; +} +#mirror +{ +position:fixed; +top:200px; +right:50px; +} +#main +{ +position:absolute; +margin-left:250px; +width:70%; +height:300px; +bottom:0px; +border-style:outset; +border-width:10px; +border-color:aqua; +z-index:0; +font-size:1em; +color:red; +background-color:whitesmoke; +font-family:times; +text-align:center; +} +</style> +</head> +<body> + <div id="main"> + SORRY, THIS FEATURE IS CURRENTLY UNAVAILABLE. PLEASE EMAIL:</br> + <span id="email" class="contacts">peppersclothescult@gmail.com</span></br> + + --OR SEND MESSAGE TO--</br> + <span id="facebook" class="contacts"><a href="http://www.facebook.com/AAAFFF">http://www.facebook.com/AAAFFF</a></span></br> + DANKE SCHOEN + + </div> +<img id="desk" src="http://asdf.us/im/e3/1323418221016dumpfmFAUXreal363792_1323419538_pepper.gif"></img> +<img id="mirror" src="http://asdf.us/im/15/Product280251full_1323420233_pepper.gif"></img> +</body> + + + + +</html> diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/avatar.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/avatar.sassc Binary files differnew file mode 100644 index 0000000..8a0db6b --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/avatar.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/calendar.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/calendar.sassc Binary files differnew file mode 100644 index 0000000..e889bee --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/calendar.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/diornights.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/diornights.sassc Binary files differnew file mode 100644 index 0000000..da9d4c0 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/diornights.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/disaro.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/disaro.sassc Binary files differnew file mode 100644 index 0000000..69cbe30 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/disaro.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/embed.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/embed.sassc Binary files differnew file mode 100644 index 0000000..55466ce --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/embed.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/feederbleeder.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/feederbleeder.sassc Binary files differnew file mode 100644 index 0000000..5a70484 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/feederbleeder.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/frederick.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/frederick.sassc Binary files differnew file mode 100644 index 0000000..2ca0e38 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/frederick.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/gallery-white.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/gallery-white.sassc Binary files differnew file mode 100644 index 0000000..815beae --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/gallery-white.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/glitter.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/glitter.sassc Binary files differnew file mode 100644 index 0000000..f3c2034 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/glitter.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/ie.scssc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/ie.scssc Binary files differnew file mode 100644 index 0000000..87e5588 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/ie.scssc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/main.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/main.sassc Binary files differnew file mode 100644 index 0000000..3357d68 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/main.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/print.scssc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/print.scssc Binary files differnew file mode 100644 index 0000000..7aa4c4a --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/print.scssc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/profile.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/profile.sassc new file mode 100644 index 0000000..ad2a2bb --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/profile.sassc @@ -0,0 +1,770 @@ +3.1.7 (Brainy Betty) +4ace3b0de5fad49de2024e2901b21909688a81a0 +o:Sass::Tree::RootNode :@template"#@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width + +body + background: #888 + // overflow-y: scroll + overflow-y: hidden + overflow-x: hidden + font-family: trebuchet ms, sans-serif +#logo + position: absolute + z-index: 20 + top: 15px + left: 20px + a + display: inline-block + img + padding-top: 5px + display: inline-block + h1 + position: relative + top: -10px + left: 10px + font-size: 34px + font-weight: normal + font-style: italic + font-family: georgia, garamond, serif + color: #f8b + display: inline-block + h2 + position: relative + display: inline-block + font-size: 12px + color: #fff + max-width: 250px + left: 10px + top: -6px + padding-right: 20px +#logobg + position: absolute + top: 10px + left: 0 + width: 100% + height: 64px + background-color: #000 + opacity: 0.8 + z-index: 19 +#likebutton + display: inline-block + display: none + z-index: -1 + min-width: 90px + a + color: #33f +#flower + position: absolute + top: 0 + right: 10% + z-index: 20 + pointer-events: none + display: none +#contact + position: absolute + left: 0 + display: none + #avatar, .avatar + display: none + width: 100% + // max-height: 300px + .avatar + display: block + #bio + p + color: #ddd + background-color: #000 + padding: 10px 5px + text-align: center + opacity: 0.7 + a + color: #ebf + display: block + img + width: 100% + // max-height: 300px +#sitez + position: absolute + top: 30px + right: 20px + text-align: right + z-index: 20 + div + color: #ddd + cursor: pointer + display: inline-block + padding: 4px 8px 4px 8px + float: left + a + color: #bbc + div#settings-hook + &:hover + @include rounded(10px 10px 3px 3px) + background-color: #333 + color: #fff + &.opened + @include rounded(10px 10px 3px 3px) + background-color: #333 + color: #fff + display: none + z-index: 82 +#fullscreen-warning + position: fixed + top: 50% + left: 50% + width: 600px + margin-left: -300px + margin-top: -20px + text-align: center + font-size: 24px + padding: 10px + background-color: rgba(0,0,0,0.5) + color: white + z-index: 100 + display: none +#settings-container + position: fixed + top: 53px + @include rounded (10px) + right: 20px + z-index: 80 + width: 500px + background-color: #222 + color: #657b83 + display: none + box-shadow: 0 5px 10px #000 + .close + margin: 10px 10px 0 0 + float: right + color: #ded8c5 + width: 20px + height: 14px + font-size: 14px + padding: 3px 0 + text-align: center + vertical-align: middle + @include rounded(10px) + background-color: #000b16 + &:hover + color: #fff + cursor: pointer + #rooms-loading + margin: 10px + h5 + font-size: 16px + color: #93a1a1 + display: block + padding: 10px + background-color: #333 + @include rounded(10px 10px 0 0) + p + padding: 10px 10px 10px 10px + font-size: 14px + line-height: 18px + color: #b3c1c1 + background-color: #1b1b1f + label + margin: 2px 0 0 10px + font-size: 14px + color: #657b83 + width: 150px + text-align: right + padding-right: 5px + display: inline-block + span + margin: 2px 10px 0 0 + color: #839496 + font-size: 14px + input + margin: 2px 10px 0 0 + width: 100px + #profile-avatar, #profile-bg + width: 300px + #profile-settings-save + font-size: 14px + textarea + width: 300px + height: 150px + .shim + width: 1px + height: 10px + ul + text-decoration: none + cursor: pointer + li + list-style-type: none + padding: 10px + cursor: pointer + border-top: 1px solid #000 + background-color: transparent + text-decoration: none + font-size: 14px + color: #83a1a1 + &:hover + color: #fdf6e3 + a li + color: #83a1a1 + text-decoration: none + a + color: #83a1a1 + text-decoration: none +#msg + z-index: 100 + position: fixed + top: 10px + right: 10px + padding: 5px + width: 250px + max-height: 80% + font-size: 12px + background-color: #eeeeee + overflow-y: scroll + overflow-x: hidden + color: #333 + strong + color: #859900 + em + color: #dc322f + b + color: #002b36 +#player + padding: 10px + position: absolute + background: #000 + #projector + display: block + position: fixed + background-color: #000 + #screen + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 19 + #soundcloud, #audio + position: absolute + top: 0 + right: 0 + background-color: #000 + z-index: 21 + #soundcloud-dl, #audio-dl + position: absolute + top: 81px + right: 0 + width: 81px + padding: 5px 0 5px 0 + font-size: 13px + text-align: center + background-color: #000 + * + color: #839496 + z-index: 20 + #soundcloud-img, #audio-img + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + img + max-width: 100% + min-height: 100% + max-height: 100% + #ytscreen + z-index: 19 + position: absolute + top: 0 + left: 0 + #video-title + position: absolute + bottom: 0 + left: 10px + color: #fff + z-index: 20 + &.fullscreen + position: fixed + bottom: 90px + left: auto + right: 30px + font-size: 24px + #projimg + width: 100% + height: 100% + nav#controls + z-index: 40 + position: absolute + display: none + #video-link + color: #839496 + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #e4b + #like.liked + color: #44f +#playlistbg + position: absolute + background-color: #000 + opacity: 0.5 +#playlist + position: absolute + z-index: 90 + width: 100% + ul#queue + width: 100% + border-top: 1px solid #888 + border-left: 1px solid #888 + border-bottom: 1px solid #888 + -webkit-padding-start: 0 + -webkit-margin-before: 0 + overflow-y: scroll + overflow-x: hidden + z-index: 90 + li + padding: 5px + display: block + cursor: pointer + border-bottom: 1px solid #333 + span.title + color: #ddd + display: block + padding: 5px + font-size: 15px + z-index: 1 + &:hover + color: #fff + a.user + float: right + font-size: 14px + padding: 0 5px + color: #d33682 + padding: 5px + z-index: 2 + text-decoration: none + span.like + float: right + font-size: 14px + color: #657b83 + padding: 5px + z-index: 3 + span.like.liked + color: #c357a3 + span.score + float: right + font-size: 14px + color: #bbb + padding: 5px 10px 5px 5px + li.playing + background-color: #222 + span.title + color: #fff + li#queueLess + color: #fff + text-align: center + &:hover + background-color: #666 + color: #fff + border: 0 + border-bottom: 1px solid #333 + font-size: 18px + padding: 10px 0 + cursor: pointer + li#queueMore + color: #fff + text-align: center + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 33px + padding: 20px 20px 20px 20px + cursor: pointer + li#queueDone + color: #ddd + text-align: center + border: 0 + font-size: 33px + padding: 80px 20px 200px 20px + li#queueLoading + text-align: center + color: #fff + font-size: 24px + padding: 80px + ol + -webkit-padding-start: 0 + -webkit-margin-before: 0 + -webkit-margin-after: 0 + display: block + position: relative + top: 1px + li + padding: 5px 8px 8px 8px + margin: 0 0 0 10px + list-style-type: none + border-top: 1px solid #000 + border-right: 1px solid #000 + border-left: 1px solid #000 + border-bottom: 1px solid #888 + display: inline-block + background-color: #333 + color: #bbb + cursor: pointer + opacity: 0.7 + z-index: 89 + li.mode + position: relative + padding: 8px 8px 8px 8px + border-color: #888 + border-bottom: 1px solid #111 + background-color: #111 + color: #fff + z-index: 91 +nav + z-index: 10 + margin: 0 auto + button, #video-link + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 14px + min-width: 40px + min-height: 20px + padding: 5px 5px + position: relative + top: -1px + #video-link + padding: 6px 5px 5px 5px +#msg + display: none +#gif-container + position: absolute + left: 0 + width: 100% + padding-left: 10% + display: block + padding-bottom: 200px + #gifs + clear: both + display: block + text-align: center + top: 0 + max-width: 80% + margin: 0 0 200px 0 + box-shadow: 0 5px 10px #000 + background-color: #fff + div + padding: 10px + display: inline-block + img + max-width: 350px + max-height: 400px +#bg + position: fixed + top: 0 + left: 0 + opacity: 1 + z-index: -3 + width: 100% + height: 100% + display: none + img + width: 100% + height: 100% + +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + +:
@options{ +@linei; [ +@name"rounded;@;T: +@args[[o:Sass::Script::Variable;" +width;{:project_name" +sass/: +cacheT:cache_location"?/var/www/vhosts/scannerjammer.com/sandbox/sass/.sass-cache:
importero: Sass::Importers::Filesystem: +@root"7/var/www/vhosts/scannerjammer.com/sandbox/sass/src:line_commentsT:original_filename@:output_style:compressed:filesystem_importerc Sass::Importers::Filesystem:cache_storeo:Sass::CacheStores::Chain:@caches[u:Sass::CacheStores::Memory +style;:
filename@: +quietT:syntax: sass:property_syntax0: loud[:identical:overwrite:create:load_paths[ o;;"7/var/www/vhosts/scannerjammer.com/sandbox/sass/srco;;"V/usr/local/lib/ruby/gems/1.8/gems/compass-0.11.5/frameworks/blueprint/stylesheetso;;"T/usr/local/lib/ruby/gems/1.8/gems/compass-0.11.5/frameworks/compass/stylesheetso:Compass::SpriteImporter: @uri" +width0;@;
i; [ o:Sass::Tree::PropNode
: +@tabsi +width;@;0" +width;
i;
i; [ +width;@;0" +width;
i ;
i ; [ +width;@;0" +width;
i +;
i +; [ +width;@;0" +width;
i;
i; [ +@rule[" body:@parsed_ruleso:"Sass::Selector::CommaSequence:
@members[o:Sass::Selector::Sequence;:[o:#Sass::Selector::SimpleSequence;:[o:Sass::Selector::Element :@namespace0;[" body;@;
i
;@;
i
;@;
i
;@;
i
; [ +o;1
;2i +alphai: +greeni: bluei;50;
i;
i; [ +@loud0;@;@:@silentT;5"// overflow-y: scroll;
i; [ +@type:identifier;5"hidden;
i;
i; [ +comma;5[o;L ;@;M: +space;5[o;I ;@;J;K;5"trebuchet;
io;I ;@;J;K;5"ms;
i;
io;I ;@;J;K;5"sans-serif;
i;
i;
i; [ +#logo;8o;9;:[o;;;:[o;<;:[o:Sass::Selector::Id;[" logo;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +;
i;
i; [ +-10px;5i;
i;
i; [ +serif;
i$;
i$;
i$; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i%;
i%; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i+;
i+; [ +250px;5i;
i,;
i,; [ +width;@;3;4;@;5o;Q;R[ +o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai8;Bi;Ci8;Di;50;
i?;
i?; [ +right;@;3;4;@;5o;Q;R[ +width;@;3;4;@;5o;Q;R[ +block;
iP;
iP; [ +o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iS;
iS; [ +;
iU;
iU;
iU; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iY;
iY; [ +block;
iZ;
iZ; [ +width;@;3;4;@;5o;Q;R[ +sitez;@;
i^;@;
i^;@;
i^;@;
i^; [o;1
;2i +right;@;3;4;@;5o;Q;R[ +right;
ib;
ib; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ie;
ie; [ +float;@;3;4;@;5o;I ;@;J;K;5" left;
ii;
ii; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ik;
ik; [ +;[" +hover: @arg0;@;J: +class;
im;@;
im;@;
im;@;
im; [o:Sass::Tree::MixinNode:@keywords{ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ip;
ip; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
it;
it; [ +fixed;
ix;
ix; [ +width;@;3;4;@;5o;Q;R[ +600px;5iX;
i{;
i{; [ +-20px;5i;
i};
i}; [ +;[{ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i};
i}; [ +fixed;
i;
i; [ +right;@;3;4;@;5o;Q;R[ +width;@;3;4;@;5o;Q;R[ +500px;5i;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Aij;Bi;Ci{;Di;50;
i;
i; [ +;
io;Q;R[ +close;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +float;@;3;4;@;5o;I ;@;J;K;5" +right;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +;[" +hover;X0;@;J;Y;
i;@;
i;@;
i;@;
i; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +block;
i;
i; [ +o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +label;8o;9;:[o;;;:[o;<;:[o;= ;>0;[" +label;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Aij;Bi;Ci{;Di;50;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +150px;5i;
i;
i; [ +right;
i;
i; [ +;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +input;8o;9;:[o;;;:[o;<;:[o;= ;>0;[" +input;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +width;@;3;4;@;5o;Q;R[ +100px;5ii;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +300px;5i,;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +300px;5i,;
i;
i; [ +150px;5i;
i;
i; [ +.shim;8o;9;:[o;;;:[o;<;:[o;U;[" shim;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +width;@;3;4;@;5o;Q;R[ +o;1
;2i +solid;
io;? ;@;@{ ;Ai +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +;[" +hover;X0;@;J;Y;
i;@;
i;@;
i;@;
i; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +fixed;
i;
i; [ +right;@;3;4;@;5o;Q;R[ +;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +250px;5i;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai8;Bi;Ci8;Di8;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci7;Di4;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai +o;1
;2i +block;
i;
i; [ +fixed;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +audio;@;
i;@;
i;@;
i;@;
i; [ +o;1
;2i +right;@;3;4;@;5o;Q;R@;@;S[ +right;@;3;4;@;5o;Q;R@;@;S[ +width;@;3;4;@;5o;Q;R[ +;
io;Q;R@;@;S[ +;
io;Q;R@;@;S[ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +;@;
i +o;;;:[o;<;:[o;P;["audio-img;@;
i +;@;
i +;@;
i +;@;
i +; [o;1
;2i +width;@;3;4;@;5o;Q;R[ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +o;1
;2i +fixed;
i!;
i!; [ +right;@;3;4;@;5o;Q;R[ +width;@;3;4;@;5o;Q;R[ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i.;
i.; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i4;
i4; [ +#like;8o;9;:[o;;;:[o;<;:[o;P;[" like;@;
i5;@;
i5;@;
i5;@;
i5; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;CiI;Di;50;
i6;
i6; [ +liked;@;
i7;@;
i7;@;
i7;@;
i7; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;AiI;Bi;CiI;Di;50;
i8;
i8; [ +o;1
;2i +width;@;3;4;@;5o;Q;R[ +queue;@;
iA;@;
iA;@;
iA;@;
iA; [o;1
;2i +width;@;3;4;@;5o;Q;R[ +solid;
iCo;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iC;
iC;
iC; [ +solid;
iDo;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iD;
iD;
iD; [ +solid;
iEo;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iE;
iE;
iE; [ +;
iL;
iL; [ +block;
iM;
iM; [ +solid;
iOo;? ;@;@{ ;Ai8;Bi;Ci8;Di8;50;
iO;
iO;
iO; [ +title;@;
iP;@;
iP;@;
iP;@;
iP; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iQ;
iQ; [ +block;
iR;
iR; [ +;
iS;
iS; [ +;[" +hover;X0;@;J;Y;
iV;@;
iV;@;
iV;@;
iV; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iW;
iW; [ +float;@;3;4;@;5o;I ;@;J;K;5" +right;
iY;
iY; [ +;
i[;
i[;
i[; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;;Di;50;
i\;
i\; [ +;
i];
i]; [ +o;1
;2i +float;@;3;4;@;5o;I ;@;J;K;5" +right;
ia;
ia; [ +color;@;3;4;@;5o;? ;@;@{ ;Aij;Bi;Ci{;Di;50;
ic;
ic; [ +;
id;
id; [ +liked;@;
if;@;
if;@;
if;@;
if; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci\;Di;50;
ig;
ig; [ +score;@;
ih;@;
ih;@;
ih;@;
ih; [ o;1
;2i +float;@;3;4;@;5o;I ;@;J;K;5" +right;
ii;
ii; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ik;
ik; [ +;
ilo;Q;R[ +;
ilo;Q;R[ +;
il;
il;
il; [ +title;@;
io;@;
io;@;
io;@;
io; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ip;
ip; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
ir;
ir; [ +;[" +hover;X0;@;J;Y;
it;@;
it;@;
it;@;
it; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
iv;
iv; [ +solid;
ixo;? ;@;@{ ;Ai8;Bi;Ci8;Di8;50;
ix;
ix;
ix; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i};
i}; [ +;[" +hover;X0;@;J;Y;
i;@;
i;@;
i;@;
i; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +200px;5i;
io;Q;R[ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +block;
i;
i; [ +;
io;Q;R[ +solid;
io;? ;@;@{ ;Ai +solid;
io;? ;@;@{ ;Ai +solid;
io;? ;@;@{ ;Ai +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +;[" +hover;X0;@;J;Y;
i;@;
i;@;
i;@;
i; [o;1
;2i +color;@;3;4;@;5o;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i; [ +;
io;Q;R[ +;
i;
i;
i; [ +;
io;Q;R[ +;
io;Q;R[ +;
i;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +block;
i;
i; [ +200px;5i;
i;
i; [ +#gifs;8o;9;:[o;;;:[o;<;:[o;P;[" gifs;@;
i;@;
i;@;
i;@;
i; [o;1
;2i +clear;@;3;4;@;5o;I ;@;J;K;5" both;
i;
i; [ +block;
i;
i; [ +200px;5i;
io;Q;R@;@;S[ +;
io;Q;R[ +350px;5i^;
i;
i; [ +400px;5i;
i;
i; [ +fixed;
i;
i; [ +width;@;3;4;@;5o;Q;R[ +width;@;3;4;@;5o;Q;R[ +width;@;3;4;@;5o;Q;R@;@;S[ +4.5px;5f4.5;
io;I ;@;J;K;5" +solid;
io;I ;@;J;K;5"transparent;
i;
i;
i; [ +9.5px;5f9.5;
io;I ;@;J;K;5" +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +4.5px;5f4.5;
io;I ;@;J;K;5" +solid;
io;I ;@;J;K;5"transparent;
i;
i;
i; [ +width;@;3;4;@;5o;Q;R@;@;S[ +;
io;I ;@;J;K;5" +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +2.5px;5f2.5;
io;I ;@;J;K;5" +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +width;@;3;4;@;5o;Q;R@;@;S[ +solid;
io;I ;@;J;K;5"transparent;
i;
i;
i; [ +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +solid;
io;I ;@;J;K;5"transparent;
i;
i;
i; [ +width;@;3;4;@;5o;Q;R@;@;S[ +solid;
io;I ;@;J;K;5"transparent;
i;
i;
i; [ +solid;
io;? ;@;@{ ;Ai;Bi;Ci;Di;50;
i;
i;
i; [ +solid;
i diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/roomlist.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/roomlist.sassc Binary files differnew file mode 100644 index 0000000..5bbfb43 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/roomlist.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/screen.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/screen.sassc new file mode 100644 index 0000000..5f6fba9 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/screen.sassc @@ -0,0 +1,1281 @@ +3.1.7 (Brainy Betty) +41c3aa6f199c6bf0e0c4cd6e5723f521d3b9c545 +o:Sass::Tree::RootNode :@template":@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width +body + font-family: trebuchet ms, helvetica, arial, sans-serif + width: 100% + height: 100% + overflow: hidden + background: #000 +#bg + position: fixed + top: 0 + left: 0 + opacity: 1 + z-index: -3 + width: 100% + height: 100% +#bg img + width: 100% + height: 100% + -ms-interpolation-mode: nearest-neighbor + image-rendering: -moz-crisp-edges + image-rendering: -webkit-optimize-contrast +#loading + z-index: 20 + background: transparent + color: #06033c + text-shadow: #060363 0 0 50px + display: block + position: fixed + width: 100% + padding: 20px + top: 30% + left: 10% + font-size: 170px + font-weight: bold + text-align: left + white-space: no-wrap + letter-spacing: -3px + pointer-events: none + +#msg + z-index: 100 + position: fixed + top: 10px + right: 10px + padding: 5px + width: 350px + max-height: 80% + font-size: 12px + background-color: #eeeeee + overflow-y: scroll + overflow-x: hidden + color: #333 + strong + color: #859900 + em + color: #dc322f + b + color: #002b36 +#player + padding: 10px + position: absolute + background: #000 + #projector + display: block + position: absolute + background-color: #000 + #screen + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 19 + #soundcloud, #audio + position: absolute + top: 0 + right: 0 + background-color: #000 + z-index: 21 + #soundcloud-dl, #audio-dl + position: absolute + top: 81px + right: 0 + width: 81px + padding: 5px 0 5px 0 + font-size: 13px + text-align: center + background-color: #000 + * + color: #839496 + z-index: 20 + #soundcloud-img, #audio-img + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + img + max-width: 100% + min-height: 100% + max-height: 100% + #ytscreen + z-index: 19 + position: absolute + top: 0 + left: 0 + #video-title + position: absolute + bottom: 0 + left: 0 + color: #fff + z-index: 20 + #video-title.fullscreen + position: fixed + bottom: 90px + left: auto + right: 30px + font-size: 24px + #projimg + width: 100% + height: 100% + nav#controls + z-index: 40 + position: absolute + #video-link + color: #839496 + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #e4b + #like.liked + color: #44f + #mute.muted + background-color: #fff + color: #000 +#playlistbg + position: absolute + background-color: #000 + opacity: 0.3 +#playlist + position: absolute + z-index: 90 + width: 100% + overflow-y: auto + overflow-x: hidden + ul#queue + // overflow-y: none + // &:hover + // overflow-y: auto + width: 100% + li + padding: 5px + display: block + cursor: pointer + border-bottom: 1px solid #333 + span.title + color: #ddd + display: block + padding: 5px + z-index: 1 + &:hover + color: #d8f + cursor: pointer + a.user + float: right + font-size: 14px + padding: 0 5px + color: #d33682 + padding: 5px + z-index: 2 + text-decoration: none + span.like + float: right + font-size: 14px + color: #657b83 + padding: 5px + z-index: 3 + span.like.liked + color: #c357a3 + li.playing + background-color: #222 + span.title + color: #fff +#room, user + padding: 10px + label + color: #657b83 + width: 100px + text-align: right + padding-right: 5px + display: inline-block + span + color: #073642 + + +#curtain + background: #080810 + opacity: 0.3 + width: 100% + height: 100% + position: fixed + top: 0 + left: 0 + z-index: 10 + display: none +#login + background: #000 + display: block + width: 50% + top: 20% + left: 50% + margin-left: -25% + padding: 30px + padding-bottom: 60px + z-index: 20 + position: fixed + text-align: center + box-shadow: 0 5px 10px #000 + img + margin-bottom: 20px + label + min-width: 20% + display: inline-block + text-align: right + padding-right: 10px + font-size: 18px + color: #fff + #button-shim + width: 30% + display: inline-block + text-align: left + padding: 10px 10px 10px 0 + margin-right: 20px + button + padding: 2px 5px + #login-username, #login-password + width: 30% + margin-right: 10px + font-size: 24px + border: 2px solid #806 + padding: 10px + a + color: #68f + text-decoration: underline +#sitez + position: fixed + top: 24px + right: 30px + color: #888 + z-index: 82 + color: #aaa + a, #logout + cursor: pointer + color: #aaa + text-decoration: underline + select option + color: #666 + text-decoration: none + padding-right: 3px + button + font-size: 24px + background: #030303 + color: #fff + padding: 2px + a#faqlink + color: #8ff + div + cursor: pointer + display: inline-block + padding: 8px 8px 5px 8px + &:hover + @include rounded(10px 10px 3px 3px) + background-color: #333 + &.opened + @include rounded(10px 10px 3px 3px) + background-color: #333 +nav + z-index: 10 + margin: 0 auto + button, #video-link + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 14px + min-width: 40px + min-height: 20px + padding: 5px 5px + position: relative + top: -1px + #video-link + top: -2px + padding-bottom: 6px +#lunacy + z-index: 40 + background: #ddd + color: #000 + display: block + width: 700px + position: fixed + top: 20% + left: 50% + margin-left: -390px + opacity: 0.7 + padding: 40px + text-align: center + font-size: 48px +#plea + z-index: 30 + background: #ddd + color: #000 + display: block + width: 400px + position: fixed + top: 20% + left: 50% + margin-left: -240px + opacity: 0.7 + padding: 40px + text-align: center + font-size: 48px + +#logobg + position: fixed + top: 10px + left: 0 + width: 100% + height: 64px + background-color: #000 + opacity: 0.8 + z-index: 45 +#logo + position: fixed + top: 10px + z-index: 46 + left: 10px + a + float: left + display: inline-block + img + display: inline-block + #scanjam + padding: 10px 15px 10px 0 + #preamble + display: inline-block + font-size: 12px + color: #fff + max-width: 80px + padding-left: 15px + h1 + padding: 15px 15px 0 10px + font-size: 34px + color: #fff + font-weight: normal + font-style: italic + font-family: georgia, garamond, serif + color: #8ff + display: inline-block + h2 + display: inline-block + font-size: 16px + color: #fff + position: relative + left: 20px + top: -5px + color: #839496 + a + display: inline + float: none + color: #268bd2 + img + max-height: 20px + max-width: 20px + display: inline-block + h2.preamblish + font-size: 12px + color: #fff + max-width: 250px + left: 0 + top: 9px + padding-right: 20px + h2.radio + a + color: #def + font-size: 12px + top: -8px + left: 30px + #likebutton + display: inline-block + display: none + position: relative + top: -5px + width: 90px + height: 21px + z-index: -1 +#glasspopcornlogo + position: absolute + top: 80px + left: 15px + pointer-events: none + opacity: 0.5 + z-index: 8 + img + z-index: 8 + pointer-events: none +#likereport + position: fixed + width: 100px + padding: 20px + z-index: 100 + overflow-y: hidden + a + background-color: #222 + display: block + text-decoration: none + padding: 5px + opacity: 0.95 + +#form + position: fixed + bottom: 10px + left: 10px + padding: 10px 10px 10px 10px + background-color: #000 + white-space: nowrap + z-index: 31 + #chat-message + border: 0 + outline: 0 + font-size: 18px + padding: 5px + margin-right: 5px + background-color: #f8f8f8 + &:hover + background-color: #ffffff + button + margin: 0 + outline: 0 + border: 0 + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + // @include rounded(2px) + padding: 4px 6px + position: relative + top: 1px + font-size: 20px + #videochat-badge + cursor: auto + pointer-events: none + @include rounded(8px) + font-size: 10px + background-color: #f00 + color: #fff + position: absolute + width: 10px + height: 10px + text-align: center + padding: 2px 2px + display: none + z-index: 32 +#formbg + background-color: #000 + opacity: 0.7 + +#chatbg + position: fixed + bottom: 100px + left: 20px + padding: 10px + width: 600px + background-color: #000 + padding: 0 10px 5px 10px + opacity: 0.25 + z-index: 9 + +#chat + padding: 0 10px 5px 10px + position: fixed + font-size: 18px + line-height: 26px + vertical-align: bottom + overflow-y: hidden + overflow-x: hidden + background: transparent + z-index: 30 + a + opacity: 0.8 + color: #44bbff + text-decoration: underline + a.u + font-weight: normal + padding-right: 10px + display: inline-block + color: #ff0066 + opacity: 1 + text-decoration: none + min-width: 80px + overflow-x: hidden + font-size: 18px + line-height: 26px + vertical-align: bottom + a.pic + opacity: 1 + span + color: #f0fff0 + text-shadow: #000 0 0 2px + font-weight: bold + .ytlink + color: #88dddd + cursor: pointer + text-decoration: underline + text-shadow: none + text-shadow: #000 0 0 1px + opacity: 1 + .ytlink:hover + color: #dd66ff + text-decoration: underline + text-shadow: #000 0 0 1px + .ytlink.playing + color: #daf + font-weight: bold + text-decoration: none + .ytlink.playing::before + text-decoration: none + content: "\25b6 " + font-weight: bold + img + max-width: 350px + max-height: 400px + border: 0 + #shim + width: 10px + height: 500px +#chat.fullscreen + overflow-y: hidden + &:hover + overflow-y: hidden +#webcam-container + z-index: 100 + position: fixed + right: 500px + bottom: 100px + background-color: #000 + padding: 10px + display: none +#lastlogbg + position: fixed + background-color: #000 + opacity: 0.5 + padding: 10px + z-index: 31 +#lastlogbox + position: fixed + font-size: 14px + padding: 10px + z-index: 32 + h4 + font-size: 12px + font-weight: bold + color: #eee + padding-bottom: 5px + ul + border-top: 1px solid #000 +li.ll + list-style-type: none + a + color: #d0e0fe + padding: 5px 0 + border-bottom: 1px solid #000 + display: block + text-shadow: #000 0 0 2px + text-decoration: underline + font-size: 16px + font-weight: bold + +#flower + position: absolute + top: 0 + right: 10% + z-index: 50 + pointer-events: none + display: none +#plant + position: absolute + bottom: 0 + right: 50% + z-index: 50 + pointer-events: none + display: none +#msg + display: none +button + font-size: 24px + background: #030303 + color: #fff + padding: 2px +#settings-container, #rooms-container, #about-container, #videochat-container + position: fixed + top: 59px + @include rounded (10px) + right: 20px + z-index: 80 + width: 500px + background-color: #222 + color: #657b83 + display: none + box-shadow: 0 5px 10px #000 + .close + margin: 10px 10px 0 0 + float: right + color: #ded8c5 + width: 20px + height: 14px + font-size: 14px + padding: 3px 0 + text-align: center + vertical-align: middle + @include rounded(10px) + background-color: #000b16 + &:hover + color: #fff + cursor: pointer + #rooms-loading + margin: 10px + h5 + font-size: 16px + color: #93a1a1 + display: block + padding: 10px + background-color: #333 + @include rounded(10px 10px 0 0) + p + padding: 10px 10px 10px 10px + font-size: 14px + line-height: 18px + color: #b3c1c1 + background-color: #1b1b1f + label + margin: 2px 0 0 10px + font-size: 14px + color: #657b83 + width: 150px + text-align: right + padding-right: 5px + display: inline-block + span + margin: 2px 10px 0 0 + color: #839496 + font-size: 14px + span#room-mod-tag a + float: right + padding: 0 10px 10px 0 + display: block + color: #dc322f + span#gallery-link a + color: #268bd2 + padding: 0 10px 10px 0 + display: block + float: right + button + position: relative + left: 3px + input + margin: 2px 10px 0 0 + width: 100px + #room-topic, #room-bg, #room-bgreset + width: 300px + #room-settings-save + font-size: 14px + .shim + width: 1px + height: 10px + ul + text-decoration: none + cursor: pointer + li + list-style-type: none + padding: 10px + cursor: pointer + border-top: 1px solid #000 + background-color: transparent + text-decoration: none + font-size: 14px + color: #83a1a1 + &:hover + color: #fdf6e3 + a li + color: #83a1a1 + text-decoration: none + a + color: #83a1a1 + text-decoration: none +#rooms-container + right: 20px + z-index: 80 + width: 300px + max-height: 300px +#about-container + right: 20px + z-index: 80 + width: 300px +#videochat-container + right: 20px + z-index: 80 + width: 300px + display: none + cursor: pointer + #videochat-disable + display: none +#tokbox-embed + position: absolute + bottom: 10px + left: 10px + height: 150px + z-index: 80 + display: none + overflow-y: auto + #tokbox-publisher, #tokbox-subscribers + float: left + object + float: left + #tokbox-settings + position: absolute + top: 0 + right: 10px + padding: 5px + font-size: 12px + color: #bbb + background-color: black + text-align: right + button + padding: 2px + font-size: 12px + background-color: #333 + color: #888 + min-width: 30px + &.on + background-color: #d33 + color: #fff +.roomhello + width: 400px + color: #fff + padding: 10px + font-size: 18px + background-color: #000 + cursor: pointer + position: fixed + top: 85px + left: 15px + opacity: 0.9 +.modhello + width: 400px + color: #fff + padding: 5px + background-color: #000 + cursor: pointer + margin-top: 10px +.glitter + pointer-events: none + position: absolute + z-index: 23 + +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + +#search-terms + font-size: 14px + padding: 2px 2px + width: 200px + position: relative + top: -4px + left: -10px + background-image: url('/img/magnify.png') + background-position: right center + background-repeat: no-repeat + border: 0 + outline: 0 + background-color: #ddd + &:hover + background-color: #fff + &:focus + background-color: #fff +#search-results-container + position: fixed + top: 53px + right: 21px + z-index: 100 + width: 334px + border: 2px solid black + background: #333 + display: none + #search-loading + margin: 10px + #search-instructions + font-size: 11px + color: white + padding: 3px 3px 3px 38px + background-color: #000 + width: 100% + #search-results + height: 300px + width: 100% + overflow-x: hidden + overflow-y: scroll + li + clear: both + height: 54px + overflow: hidden + position: relative + // padding-right: 5px + div.thumb + width: 32px + height: 54px + float: left + background-position: center center + margin: 0 5px 0 0 + border-right: 2px solid black + cursor: pointer + h4 + white-space: nowrap + overflow: hidden + font-size: 14px + color: #fff + margin: 3px 0 3px 0 + cursor: pointer + span.metadata + cursor: pointer + display: block + width: 200px + border-bottom: 2px solid black + font-size: 12px + line-height: 15px + color: #bbb + opacity: 0.9 + a.preview + position: absolute + bottom: 3px + right: 5px + color: #268bd2 + text-decoration: underline + &:hover + background: black + opacity: 1.0 + +:
@options{ +@linei; [ +@name"rounded;@;T: +@args[[o:Sass::Script::Variable;" +width;{:project_name" +sass/: +cacheT:cache_location"?/var/www/vhosts/scannerjammer.com/sandbox/sass/.sass-cache:
importero: Sass::Importers::Filesystem: +@root"7/var/www/vhosts/scannerjammer.com/sandbox/sass/src:line_commentsT:original_filename@:output_style:compressed:filesystem_importerc Sass::Importers::Filesystem:cache_storeo:Sass::CacheStores::Chain:@caches[u:Sass::CacheStores::Memory +style;:
filename@:css_filename"J/var/www/vhosts/scannerjammer.com/sandbox/sass/stylesheets/screen.css: +quietT:syntax: sass:property_syntax0: loud[:identical:overwrite:create:load_paths[ o;;"7/var/www/vhosts/scannerjammer.com/sandbox/sass/srco;;"V/usr/local/lib/ruby/gems/1.8/gems/compass-0.11.5/frameworks/blueprint/stylesheetso;;"T/usr/local/lib/ruby/gems/1.8/gems/compass-0.11.5/frameworks/compass/stylesheetso:Compass::SpriteImporter: @uri" +width0;@;
i; [ o:Sass::Tree::PropNode
: +@tabsi +width;@;1" +width;
i;
i; [ +width;@;1" +width;
i ;
i ; [ +width;@;1" +width;
i +;
i +; [ +width;@;1" +width;
i;
i; [ +@rule[" body:@parsed_ruleso:"Sass::Selector::CommaSequence:
@members[o:Sass::Selector::Sequence;;[o:#Sass::Selector::SimpleSequence;;[o:Sass::Selector::Element :@namespace0;[" body;@;
i;@;
i;@;
i;@;
i; [ +o;2
;3i +comma;6[ o;@ ;@;A: +space;6[o:Sass::Script::String ;@: +@type:identifier;6"trebuchet;
i
o;D ;@;E;F;6"ms;
i
;
i
o;D ;@;E;F;6"helvetica;
i
o;D ;@;E;F;6" +arial;
i
o;D ;@;E;F;6"sans-serif;
i
;
i
;
i
; [ +width;@;4;5;@;6o:Sass::Script::Number:@denominator_units[ +alphai: +greeni +fixed;
i;
i; [ +width;@;4;5;@;6o;G;H[ +o;2
;3i +width;@;4;5;@;6o;G;H[ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;PiA;60;
i#;
i#; [ +block;
i%;
i%; [ +fixed;
i&;
i&; [ +width;@;4;5;@;6o;G;H[ +170px;6i;
i+;
i+; [ +fixed;
i4;
i4; [ +right;@;4;5;@;6o;G;H[ +;
i7;
i7; [ +width;@;4;5;@;6o;G;H[ +350px;6i^;
i8;
i8; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi8;Ni;Oi8;Pi8;60;
i>;
i>; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi7;Pi4;60;
iB;
iB; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi +o;2
;3i +block;
iJ;
iJ; [ +width;@;4;5;@;6o;G;H[ +audio;@;
iT;@;
iT;@;
iT;@;
iT; [ +o;2
;3i +right;@;4;5;@;6o;G;H@;@;I[ +right;@;4;5;@;6o;G;H@;@;I[ +width;@;4;5;@;6o;G;H[ +;
i_o;G;H@;@;I[ +;
i_o;G;H@;@;I[ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
id;
id; [ +width;@;4;5;@;6o;G;H[ +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iz;
iz; [ +o;2
;3i +fixed;
i};
i}; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +#like;9o;:;;[o;<;;[o;=;;[o;Q;[" like;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;OiI;Pi;60;
i;
i; [ +liked;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;MiI;Ni;OiI;Pi;60;
i;
i; [ +muted;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi +width;@;4;5;@;6o;G;H[ +queue;@;
i;@;
i;@;
i;@;
i; [ o:Sass::Tree::CommentNode
:@lines[ +@loud0;@;@:@silentT;6"8// overflow-y: none +// &:hover +// overflow-y: auto;
i; [ +width;@;4;5;@;6o;G;H[ +;
i;
i; [ +block;
i;
i; [ +solid;
io;K ;@;L{ ;Mi8;Ni;Oi8;Pi8;60;
i;
i;
i; [ +title;@;
i;@;
i;@;
i;@;
i; [ +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +block;
i;
i; [ +;
i;
i; [ +;[" +hover: @arg0;@;E: +class;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +float;@;4;5;@;6o;D ;@;E;F;6" +right;
i;
i; [ +;
i;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;;Pi;60;
i;
i; [ +;
i;
i; [ +o;2
;3i +float;@;4;5;@;6o;D ;@;E;F;6" +right;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mij;Ni;Oi{;Pi;60;
i;
i; [ +;
i;
i; [ +liked;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi\;Pi;60;
i;
i; [ +title;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +label;9o;:;;[o;<;;[o;=;;[o;> ;?0;[" +label;@;
i;@;
i;@;
i;@;
i; [ +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mij;Ni;Oi{;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +100px;6ii;
i;
i; [ +right;
i;
i; [ +;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;;PiG;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +fixed;
i;
i; [ +login;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +block;
i;
i; [ +width;@;4;5;@;6o;G;H[ +fixed;
i;
i; [ +;
io;G;H[ +label;9o;:;;[o;<;;[o;=;;[o;> ;?0;[" +label;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +right;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +;
i;
i;
i; [ +o;2
;3i +width;@;4;5;@;6o;G;H[ +solid;
io;K ;@;L{ ;Mi;Ni;Oi +color;@;4;5;@;6o;K ;@;L{ ;Mik;Ni;Oi;Pi;60;
i;
i; [ +sitez;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +fixed;
i +right;@;4;5;@;6o;G;H[ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;@;
i +o;=;;[o;> ;?0;["option;@;
i +;@;
i +;@;
i +;@;
i +; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mik;Ni;Oik;Pik;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +o;2
;3i +;
io;G;H[ +;[" +hover;Z0;@;E;[;
i;@;
i;@;
i;@;
i; [o:Sass::Tree::MixinNode:@keywords{ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i$;
i$; [ +;[" +hover;Z0;@;E;[;
i%;@;
i%;@;
i%;@;
i%; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i';
i'; [ +;
i,o;G;H[ +;
i,;
i,;
i,; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi +block;
i6;
i6; [ +width;@;4;5;@;6o;G;H[ +700px;6i;
i7;
i7; [ +fixed;
i8;
i8; [ +#plea;9o;:;;[o;<;;[o;=;;[o;Q;[" plea;@;
i@;@;
i@;@;
i@;@;
i@; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi +block;
iD;
iD; [ +width;@;4;5;@;6o;G;H[ +400px;6i;
iE;
iE; [ +fixed;
iF;
iF; [ +fixed;
iP;
iP; [ +width;@;4;5;@;6o;G;H[ +#logo;9o;:;;[o;<;;[o;=;;[o;Q;[" logo;@;
iX;@;
iX;@;
iX;@;
iX; [o;2
;3i +fixed;
iY;
iY; [ +float;@;4;5;@;6o;D ;@;E;F;6" left;
i^;
i^; [ +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
ig;
ig; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
im;
im; [ +serif;
ip;
ip;
ip; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iq;
iq; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iv;
iv; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iz;
iz; [ +float;@;4;5;@;6o;D ;@;E;F;6" none;
i};
i}; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi+;Ni;Oi;Pi;60;
i~;
i~; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +250px;6i;
i;
i; [ +radio;@;
i;@;
i;@;
i;@;
i; [ o;7
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +fixed;
i;
i; [ +width;@;4;5;@;6o;G;H[ +100px;6ii;
i;
i; [ +o;2
;3i +block;
i;
i; [ +;
i;
i; [ +#form;9o;:;;[o;<;;[o;=;;[o;Q;[" form;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +fixed;
i;
i; [ +;
i;
i; [ +;
i;
i; [ +;[" +hover;Z0;@;E;[;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;[" +hover;Z0;@;E;[;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +fixed;
i;
i; [ +100px;6ii;
i;
i; [ +width;@;4;5;@;6o;G;H[ +600px;6iX;
i;
i; [ +;
io;G;H[ +#chat;9o;:;;[o;<;;[o;=;;[o;Q;[" chat;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +;
io;G;H[ +fixed;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;MiI;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi +a.pic;9o;:;;[o;<;;[o;=;;[o;> ;?0;["a;@;
io;S;["pic;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;
i +; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;[" +hover;Z0;@;E;[;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oik;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;["before;Z0;@;E:element;
i;@;
i;@;
i;@;
i; [o;2
;3i +350px;6i^;
i;
i; [ +400px;6i;
i ;
i ; [ +#shim;9o;:;;[o;<;;[o;=;;[o;Q;[" shim;@;
i";@;
i";@;
i";@;
i"; [o;2
;3i +width;@;4;5;@;6o;G;H[ +500px;6i;
i$;
i$; [ +;[" +hover;Z0;@;E;[;
i';@;
i';@;
i';@;
i'; [o;2
;3i +fixed;
i+;
i+; [ +right;@;4;5;@;6o;G;H[ +500px;6i;
i,;
i,; [ +100px;6ii;
i-;
i-; [ +o;2
;3i +fixed;
i2;
i2; [ +fixed;
i8;
i8; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i?;
i?; [ +;
i@;
i@; [ +solid;
iBo;K ;@;L{ ;Mi +li.ll;9o;:;;[o;<;;[o;=;;[o;> ;?0;["li;@;
iCo;S;["ll;@;
iC;@;
iC;@;
iC;@;
iC; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iF;
iF; [ +;
iGo;G;H@;@;I[ +solid;
iHo;K ;@;L{ ;Mi +block;
iI;
iI; [ +right;@;4;5;@;6o;G;H[ +plant;@;
iV;@;
iV;@;
iV;@;
iV; [o;2
;3i +right;@;4;5;@;6o;G;H[ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
ib;
ib; [ +fixed;
ie;
ie; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +500px;6i;
ij;
ij; [ +color;@;4;5;@;6o;K ;@;L{ ;Mij;Ni;Oi{;Pi;60;
il;
il; [ +;
ino;G;H[ +close;@;
io;@;
io;@;
io;@;
io; [o;2
;3i +float;@;4;5;@;6o;D ;@;E;F;6" +right;
iq;
iq; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
ir;
ir; [ +width;@;4;5;@;6o;G;H[ +;[" +hover;Z0;@;E;[;
i{;@;
i{;@;
i{;@;
i{; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i|;
i|; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +block;
i;
i; [ +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +label;9o;:;;[o;<;;[o;=;;[o;> ;?0;[" +label;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mij;Ni;Oi{;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +150px;6i;
i;
i; [ +right;
i;
i; [ +;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +float;@;4;5;@;6o;D ;@;E;F;6" +right;
i;
i; [ +block;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi7;Pi4;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi+;Ni;Oi;Pi;60;
i;
i; [ +block;
i;
i; [ +float;@;4;5;@;6o;D ;@;E;F;6" +right;
i;
i; [ +input;9o;:;;[o;<;;[o;=;;[o;> ;?0;[" +input;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +width;@;4;5;@;6o;G;H[ +100px;6ii;
i;
i; [ +width;@;4;5;@;6o;G;H[ +300px;6i,;
i;
i; [ +.shim;9o;:;;[o;<;;[o;=;;[o;S;[" shim;@;
i;@;
i;@;
i;@;
i; [o;2
;3i +width;@;4;5;@;6o;G;H[ +o;2
;3i +solid;
io;K ;@;L{ ;Mi +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +;[" +hover;Z0;@;E;[;
i;@;
i;@;
i;@;
i; [o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +300px;6i,;
i;
i; [ +300px;6i,;
i;
i; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +300px;6i,;
i;
i; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +300px;6i,;
i;
i; [ +150px;6i;
i;
i; [ +float;@;4;5;@;6o;D ;@;E;F;6" left;
i;
i; [ +float;@;4;5;@;6o;D ;@;E;F;6" left;
i;
i; [ +right;@;4;5;@;6o;G;H[ +;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +right;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +width;@;4;5;@;6o;G;H[ +400px;6i;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i; [ +fixed;
i;
i; [ +width;@;4;5;@;6o;G;H[ +400px;6i;
i;
i; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i +;
i;
i; [ +;@;
i +;@;
i +;@;
i +; [o;2
;3i +width;@;4;5;@;6o;G;H@;@;I[ +4.5px;6f4.5;
i
o;D ;@;E;F;6" +solid;
i
o;D ;@;E;F;6"transparent;
i
;
i
;
i
; [ +9.5px;6f9.5;
io;D ;@;E;F;6" +solid;
io;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i;
i; [ +4.5px;6f4.5;
io;D ;@;E;F;6" +solid;
io;D ;@;E;F;6"transparent;
i;
i;
i; [ +width;@;4;5;@;6o;G;H@;@;I[ +;
io;D ;@;E;F;6" +solid;
io;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i;
i; [ +2.5px;6f2.5;
io;D ;@;E;F;6" +solid;
io;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i;
i; [ +solid;
io;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i;
i; [ +width;@;4;5;@;6o;G;H@;@;I[ +solid;
io;D ;@;E;F;6"transparent;
i;
i;
i; [ +solid;
io;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i;
i;
i; [ +solid;
io;D ;@;E;F;6"transparent;
i;
i;
i; [ +width;@;4;5;@;6o;G;H@;@;I[ +solid;
i#o;D ;@;E;F;6"transparent;
i#;
i#;
i#; [ +solid;
i$o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
i$;
i$;
i$; [ +solid;
i%o;D ;@;E;F;6"transparent;
i%;
i%;
i%; [ +width;@;4;5;@;6o;G;H[ +200px;6i;
i+;
i+; [ +-10px;6i;
i.;
i.; [ +;]{ +right;
i0o;D ;@;E;F;6"center;
i0;
i0;
i0; [ +;[" +hover;Z0;@;E;[;
i5;@;
i5;@;
i5;@;
i5; [o;2
;3i +;[" +focus;Z0;@;E;[;
i7;@;
i7;@;
i7;@;
i7; [o;2
;3i +fixed;
i:;
i:; [ +right;@;4;5;@;6o;G;H[ +width;@;4;5;@;6o;G;H[ +334px;6iN;
i>;
i>; [ +solid;
i?o;K ;@;L{ ;Mi +o;2
;3i +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
iF;
iF; [ +width;@;4;5;@;6o;G;H[ +o;2
;3i +300px;6i,;
iK;
iK; [ +width;@;4;5;@;6o;G;H[ +clear;@;4;5;@;6o;D ;@;E;F;6" both;
iP;
iP; [ +thumb;@;
iU;@;
iU;@;
iU;@;
iU; [o;2
;3i +width;@;4;5;@;6o;G;H[ +float;@;4;5;@;6o;D ;@;E;F;6" left;
iX;
iX; [ +;
iZo;G;H@;@;I[ +solid;
i[o;K ;@;L{ ;Mi +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
ia;
ia; [ +block;
if;
if; [ +width;@;4;5;@;6o;G;H[ +200px;6i;
ig;
ig; [ +solid;
iho;K ;@;L{ ;Mi +color;@;4;5;@;6o;K ;@;L{ ;Mi;Ni;Oi;Pi;60;
ik;
ik; [ +o;2
;3i +right;@;4;5;@;6o;G;H[ +;
ip;
ip; [ +color;@;4;5;@;6o;K ;@;L{ ;Mi+;Ni;Oi;Pi;60;
iq;
iq; [ +;[" +hover;Z0;@;E;[;
is;@;
is;@;
is;@;
is; [o;2
;3i diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sewergreats.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sewergreats.sassc Binary files differnew file mode 100644 index 0000000..3357d68 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sewergreats.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_main.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_main.sassc Binary files differnew file mode 100644 index 0000000..c8dcae6 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_main.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_player.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_player.sassc Binary files differnew file mode 100644 index 0000000..73f3239 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/sexydj_player.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/test.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/test.sassc Binary files differnew file mode 100644 index 0000000..1440dd7 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/test.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/tiny.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/tiny.sassc Binary files differnew file mode 100644 index 0000000..711c906 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/tiny.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/top.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/top.sassc Binary files differnew file mode 100644 index 0000000..7b69797 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/top.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest1.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest1.sassc Binary files differnew file mode 100644 index 0000000..f78709a --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest1.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest2.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest2.sassc Binary files differnew file mode 100644 index 0000000..4271e7a --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest2.sassc diff --git a/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest3.sassc b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest3.sassc Binary files differnew file mode 100644 index 0000000..d0c3dd9 --- /dev/null +++ b/frontend/static/sass/.sass-cache/644f2f2d5fca6dddf0ddfc92ac7e786fa6152755/vtest3.sassc diff --git a/frontend/static/sass/.sass-cache/8d1bbecbf03b462f4c6289df796a863187871fc8/_reset.scssc b/frontend/static/sass/.sass-cache/8d1bbecbf03b462f4c6289df796a863187871fc8/_reset.scssc Binary files differnew file mode 100644 index 0000000..4f281b6 --- /dev/null +++ b/frontend/static/sass/.sass-cache/8d1bbecbf03b462f4c6289df796a863187871fc8/_reset.scssc diff --git a/frontend/static/sass/.sass-cache/979cb0604153df91b26ad31e4a3968c997fc15e0/_utilities.scssc b/frontend/static/sass/.sass-cache/979cb0604153df91b26ad31e4a3968c997fc15e0/_utilities.scssc Binary files differnew file mode 100644 index 0000000..ba33dbc --- /dev/null +++ b/frontend/static/sass/.sass-cache/979cb0604153df91b26ad31e4a3968c997fc15e0/_utilities.scssc diff --git a/frontend/static/sass/.sass-cache/9ec6fa9d6c0b37ad8c4a639ff5b392374f95acc9/_utilities.scssc b/frontend/static/sass/.sass-cache/9ec6fa9d6c0b37ad8c4a639ff5b392374f95acc9/_utilities.scssc Binary files differnew file mode 100644 index 0000000..f4f01b9 --- /dev/null +++ b/frontend/static/sass/.sass-cache/9ec6fa9d6c0b37ad8c4a639ff5b392374f95acc9/_utilities.scssc diff --git a/frontend/static/sass/.sass-cache/aa657dc61a4d909775004a1ed5620272d7fbb16b/_reset.scssc b/frontend/static/sass/.sass-cache/aa657dc61a4d909775004a1ed5620272d7fbb16b/_reset.scssc Binary files differnew file mode 100644 index 0000000..c9970d4 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aa657dc61a4d909775004a1ed5620272d7fbb16b/_reset.scssc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/avatar.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/avatar.sassc Binary files differnew file mode 100644 index 0000000..9f8407f --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/avatar.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/calendar.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/calendar.sassc Binary files differnew file mode 100644 index 0000000..c085577 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/calendar.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/diornights.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/diornights.sassc Binary files differnew file mode 100644 index 0000000..0270bf2 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/diornights.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/embed.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/embed.sassc Binary files differnew file mode 100644 index 0000000..6afd6ac --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/embed.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/feederbleeder.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/feederbleeder.sassc Binary files differnew file mode 100644 index 0000000..6773b0a --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/feederbleeder.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/frederick.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/frederick.sassc Binary files differnew file mode 100644 index 0000000..d4aa292 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/frederick.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/gallery-white.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/gallery-white.sassc Binary files differnew file mode 100644 index 0000000..c8953b3 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/gallery-white.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/glitter.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/glitter.sassc Binary files differnew file mode 100644 index 0000000..125a8a5 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/glitter.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/ie.scssc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/ie.scssc Binary files differnew file mode 100644 index 0000000..cc5a38b --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/ie.scssc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/main.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/main.sassc Binary files differnew file mode 100644 index 0000000..bb6fc74 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/main.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/print.scssc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/print.scssc Binary files differnew file mode 100644 index 0000000..20cafa3 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/print.scssc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/profile.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/profile.sassc Binary files differnew file mode 100644 index 0000000..e9c2f25 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/profile.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/roomlist.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/roomlist.sassc Binary files differnew file mode 100644 index 0000000..040b28f --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/roomlist.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.sassc Binary files differnew file mode 100644 index 0000000..c7aa667 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.scssc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.scssc Binary files differnew file mode 100644 index 0000000..f438403 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/screen.scssc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sewergreats.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sewergreats.sassc Binary files differnew file mode 100644 index 0000000..804a3e8 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sewergreats.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_main.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_main.sassc Binary files differnew file mode 100644 index 0000000..4101611 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_main.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_player.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_player.sassc Binary files differnew file mode 100644 index 0000000..e91b803 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/sexydj_player.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/test.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/test.sassc Binary files differnew file mode 100644 index 0000000..a72448f --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/test.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/tiny.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/tiny.sassc Binary files differnew file mode 100644 index 0000000..8adb51c --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/tiny.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/top.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/top.sassc Binary files differnew file mode 100644 index 0000000..a8989a9 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/top.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest.sassc Binary files differnew file mode 100644 index 0000000..f366092 --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest1.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest1.sassc Binary files differnew file mode 100644 index 0000000..fb08d9c --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest1.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest2.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest2.sassc Binary files differnew file mode 100644 index 0000000..8b0d65e --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest2.sassc diff --git a/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest3.sassc b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest3.sassc Binary files differnew file mode 100644 index 0000000..3ef990f --- /dev/null +++ b/frontend/static/sass/.sass-cache/aaa7be21d89e0c59dac401ea2fc1869bdfa76e53/vtest3.sassc diff --git a/frontend/static/sass/.sass-cache/dc3c2ad9455a8346a847e74b89758086fe56fd21/_utilities.scssc b/frontend/static/sass/.sass-cache/dc3c2ad9455a8346a847e74b89758086fe56fd21/_utilities.scssc Binary files differnew file mode 100644 index 0000000..841cfc5 --- /dev/null +++ b/frontend/static/sass/.sass-cache/dc3c2ad9455a8346a847e74b89758086fe56fd21/_utilities.scssc diff --git a/frontend/static/sass/.sass-cache/e708b27684b7743d4ded18d0ddc82a270ca22e62/_reset.scssc b/frontend/static/sass/.sass-cache/e708b27684b7743d4ded18d0ddc82a270ca22e62/_reset.scssc Binary files differnew file mode 100644 index 0000000..8704630 --- /dev/null +++ b/frontend/static/sass/.sass-cache/e708b27684b7743d4ded18d0ddc82a270ca22e62/_reset.scssc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/avatar.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/avatar.sassc Binary files differnew file mode 100644 index 0000000..ed51a72 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/avatar.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/calendar.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/calendar.sassc Binary files differnew file mode 100644 index 0000000..30d9763 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/calendar.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/diornights.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/diornights.sassc Binary files differnew file mode 100644 index 0000000..e206d30 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/diornights.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/disaro.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/disaro.sassc Binary files differnew file mode 100644 index 0000000..b1a4a56 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/disaro.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/embed.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/embed.sassc Binary files differnew file mode 100644 index 0000000..e43306a --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/embed.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/feederbleeder.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/feederbleeder.sassc Binary files differnew file mode 100644 index 0000000..ea64774 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/feederbleeder.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/frederick.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/frederick.sassc Binary files differnew file mode 100644 index 0000000..3c26800 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/frederick.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/gallery-white.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/gallery-white.sassc Binary files differnew file mode 100644 index 0000000..b8bd078 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/gallery-white.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/glitter.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/glitter.sassc Binary files differnew file mode 100644 index 0000000..63f4007 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/glitter.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/ie.scssc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/ie.scssc Binary files differnew file mode 100644 index 0000000..ef0d5ea --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/ie.scssc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/main.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/main.sassc Binary files differnew file mode 100644 index 0000000..b9a2aac --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/main.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/print.scssc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/print.scssc Binary files differnew file mode 100644 index 0000000..315187b --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/print.scssc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/profile.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/profile.sassc Binary files differnew file mode 100644 index 0000000..283640e --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/profile.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/roomlist.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/roomlist.sassc Binary files differnew file mode 100644 index 0000000..5db7588 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/roomlist.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.sassc Binary files differnew file mode 100644 index 0000000..102f29a --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.scssc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.scssc Binary files differnew file mode 100644 index 0000000..6709109 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/screen.scssc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/sewergreats.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/sewergreats.sassc Binary files differnew file mode 100644 index 0000000..b9a2aac --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/sewergreats.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/test.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/test.sassc Binary files differnew file mode 100644 index 0000000..c76d494 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/test.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/tiny.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/tiny.sassc Binary files differnew file mode 100644 index 0000000..41c4f29 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/tiny.sassc diff --git a/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/top.sassc b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/top.sassc Binary files differnew file mode 100644 index 0000000..c625e12 --- /dev/null +++ b/frontend/static/sass/.sass-cache/f4fe17d0b25f3c47a894db7e72560c19b9e43ba3/top.sassc diff --git a/frontend/static/sass/config.rb b/frontend/static/sass/config.rb new file mode 100644 index 0000000..fa78bdd --- /dev/null +++ b/frontend/static/sass/config.rb @@ -0,0 +1,9 @@ +# Require any additional compass plugins here. +# Set this to the root of your project when deployed: +http_path = "/" +css_dir = "stylesheets" +sass_dir = "src" +images_dir = "images" +javascripts_dir = "javascripts" +# To enable relative paths to assets via compass helper functions. Uncomment: +# relative_assets = true diff --git a/frontend/static/sass/src/avatar.sass b/frontend/static/sass/src/avatar.sass new file mode 100644 index 0000000..790b4e8 --- /dev/null +++ b/frontend/static/sass/src/avatar.sass @@ -0,0 +1,56 @@ +table + float: left +.avatar-right + left: 250px +.message + vertical-align: top +.tri + vertical-align: top + height: 100% +.triangle-left + width: 0 + height: 0 + border-top: 10px solid transparent + border-bottom: 5px solid transparent + border-right: 25px solid #fff + position: relative + top: 10px + left: 5px + margin-left: -16px +.triangle-right + width: 0 + height: 0 + border-top: 10px solid transparent + border-bottom: 5px solid transparent + border-left: 25px solid #fff + position: relative + top: 10px + margin-left: -12px +.message .message-blurb + box-shadow: 2px 2px 10px #123 + max-width: 250px + font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif + background-color: #fff + border-top: 2px solid #f0f0f8 + border-left: 2px solid #ebeeef + border-right: 2px solid #ddd + border-bottom: 2px solid #ddd + -moz-border-radius: 20px + -webkit-border-radius: 20px + padding: 10px + color: #222 + word-wrap: break-word +#chat img + max-width: 250px + max-height: 250px +#chat .ytlink:hover + color: #f3c +#chat .ytlink + color: #c3d +#chat .ytlink.playing + color: #60b +div.frame + display: inline-block + padding: 2px + height: 300px + overflow: visible diff --git a/frontend/static/sass/src/calendar.sass b/frontend/static/sass/src/calendar.sass new file mode 100644 index 0000000..ffb19d0 --- /dev/null +++ b/frontend/static/sass/src/calendar.sass @@ -0,0 +1,87 @@ +body + background-color: #f8f8f8 + overflow: hidden +#calendar + position: absolute + * + font-size: 18px + z-index: 10 +#playlist ul#queue li.playing + span.score + color: #bbb +#playlist ul#queue li + span.score + color: #333 + span.title + color: #222 +#player + z-index: 6 +#playlistbg + z-index: 7 + background-color: #f8f8f8 +#water-cooler + position: fixed + bottom: -10px + left: -30px + height: 500px + z-index: 7 +#office-plant + position: fixed + bottom: 20px + left: 160px + z-index: 8 +#carpet + position: fixed + width: 100% + height: 70px + bottom: 0 + left: 0 + background-color: white + z-index: 6 +#bg + opacity: 0.1 + display: none +#likebutton + position: fixed + right: 20px + top: 30px + opacity: 0.7 +#calendar + z-index: 10 + box-shadow: #666 5px 5px 10px + display: none +#logo h1 + color: #b8d +#player #projector #video-title + bottom: 5px + left: 5px +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + diff --git a/frontend/static/sass/src/diornights.sass b/frontend/static/sass/src/diornights.sass new file mode 100644 index 0000000..e52d602 --- /dev/null +++ b/frontend/static/sass/src/diornights.sass @@ -0,0 +1,88 @@ +@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width + +html + height: 100% + width: 100% +body + font-family: trebuchet ms, helvetica, arial, sans-serif + width: 100% + height: 100% + overflow-x: hidden + background: #fff + background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.28, rgb(255,255,255)), color-stop(0.64, rgb(250,247,250))) + background-image: -moz-linear-gradient( center bottom, rgb(255,255,255) 28%, rgb(250,247,250) 64%) + background-attachment: fixed + font-size: 11px + font-family: "lucida grande",tahoma,verdana,arial,sans-serif + color: #333 +#bg + position: fixed + top: 0 + left: 0 + opacity: 1 + z-index: -3 + width: 100% + height: 100% +#bg img + width: 100% + height: 100% + -ms-interpolation-mode: nearest-neighbor + image-rendering: -moz-crisp-edges + image-rendering: -webkit-optimize-contrast +#container + position: absolute + top: 0 + left: 50% + width: 950px + min-height: 100% + margin-left: -475px + background: #fff + padding-bottom: 2000px + // border-right: 1px solid #eee + // border-left: 1px solid #eee +#header + width: 100% + #logo + height: 160px + #likebutton + position: absolute + top: 80px + right: 30px +#menu + width: 100% + border-top: 1px solid #eee + border-bottom: 1px solid #eee + ul + li + display: inline-block + width: (918px/6) + padding: 5px 0 5px 0px + text-align: center + a + color: #333 + text-decoration: none + display: block + &:hover + color: #33f +.box + width: 300px + margin: 10px 0 0 10px + img + width: 100% + opacity: 0.9 + &:hover + opacity: 1.0 + &#feed + ul + li + display: inline-block + height: 32px + vertical-align: middle + img + width: 32px + height: 32px diff --git a/frontend/static/sass/src/disaro.sass b/frontend/static/sass/src/disaro.sass new file mode 100644 index 0000000..d4641ce --- /dev/null +++ b/frontend/static/sass/src/disaro.sass @@ -0,0 +1,29 @@ +#chat + text-align: center + img + width: 500px + max-width: none + max-height: none + border: 10px solid black + margin: 10px auto 0 + margin-right: 100px + a.u + font-size: 14px + min-width: 100px + letter-spacing: -1px + text-align: right + padding-right: 20px + * + font-size: 14px + .chatline + width: 510px + background-color: black + padding: 5px + text-align: left + margin: 0 auto + opacity: 0.9 + margin-right: 100px + span + color: #666 + text-shadow: none + font-weight: normal diff --git a/frontend/static/sass/src/embed.sass b/frontend/static/sass/src/embed.sass new file mode 100644 index 0000000..abce351 --- /dev/null +++ b/frontend/static/sass/src/embed.sass @@ -0,0 +1,96 @@ +body + background: #000 + overflow: hidden +#logo,#form,#logobg,#sitez + opacity: 0 + z-index: -20 +#lastlogbox *, #lastlogbox h4 + font-size: 12px + padding: 1px +#lastlogbox + padding: 1px +#chat + font-size: 6px + line-height: 120% + overflow-y: hidden + a.u + min-width: 10px + img + max-height: 30px + max-width: 30px +#player + padding: 0 + margin: 0 +#player *,#playlist *,#queue * + font-size: 12px +#playlist ul#queue li + padding: 1px + &.playing + background-color: #657 +#playlist ul#queue li span.like + display: none +#playlist ul#queue li a.user + font-size: 10px +#playlist + overflow-y: hidden +#queue + overflow-y: scroll +nav + button + font-size: 12px + padding: 1px + overflow: hidden + position: relative + top: 3px + left: 3px + #video-link + position: relative + top: 2px + left: 3px + padding: 4px + font-size: 10px +#player nav#controls + span.instructions + font-size: 11px + color: #ddd + position: relative + top: 3px + left: 5px +#player nav#controls + z-index: 90 + overflow: visible +#player #projector #video-title + bottom: 10px + left: 2px +*,#chat + overflow: hidden +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + diff --git a/frontend/static/sass/src/feederbleeder.sass b/frontend/static/sass/src/feederbleeder.sass new file mode 100644 index 0000000..d4641ce --- /dev/null +++ b/frontend/static/sass/src/feederbleeder.sass @@ -0,0 +1,29 @@ +#chat + text-align: center + img + width: 500px + max-width: none + max-height: none + border: 10px solid black + margin: 10px auto 0 + margin-right: 100px + a.u + font-size: 14px + min-width: 100px + letter-spacing: -1px + text-align: right + padding-right: 20px + * + font-size: 14px + .chatline + width: 510px + background-color: black + padding: 5px + text-align: left + margin: 0 auto + opacity: 0.9 + margin-right: 100px + span + color: #666 + text-shadow: none + font-weight: normal diff --git a/frontend/static/sass/src/frederick.sass b/frontend/static/sass/src/frederick.sass new file mode 100644 index 0000000..4bc0857 --- /dev/null +++ b/frontend/static/sass/src/frederick.sass @@ -0,0 +1,4 @@ +#chat + span + color: #004b27 + text-shadow: 0 0 2px #fff diff --git a/frontend/static/sass/src/gallery-white.sass b/frontend/static/sass/src/gallery-white.sass new file mode 100644 index 0000000..f51853a --- /dev/null +++ b/frontend/static/sass/src/gallery-white.sass @@ -0,0 +1,220 @@ +body + background: #fff +#loading + background: transparent + color: #e6f0f0 + text-shadow: #e6f0f0 0 0 50px +#player + background: #fff + #projector + background-color: #000 + #video-title + color: #fff + #video-title.fullscreen + #projimg + nav#controls + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #fae + #like.liked + color: #88f +#playlistbg + background-color: #fff +#playlist + ul#queue + li + border-bottom: 1px solid #ddd + span.title + color: #333 + a.user + color: #d33682 + span.like + color: #657b83 + span.like.liked + color: #c357a3 + li.playing + background-color: #333 + span.title + color: #fff +#curtain + background: #080810 + opacity: 0.3 +#login + background: #fff + box-shadow: 0 5px 10px #000 + img + label + color: #000 + #button-shim + button + padding: 2px 5px + #login-username, #login-password + border: 2px solid #806 + a + color: #68f +#sitez + div + &:hover + background-color: #333 + &.opened + background-color: #333 +nav + button + background-color: #888 +#logobg + background-color: #000 + opacity: 0.7 +#logo + a + img + #scanjam + h1 + color: #8ff + h2 + color: #839496 + a + color: #268bd2 + img + #likebutton +#likereport + a + background-color: #222 + opacity: 0.95 +#form + background-color: #fff + #chat-message + border: 1px solid #333 + button + background-color: #ddd + color: #333 + &:hover + background-color: #c8cbd6 +#formbg + background-color: #fff + opacity: 0.7 +#chatbg + background-color: #fff + opacity: 0.1 +#chat + background: transparent + a + color: #4444ff + a.u + color: #ff0066 + opacity: 0.9 + a.pic + opacity: 1 + span + color: #333 + text-shadow: #000 0 0 0 + .ytlink + color: #8aaab3 + text-shadow: #000 0 0 0 + .ytlink:hover + color: #11182f + text-shadow: #000 0 0 0 + .ytlink.playing + color: #c2b + .ytlink.playing::before + img + #shim +#lastlogbg + background-color: #fff + opacity: 0.3 +#lastlogbox + opacity: 0.8 + h4 + color: #666 + ul + border-top: 1px solid #ddd +li.ll + a + color: #4a5a73 + border-bottom: 1px solid #ddd + text-shadow: #000 0 0 0 +#flower +#plant +button + background: #ddd + color: #333 +#settings-container, #rooms-container, #about-container + background-color: #222 + color: #657b83 + .close + color: #ded8c5 + background-color: #000b16 + &:hover + color: #fff + #rooms-loading + h5 + color: #93a1a1 + background-color: #333 + p + color: #b3c1c1 + background-color: #1b1b1f + label + color: #657b83 + span + color: #839496 + input + #room-topic, #room-bg, #room-bgreset + #room-settings-save + .shim + ul + li + border-top: 1px solid #000 + color: #83a1a1 + &:hover + color: #fdf6e3 + a li + color: #83a1a1 + a + color: #83a1a1 +#rooms-container +#about-container + +#chat + text-align: center + img + width: 520px + max-width: none + max-height: none + border: 0 + margin: 0 auto + a.u + font-size: 14px + min-width: 100px + letter-spacing: -1px + text-align: right + padding-right: 20px + a.pic + padding: 0 + margin: 0 + * + font-size: 14px + .chatimg + margin: 0 auto + padding: 0 + .chatline + width: 510px + background-color: #fff + padding: 2px 5px 2px 5px + line-height: 16px + text-align: left + margin: 0 auto + opacity: 0.9 + span + color: #666 + text-shadow: none + font-weight: normal +#logo + h2#topic + left: 5px + #likebutton + position: relative + left: 30px diff --git a/frontend/static/sass/src/glitter.sass b/frontend/static/sass/src/glitter.sass new file mode 100644 index 0000000..fd5e463 --- /dev/null +++ b/frontend/static/sass/src/glitter.sass @@ -0,0 +1,18 @@ +#chat *, #chat span, #chat span a + font-size: 30px + line-height: 38px + text-shadow: #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px, #000 0 0 5px + font-family: papyrus, comic sans, comic sans ms, sans-serif + letter-spacing: -1px + overflow: hidden +#heading img + position: relative + top: -35px + left: -18px + z-index: 47 +#likebutton + position: relative + top: -90px + left: -16px +#chat a.u + font-size: 24px diff --git a/frontend/static/sass/src/ie.scss b/frontend/static/sass/src/ie.scss new file mode 100644 index 0000000..5cd5b6c --- /dev/null +++ b/frontend/static/sass/src/ie.scss @@ -0,0 +1,5 @@ +/* Welcome to Compass. Use this file to write IE specific override styles. + * Import this file using the following HTML or equivalent: + * <!--[if IE]> + * <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" /> + * <![endif]--> */ diff --git a/frontend/static/sass/src/main.sass b/frontend/static/sass/src/main.sass new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/sass/src/main.sass diff --git a/frontend/static/sass/src/print.scss b/frontend/static/sass/src/print.scss new file mode 100644 index 0000000..b0e9e45 --- /dev/null +++ b/frontend/static/sass/src/print.scss @@ -0,0 +1,3 @@ +/* Welcome to Compass. Use this file to define print styles. + * Import this file using the following HTML or equivalent: + * <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */ diff --git a/frontend/static/sass/src/profile.sass b/frontend/static/sass/src/profile.sass new file mode 100644 index 0000000..0d88ea5 --- /dev/null +++ b/frontend/static/sass/src/profile.sass @@ -0,0 +1,514 @@ +@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width + +body + background: #888 + // overflow-y: scroll + overflow-y: hidden + overflow-x: hidden + font-family: trebuchet ms, sans-serif +#logo + position: absolute + z-index: 20 + top: 15px + left: 20px + a + display: inline-block + img + padding-top: 5px + display: inline-block + h1 + position: relative + top: -10px + left: 10px + font-size: 34px + font-weight: normal + font-style: italic + font-family: georgia, garamond, serif + color: #f8b + display: inline-block + h2 + position: relative + display: inline-block + font-size: 12px + color: #fff + max-width: 250px + left: 10px + top: -6px + padding-right: 20px +#logobg + position: absolute + top: 10px + left: 0 + width: 100% + height: 64px + background-color: #000 + opacity: 0.8 + z-index: 19 +#likebutton + display: inline-block + display: none + z-index: -1 + min-width: 90px + a + color: #33f +#flower + position: absolute + top: 0 + right: 10% + z-index: 20 + pointer-events: none + display: none +#contact + position: absolute + left: 0 + display: none + #avatar, .avatar + display: none + width: 100% + // max-height: 300px + .avatar + display: block + #bio + p + color: #ddd + background-color: #000 + padding: 10px 5px + text-align: center + opacity: 0.7 + a + color: #ebf + display: block + img + width: 100% + // max-height: 300px +#sitez + position: absolute + top: 30px + right: 20px + text-align: right + z-index: 20 + div + color: #ddd + cursor: pointer + display: inline-block + padding: 4px 8px 4px 8px + float: left + a + color: #bbc + div#settings-hook + &:hover + @include rounded(10px 10px 3px 3px) + background-color: #333 + color: #fff + &.opened + @include rounded(10px 10px 3px 3px) + background-color: #333 + color: #fff + display: none + z-index: 82 +#fullscreen-warning + position: fixed + top: 50% + left: 50% + width: 600px + margin-left: -300px + margin-top: -20px + text-align: center + font-size: 24px + padding: 10px + background-color: rgba(0,0,0,0.5) + color: white + z-index: 100 + display: none +#settings-container + position: fixed + top: 53px + @include rounded (10px) + right: 20px + z-index: 80 + width: 500px + background-color: #222 + color: #657b83 + display: none + box-shadow: 0 5px 10px #000 + .close + margin: 10px 10px 0 0 + float: right + color: #ded8c5 + width: 20px + height: 14px + font-size: 14px + padding: 3px 0 + text-align: center + vertical-align: middle + @include rounded(10px) + background-color: #000b16 + &:hover + color: #fff + cursor: pointer + #rooms-loading + margin: 10px + h5 + font-size: 16px + color: #93a1a1 + display: block + padding: 10px + background-color: #333 + @include rounded(10px 10px 0 0) + p + padding: 10px 10px 10px 10px + font-size: 14px + line-height: 18px + color: #b3c1c1 + background-color: #1b1b1f + label + margin: 2px 0 0 10px + font-size: 14px + color: #657b83 + width: 150px + text-align: right + padding-right: 5px + display: inline-block + span + margin: 2px 10px 0 0 + color: #839496 + font-size: 14px + input + margin: 2px 10px 0 0 + width: 100px + #profile-avatar, #profile-bg + width: 300px + #profile-settings-save + font-size: 14px + textarea + width: 300px + height: 150px + .shim + width: 1px + height: 10px + ul + text-decoration: none + cursor: pointer + li + list-style-type: none + padding: 10px + cursor: pointer + border-top: 1px solid #000 + background-color: transparent + text-decoration: none + font-size: 14px + color: #83a1a1 + &:hover + color: #fdf6e3 + a li + color: #83a1a1 + text-decoration: none + a + color: #83a1a1 + text-decoration: none +#msg + z-index: 100 + position: fixed + top: 10px + right: 10px + padding: 5px + width: 250px + max-height: 80% + font-size: 12px + background-color: #eeeeee + overflow-y: scroll + overflow-x: hidden + color: #333 + strong + color: #859900 + em + color: #dc322f + b + color: #002b36 +#player + padding: 10px + position: absolute + background: #000 + #projector + display: block + position: fixed + background-color: #000 + #screen + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 19 + #soundcloud, #audio + position: absolute + top: 0 + right: 0 + background-color: #000 + z-index: 21 + #soundcloud-dl, #audio-dl + position: absolute + top: 81px + right: 0 + width: 81px + padding: 5px 0 5px 0 + font-size: 13px + text-align: center + background-color: #000 + * + color: #839496 + z-index: 20 + #soundcloud-img, #audio-img + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + img + max-width: 100% + min-height: 100% + max-height: 100% + #ytscreen + z-index: 19 + position: absolute + top: 0 + left: 0 + #video-title + position: absolute + bottom: 0 + left: 10px + color: #fff + z-index: 20 + &.fullscreen + position: fixed + bottom: 90px + left: auto + right: 30px + font-size: 24px + #projimg + width: 100% + height: 100% + nav#controls + z-index: 40 + position: absolute + display: none + #video-link + color: #839496 + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #e4b + #like.liked + color: #44f +#playlistbg + position: absolute + background-color: #000 + opacity: 0.5 +#playlist + position: absolute + z-index: 90 + width: 100% + ul#queue + width: 100% + border-top: 1px solid #888 + border-left: 1px solid #888 + border-bottom: 1px solid #888 + -webkit-padding-start: 0 + -webkit-margin-before: 0 + overflow-y: scroll + overflow-x: hidden + z-index: 90 + li + padding: 5px + display: block + cursor: pointer + border-bottom: 1px solid #333 + span.title + color: #ddd + display: block + padding: 5px + font-size: 15px + z-index: 1 + &:hover + color: #fff + a.user + float: right + font-size: 14px + padding: 0 5px + color: #d33682 + padding: 5px + z-index: 2 + text-decoration: none + span.like + float: right + font-size: 14px + color: #657b83 + padding: 5px + z-index: 3 + span.like.liked + color: #c357a3 + span.score + float: right + font-size: 14px + color: #bbb + padding: 5px 10px 5px 5px + li.playing + background-color: #222 + span.title + color: #fff + li#queueLess + color: #fff + text-align: center + &:hover + background-color: #666 + color: #fff + border: 0 + border-bottom: 1px solid #333 + font-size: 18px + padding: 10px 0 + cursor: pointer + li#queueMore + color: #fff + text-align: center + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 33px + padding: 20px 20px 20px 20px + cursor: pointer + li#queueDone + color: #ddd + text-align: center + border: 0 + font-size: 33px + padding: 80px 20px 200px 20px + li#queueLoading + text-align: center + color: #fff + font-size: 24px + padding: 80px + ol + -webkit-padding-start: 0 + -webkit-margin-before: 0 + -webkit-margin-after: 0 + display: block + position: relative + top: 1px + li + padding: 5px 8px 8px 8px + margin: 0 0 0 10px + list-style-type: none + border-top: 1px solid #000 + border-right: 1px solid #000 + border-left: 1px solid #000 + border-bottom: 1px solid #888 + display: inline-block + background-color: #333 + color: #bbb + cursor: pointer + opacity: 0.7 + z-index: 89 + li.mode + position: relative + padding: 8px 8px 8px 8px + border-color: #888 + border-bottom: 1px solid #111 + background-color: #111 + color: #fff + z-index: 91 +nav + z-index: 10 + margin: 0 auto + button, #video-link + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 14px + min-width: 40px + min-height: 20px + padding: 5px 5px + position: relative + top: -1px + #video-link + padding: 6px 5px 5px 5px +#msg + display: none +#gif-container + position: absolute + left: 0 + width: 100% + padding-left: 10% + display: block + padding-bottom: 200px + #gifs + clear: both + display: block + text-align: center + top: 0 + max-width: 80% + margin: 0 0 200px 0 + box-shadow: 0 5px 10px #000 + background-color: #fff + div + padding: 10px + display: inline-block + img + max-width: 350px + max-height: 400px +#bg + position: fixed + top: 0 + left: 0 + opacity: 1 + z-index: -3 + width: 100% + height: 100% + display: none + img + width: 100% + height: 100% + +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + diff --git a/frontend/static/sass/src/roomlist.sass b/frontend/static/sass/src/roomlist.sass new file mode 100644 index 0000000..9bff4cc --- /dev/null +++ b/frontend/static/sass/src/roomlist.sass @@ -0,0 +1,131 @@ +.roomdiv + width: 200px + height: 100px + display: block + float: left + text-align: center + vertical-align: bottom + position: relative + font-size: 30px + color: #fff + padding-top: 160px + background-color: #000 + cursor: pointer + * + cursor: pointer + .count + font-size: 160px + color: #fff + position: absolute + left: 0 + top: 10px + width: 100% + text-align: center + vertical-align: middle + z-index: 3 + opacity: 0.9 + .roomname + position: absolute + left: 0 + top: 180px + width: 100% + text-align: center + vertical-align: middle + opacity: 0.9 + z-index: 4 + .roombg + position: absolute + background-position: center center + left: 0 + top: 0 + width: 100% + height: 100% + opacity: 0.8 + z-index: 1 + cursor: pointer + &:hover + .roomname + opacity: 1 + .count + opacity: 1 + .roombg + opacity: 0.9 +#roomlist + padding-top: 90px +#roomlist a + text-decoration: none + cursor: pointer +body + overflow-y: scroll + background: #000 +#logo + //top: 22px + top: 5px + left: 10px + h1#header + font-size: 30px + color: #4df + // top: -8px + top: 8px + max-width: 500px + h2.preamblish + display: inline-block + position: relative + top: -15px + left: 10px + font-size: 12px + color: #fff + max-width: 250px + padding-right: 20px + +#curtain + background: #080810 + opacity: 0.3 + width: 100% + height: 100% + position: fixed + top: 0 + left: 0 + z-index: 10 + display: none +#login + background: #000 + display: block + width: 50% + top: 20% + left: 50% + margin-left: -25% + padding: 30px + padding-bottom: 60px + z-index: 20 + position: fixed + text-align: center + box-shadow: 0 5px 10px #000 + img + margin-bottom: 20px + label + min-width: 20% + display: inline-block + text-align: right + padding-right: 10px + font-size: 18px + color: #fff + #button-shim + width: 30% + display: inline-block + text-align: left + padding: 10px 10px 10px 0 + margin-right: 20px + button + padding: 2px 5px + #login-username, #login-password + width: 30% + margin-right: 10px + font-size: 24px + border: 2px solid #806 + padding: 10px + a + color: #68f + text-decoration: underline + button + font-size: 24px diff --git a/frontend/static/sass/src/screen.sass b/frontend/static/sass/src/screen.sass new file mode 100644 index 0000000..f8b4429 --- /dev/null +++ b/frontend/static/sass/src/screen.sass @@ -0,0 +1,891 @@ +@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width +body + font-family: trebuchet ms, helvetica, arial, sans-serif + width: 100% + height: 100% + overflow: hidden + background: #000 +#bg + position: fixed + top: 0 + left: 0 + opacity: 1 + z-index: -3 + width: 100% + height: 100% +#bg img + width: 100% + height: 100% + -ms-interpolation-mode: nearest-neighbor + image-rendering: -moz-crisp-edges + image-rendering: -webkit-optimize-contrast +#loading + z-index: 20 + background: transparent + color: #06033c + text-shadow: #060363 0 0 50px + display: block + position: fixed + width: 100% + padding: 20px + top: 30% + left: 10% + font-size: 170px + font-weight: bold + text-align: left + white-space: no-wrap + letter-spacing: -3px + pointer-events: none + +#msg + z-index: 100 + position: fixed + top: 10px + right: 10px + padding: 5px + width: 350px + max-height: 80% + font-size: 12px + background-color: #eeeeee + overflow-y: scroll + overflow-x: hidden + color: #333 + strong + color: #859900 + em + color: #dc322f + b + color: #002b36 +#player + padding: 10px + position: absolute + background: #000 + #projector + display: block + position: absolute + background-color: #000 + #screen + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 19 + #soundcloud, #audio + position: absolute + top: 0 + right: 0 + background-color: #000 + z-index: 21 + #soundcloud-dl, #audio-dl + position: absolute + top: 81px + right: 0 + width: 81px + padding: 5px 0 5px 0 + font-size: 13px + text-align: center + background-color: #000 + * + color: #839496 + z-index: 20 + #soundcloud-img, #audio-img + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + img + max-width: 100% + min-height: 100% + max-height: 100% + #ytscreen + z-index: 19 + position: absolute + top: 0 + left: 0 + #video-title + position: absolute + bottom: 0 + left: 0 + color: #fff + z-index: 20 + #video-title.fullscreen + position: fixed + bottom: 90px + left: auto + right: 30px + font-size: 24px + #projimg + width: 100% + height: 100% + nav#controls + z-index: 40 + position: absolute + #video-link + color: #839496 + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #e4b + #like.liked + color: #44f + #mute.muted + background-color: #fff + color: #000 +#playlistbg + position: absolute + background-color: #000 + opacity: 0.3 +#playlist + position: absolute + z-index: 90 + width: 100% + overflow-y: auto + overflow-x: hidden + ul#queue + // overflow-y: none + // &:hover + // overflow-y: auto + width: 100% + li + padding: 5px + display: block + cursor: pointer + border-bottom: 1px solid #333 + span.title + color: #ddd + display: block + padding: 5px + z-index: 1 + &:hover + color: #d8f + cursor: pointer + a.user + float: right + font-size: 14px + padding: 0 5px + color: #d33682 + padding: 5px + z-index: 2 + text-decoration: none + span.like + float: right + font-size: 14px + color: #657b83 + padding: 5px + z-index: 3 + span.like.liked + color: #c357a3 + li.playing + background-color: #222 + span.title + color: #fff +#room, user + padding: 10px + label + color: #657b83 + width: 100px + text-align: right + padding-right: 5px + display: inline-block + span + color: #073642 + + +#curtain + background: #080810 + opacity: 0.3 + width: 100% + height: 100% + position: fixed + top: 0 + left: 0 + z-index: 10 + display: none +#login + background: #000 + display: block + width: 50% + top: 20% + left: 50% + margin-left: -25% + padding: 30px + padding-bottom: 60px + z-index: 20 + position: fixed + text-align: center + box-shadow: 0 5px 10px #000 + img + margin-bottom: 20px + label + min-width: 20% + display: inline-block + text-align: right + padding-right: 10px + font-size: 18px + color: #fff + #button-shim + width: 30% + display: inline-block + text-align: left + padding: 10px 10px 10px 0 + margin-right: 20px + button + padding: 2px 5px + #login-username, #login-password + width: 30% + margin-right: 10px + font-size: 24px + border: 2px solid #806 + padding: 10px + a + color: #68f + text-decoration: underline +#sitez + position: fixed + top: 24px + right: 30px + color: #888 + z-index: 82 + color: #aaa + a, #logout + cursor: pointer + color: #aaa + text-decoration: underline + select option + color: #666 + text-decoration: none + padding-right: 3px + button + font-size: 24px + background: #030303 + color: #fff + padding: 2px + a#faqlink + color: #8ff + div + cursor: pointer + display: inline-block + padding: 8px 8px 5px 8px + &:hover + @include rounded(10px 10px 3px 3px) + background-color: #333 + &.opened + @include rounded(10px 10px 3px 3px) + background-color: #333 +nav + z-index: 10 + margin: 0 auto + button, #video-link + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + border: 0 + font-size: 14px + min-width: 40px + min-height: 20px + padding: 5px 5px + position: relative + top: -1px + #video-link + top: -2px + padding-bottom: 6px +#lunacy + z-index: 40 + background: #ddd + color: #000 + display: block + width: 700px + position: fixed + top: 20% + left: 50% + margin-left: -390px + opacity: 0.7 + padding: 40px + text-align: center + font-size: 48px +#plea + z-index: 30 + background: #ddd + color: #000 + display: block + width: 400px + position: fixed + top: 20% + left: 50% + margin-left: -240px + opacity: 0.7 + padding: 40px + text-align: center + font-size: 48px + +#logobg + position: fixed + top: 10px + left: 0 + width: 100% + height: 64px + background-color: #000 + opacity: 0.8 + z-index: 45 +#logo + position: fixed + top: 10px + z-index: 46 + left: 10px + a + float: left + display: inline-block + img + display: inline-block + #scanjam + padding: 10px 15px 10px 0 + #preamble + display: inline-block + font-size: 12px + color: #fff + max-width: 80px + padding-left: 15px + h1 + padding: 15px 15px 0 10px + font-size: 34px + color: #fff + font-weight: normal + font-style: italic + font-family: georgia, garamond, serif + color: #8ff + display: inline-block + h2 + display: inline-block + font-size: 16px + color: #fff + position: relative + left: 20px + top: -5px + color: #839496 + a + display: inline + float: none + color: #268bd2 + img + max-height: 20px + max-width: 20px + display: inline-block + h2.preamblish + font-size: 12px + color: #fff + max-width: 250px + left: 0 + top: 9px + padding-right: 20px + h2.radio + a + color: #def + font-size: 12px + top: -8px + left: 30px + #likebutton + display: inline-block + display: none + position: relative + top: -5px + width: 90px + height: 21px + z-index: -1 +#glasspopcornlogo + position: absolute + top: 80px + left: 15px + pointer-events: none + opacity: 0.5 + z-index: 8 + img + z-index: 8 + pointer-events: none +#likereport + position: fixed + width: 100px + padding: 20px + z-index: 100 + overflow-y: hidden + a + background-color: #222 + display: block + text-decoration: none + padding: 5px + opacity: 0.95 + +#form + position: fixed + bottom: 10px + left: 10px + padding: 10px 10px 10px 10px + background-color: #000 + white-space: nowrap + z-index: 31 + #chat-message + border: 0 + outline: 0 + font-size: 18px + padding: 5px + margin-right: 5px + background-color: #f8f8f8 + &:hover + background-color: #ffffff + button + margin: 0 + outline: 0 + border: 0 + background-color: #333 + color: #ddd + &:hover + background-color: #666 + color: #fff + // @include rounded(2px) + padding: 4px 6px + position: relative + top: 1px + font-size: 20px + #videochat-badge + cursor: auto + pointer-events: none + @include rounded(8px) + font-size: 10px + background-color: #f00 + color: #fff + position: absolute + width: 10px + height: 10px + text-align: center + padding: 2px 2px + display: none + z-index: 32 +#formbg + background-color: #000 + opacity: 0.7 + +#chatbg + position: fixed + bottom: 100px + left: 20px + padding: 10px + width: 600px + background-color: #000 + padding: 0 10px 5px 10px + opacity: 0.25 + z-index: 9 + +#chat + padding: 0 10px 5px 10px + position: fixed + font-size: 18px + line-height: 26px + vertical-align: bottom + overflow-y: hidden + overflow-x: hidden + background: transparent + z-index: 30 + a + font-weight: normal + font-size: 11px + opacity: 0.8 + color: #44bbff + text-decoration: underline + a.u + font-weight: bold + padding-right: 10px + display: inline-block + color: #ff0066 + opacity: 1 + text-decoration: none + min-width: 80px + overflow-x: hidden + font-size: 16px + line-height: 26px + vertical-align: bottom + a.pic + opacity: 1 + span + color: #f0fff0 + text-shadow: #000 0 0 2px + font-weight: bold + .ytlink + font-size: 11px + color: #88dddd + cursor: pointer + text-decoration: underline + text-shadow: none + text-shadow: #000 0 0 1px + font-weight: normal + opacity: 1 + .ytlink:hover + color: #dd66ff + text-decoration: underline + text-shadow: #000 0 0 1px + .ytlink.playing + color: #daf + font-size: 12px + font-weight: normal + text-decoration: none + .ytlink.playing::before + text-decoration: none + content: "\25b6 " + font-weight: normal + img + max-width: 350px + max-height: 400px + border: 0 + #shim + width: 10px + height: 500px +#chat.fullscreen + overflow-y: hidden + &:hover + overflow-y: hidden +#webcam-container + z-index: 100 + position: fixed + right: 500px + bottom: 100px + background-color: #000 + padding: 10px + display: none +#lastlogbg + position: fixed + background-color: #000 + opacity: 0.5 + padding: 10px + z-index: 31 +#lastlogbox + position: fixed + font-size: 14px + padding: 10px + z-index: 32 + h4 + font-size: 12px + font-weight: bold + color: #eee + padding-bottom: 5px + ul + border-top: 1px solid #000 +li.ll + list-style-type: none + a + color: #d0e0fe + padding: 5px 0 + border-bottom: 1px solid #000 + display: block + text-shadow: #000 0 0 2px + text-decoration: underline + font-size: 16px + font-weight: bold + +#flower + position: absolute + top: 0 + right: 10% + z-index: 50 + pointer-events: none + display: none +#plant + position: absolute + bottom: 0 + right: 50% + z-index: 50 + pointer-events: none + display: none +#msg + display: none +button + font-size: 24px + background: #030303 + color: #fff + padding: 2px +#settings-container, #rooms-container, #about-container, #videochat-container + position: fixed + top: 59px + @include rounded (10px) + right: 20px + z-index: 80 + width: 500px + background-color: #222 + color: #657b83 + display: none + box-shadow: 0 5px 10px #000 + .close + margin: 10px 10px 0 0 + float: right + color: #ded8c5 + width: 20px + height: 14px + font-size: 14px + padding: 3px 0 + text-align: center + vertical-align: middle + @include rounded(10px) + background-color: #000b16 + &:hover + color: #fff + cursor: pointer + #rooms-loading + margin: 10px + h5 + font-size: 16px + color: #93a1a1 + display: block + padding: 10px + background-color: #333 + @include rounded(10px 10px 0 0) + p + padding: 10px 10px 10px 10px + font-size: 14px + line-height: 18px + color: #b3c1c1 + background-color: #1b1b1f + label + margin: 2px 0 0 10px + font-size: 14px + color: #657b83 + width: 150px + text-align: right + padding-right: 5px + display: inline-block + span + margin: 2px 10px 0 0 + color: #839496 + font-size: 14px + span#room-mod-tag a + float: right + padding: 0 10px 10px 0 + display: block + color: #dc322f + span#gallery-link a + color: #268bd2 + padding: 0 10px 10px 0 + display: block + float: right + button + position: relative + left: 3px + input + margin: 2px 10px 0 0 + width: 100px + #room-topic, #room-bg, #room-bgreset + width: 300px + #room-settings-save + font-size: 14px + .shim + width: 1px + height: 10px + ul + text-decoration: none + cursor: pointer + li + list-style-type: none + padding: 10px + cursor: pointer + border-top: 1px solid #000 + background-color: transparent + text-decoration: none + font-size: 14px + color: #83a1a1 + &:hover + color: #fdf6e3 + a li + color: #83a1a1 + text-decoration: none + a + color: #83a1a1 + text-decoration: none +#rooms-container + right: 20px + z-index: 80 + width: 300px + max-height: 300px +#about-container + right: 20px + z-index: 80 + width: 300px +#videochat-container + right: 20px + z-index: 80 + width: 300px + display: none + cursor: pointer + #videochat-disable + display: none +#tokbox-embed + position: absolute + bottom: 10px + left: 10px + height: 150px + z-index: 80 + display: none + overflow-y: auto + #tokbox-publisher, #tokbox-subscribers + float: left + object + float: left + #tokbox-settings + position: absolute + top: 0 + right: 10px + padding: 5px + font-size: 12px + color: #bbb + background-color: black + text-align: right + button + padding: 2px + font-size: 12px + background-color: #333 + color: #888 + min-width: 30px + &.on + background-color: #d33 + color: #fff +.roomhello + width: 400px + color: #fff + padding: 10px + font-size: 18px + background-color: #000 + cursor: pointer + position: fixed + top: 85px + left: 15px + opacity: 0.9 +.modhello + width: 400px + color: #fff + padding: 5px + background-color: #000 + cursor: pointer + margin-top: 10px +.glitter + pointer-events: none + position: absolute + z-index: 23 + +.arrow-play + width: 0 + height: 0 + border-top: 4.5px solid transparent + border-left: 9.5px solid white + border-bottom: 4.5px solid transparent + display: inline-block +.arrow-pause + width: 0 + height: 0 + border-top: 5px solid white + border-right: 2.5px solid white + border-bottom: 4px solid white + border-left: 0 + display: inline-block +.arrow-prev + width: 0 + height: 0 + border-top: 4px solid transparent + border-right: 4px solid white + border-bottom: 4px solid transparent + display: inline-block +.arrow-next + width: 0 + height: 0 + border-top: 4px solid transparent + border-left: 4px solid white + border-bottom: 4px solid transparent + display: inline-block + +#search-terms + font-size: 14px + padding: 2px 2px + width: 200px + position: relative + top: -4px + left: -10px + background-image: url('/img/magnify.png') + background-position: right center + background-repeat: no-repeat + border: 0 + outline: 0 + background-color: #ddd + &:hover + background-color: #fff + &:focus + background-color: #fff +#search-results-container + position: fixed + top: 53px + right: 21px + z-index: 100 + width: 334px + border: 2px solid black + background: #333 + display: none + #search-loading + margin: 10px + #search-instructions + font-size: 11px + color: white + padding: 3px 3px 3px 38px + background-color: #000 + width: 100% + #search-results + height: 300px + width: 100% + overflow-x: hidden + overflow-y: scroll + li + clear: both + height: 54px + overflow: hidden + position: relative + // padding-right: 5px + div.thumb + width: 32px + height: 54px + float: left + background-position: center center + margin: 0 5px 0 0 + border-right: 2px solid black + cursor: pointer + h4 + white-space: nowrap + overflow: hidden + font-size: 14px + color: #fff + margin: 3px 0 3px 0 + cursor: pointer + span.metadata + cursor: pointer + display: block + width: 200px + border-bottom: 2px solid black + font-size: 12px + line-height: 15px + color: #bbb + opacity: 0.9 + a.preview + position: absolute + bottom: 3px + right: 5px + color: #268bd2 + text-decoration: underline + &:hover + background: black + opacity: 1.0 + diff --git a/frontend/static/sass/src/screen.scss b/frontend/static/sass/src/screen.scss new file mode 100644 index 0000000..81de847 --- /dev/null +++ b/frontend/static/sass/src/screen.scss @@ -0,0 +1,6 @@ +/* Welcome to Compass. + * In this file you should write your main styles. (or centralize your imports) + * Import this file using the following HTML or equivalent: + * <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> */ + +@import "compass/reset"; diff --git a/frontend/static/sass/src/sewergreats.sass b/frontend/static/sass/src/sewergreats.sass new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/sass/src/sewergreats.sass diff --git a/frontend/static/sass/src/test.sass b/frontend/static/sass/src/test.sass new file mode 100644 index 0000000..15e46c4 --- /dev/null +++ b/frontend/static/sass/src/test.sass @@ -0,0 +1,285 @@ +@import compass/reset +@mixin rounded($width) + -moz-border-radius: $width + -webkit-border-radius: $width + -o-border-radius: $width + border-radius: $width + +body + font-family: trebuchet ms +#msg + position: fixed + top: 10px + right: 10px + padding: 5px + width: 250px + max-height: 80% + font-size: 12px + background-color: #eeeeee + overflow-y: scroll + overflow-x: hidden + color: #333 + z-index: 100 + strong + color: #859900 + em + color: #dc322f + b + color: #002b36 +#player + #projector + display: block + position: absolute + background-color: #000 + width: 320px + height: 240px + #screen + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + #soundcloud + position: absolute + top: 0 + right: 0 + z-index: 21 + #soundcloud-dl + position: absolute + top: 81px + right: 10px + padding: 5px + background-color: #000 + * + color: #839496 + z-index: 20 + #soundcloud-img + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + z-index: 20 + img + max-width: 100% + max-height: 100% + #ytscreen + z-index: 19 + position: absolute + top: 0 + left: 0 + #video-title + position: absolute + bottom: 0 + left: 0 + color: #988 + z-index: 20 + #projimg + width: 100% + height: 100% + nav + position: absolute + top: 260px + button + color: #000 + #scan.blinkOn + background-color: #fff + color: #000 + #scan.blinkOff + background-color: #000 + color: #fff + #like + color: #e4b + #like.liked + color: #44f + #playlist + position: absolute + left: 330px + z-index: 20 + width: 300px + ul#queue + width: 100% + li + display: block + cursor: pointer + border-bottom: 1px solid #ddd + span.title + display: block + padding: 5px + z-index: 1 + a.user + float: right + padding: 0 5px + color: #d33682 + padding: 5px + z-index: 2 + span.like + float: right + color: #657b83 + padding: 5px + z-index: 3 + span.like.liked + color: #a35783 + li.playing + background-color: #073642 + color: #fff +#room, #user + padding: 10px + label + color: #657b83 + width: 200px + text-align: right + padding-right: 5px + display: inline-block + span + color: #93a1a1 +a + color: #268bd2 + &:visited + color: #6c71c4 +body + font-size: 16px +#bg + position: fixed + top: 0 + left: 0 + z-index: -1 + opacity: 0.3 +#pnp + position: fixed + right: 20px + bottom: 20px + width: 400px + height: 285px + background: #fff +#stats + position: fixed + right: 20px + top: 20px + width: 390px + font-size: 14px + background-color: #fff + padding: 5px + display: none + overflow-y: scroll +#videos + width: 800px + padding-right: 5px + li + width: 100% + list-style-type: none + display: block + margin-top: 3px + a,span + display: inline-block + margin-left: 5px + .date + opacity: 0.8 + width: 60px + text-align: right + font-size: 14px + .time + opacity: 0.8 + width: 40px + text-align: right + font-size: 14px + .user + font-size: 14px + width: 100px + overflow: hidden + .type + width: 20px + text-align: center + font-variant: small-caps + .title + // color: #93a1a1 + text-decoration: none + width: 300px + overflow: hidden + white-space: nowrap + .remove + color: #dc322f + width: 200px + cursor: pointer + text-decoration: underline + text-transform: uppercase + opacity: 0.5 + li:hover + .remove + opacity: 1 + .title + text-decoration: underline +a#return-link + position: absolute + top: 10px + left: 10px + font-size: 14px +h1 + color: #bbb + font-size: 48px + text-align: center + width: 80% + padding-bottom: 10px +h2 + color: #bbb + font-size: 24px + padding-left: 20px + text-transform: uppercase + #room-name + color: #fff +#search-terms + font-size: 14px + padding: 2px 2px + width: 200px + background-image: url('/img/magnify.png') + background-position: right center + background-repeat: no-repeat + border: 0 + outline: 0 + background-color: #ddd + &:hover + background-color: #fff + &:focus + background-color: #fff +#search-results-container + width: 350px + border: 2px solid black + background: #333 + display: none + #search-loading + margin: 10px + #search-results + height: 400px + width: 100% + overflow-x: hidden + overflow-y: scroll + li + clear: both + height: 54px + overflow: hidden + // padding-right: 5px + div.thumb + width: 80px + height: 54px + float: left + background-position: center center + margin: 0 5px 0 0 + border-right: 2px solid black + h4 + white-space: nowrap + overflow: hidden + font-size: 14px + color: #fff + margin: 3px 0 3px 0 + border-bottom: 2px solid black + font-size: 12px + line-height: 15px + color: #bbb + opacity: 0.9 + cursor: pointer + &:hover + background: black + cursor: pointer + opacity: 1.0 + diff --git a/frontend/static/sass/src/tiny.sass b/frontend/static/sass/src/tiny.sass new file mode 100644 index 0000000..3be302d --- /dev/null +++ b/frontend/static/sass/src/tiny.sass @@ -0,0 +1,36 @@ +#logo,#form,#logobg,#sitez + opacity: 0 + z-index: -20 +#lastlogbox *, #lastlogbox h4 + font-size: 5px + padding: 1px +#lastlogbox + padding: 1px +#chat + font-size: 6px + line-height: 120% + overflow-y: hidden + a.u + min-width: 10px + img + max-height: 30px + max-width: 30px +#player *,#playlist *,#queue * + font-size: 5px +#playlist ul#queue li + padding: 1px +#playlist ul#queue li span.like + font-size: 5px +#playlist ul#queue li a.user + font-size: 5px +nav button + font-size: 10px + padding: 1px + border: 1px solid #888 + min-width: 10px + max-width: 10px + min-height: 10px + max-height: 10px + overflow: hidden +*,#chat + overflow: hidden diff --git a/frontend/static/sass/src/top.sass b/frontend/static/sass/src/top.sass new file mode 100644 index 0000000..3f55c57 --- /dev/null +++ b/frontend/static/sass/src/top.sass @@ -0,0 +1,52 @@ +body + background-color: rgb(49,18,150) + overflow: hidden +#bg + position: fixed + top: 0 + left: 0 + height: 100% + width: 100% + display: block + opacity: 1 + background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.11, rgb(49,18,150)), color-stop(0.67, rgb(143,38,255)), color-stop(0.84, rgb(157,66,255))) + background-image: -moz-linear-gradient( center bottom, rgb(49,18,150) 11%, rgb(143,38,255) 67%, rgb(157,66,255) 84%) + img + width: 100% + height: 100% +#plant1 + z-index: -2 + position: fixed + left: -200px + bottom: 0 +#plant2 + z-index: -2 + position: fixed + right: -200px + bottom: 0 +.cloudleft + background-image: url(/bgz/cloudz1.png) + position: fixed + bottom: 0 + left: 0 + width: 600px + height: 400px + opacity: 0.7 + pointer-events: none + z-index: -1 +.cloudright + background-image: url(/bgz/cloudz2.png) + position: fixed + bottom: 0 + right: 0 + width: 600px + height: 400px + opacity: 0.8 + pointer-events: none + z-index: -1 +.shimmer + margin: 0 0 -20px 0 + opacity: 0.5 +.shimmer2 + margin: 0 0 -40px 0 + opacity: 0.5 diff --git a/frontend/static/sass/stylesheets/avatar.css b/frontend/static/sass/stylesheets/avatar.css new file mode 100644 index 0000000..8173e9a --- /dev/null +++ b/frontend/static/sass/stylesheets/avatar.css @@ -0,0 +1,91 @@ +/* line 1, ../src/avatar.sass */ +table { + float: left; +} + +/* line 3, ../src/avatar.sass */ +.avatar-right { + left: 250px; +} + +/* line 5, ../src/avatar.sass */ +.message { + vertical-align: top; +} + +/* line 7, ../src/avatar.sass */ +.tri { + vertical-align: top; + height: 100%; +} + +/* line 10, ../src/avatar.sass */ +.triangle-left { + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 5px solid transparent; + border-right: 25px solid white; + position: relative; + top: 10px; + left: 5px; + margin-left: -16px; +} + +/* line 20, ../src/avatar.sass */ +.triangle-right { + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 5px solid transparent; + border-left: 25px solid white; + position: relative; + top: 10px; + margin-left: -12px; +} + +/* line 29, ../src/avatar.sass */ +.message .message-blurb { + box-shadow: 2px 2px 10px #112233; + max-width: 250px; + font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; + background-color: white; + border-top: 2px solid #f0f0f8; + border-left: 2px solid #ebeeef; + border-right: 2px solid #dddddd; + border-bottom: 2px solid #dddddd; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + padding: 10px; + color: #222222; + word-wrap: break-word; +} + +/* line 43, ../src/avatar.sass */ +#chat img { + max-width: 250px; + max-height: 250px; +} + +/* line 46, ../src/avatar.sass */ +#chat .ytlink:hover { + color: #ff33cc; +} + +/* line 48, ../src/avatar.sass */ +#chat .ytlink { + color: #cc33dd; +} + +/* line 50, ../src/avatar.sass */ +#chat .ytlink.playing { + color: #6600bb; +} + +/* line 52, ../src/avatar.sass */ +div.frame { + display: inline-block; + padding: 2px; + height: 300px; + overflow: visible; +} diff --git a/frontend/static/sass/stylesheets/calendar.css b/frontend/static/sass/stylesheets/calendar.css new file mode 100644 index 0000000..f429555 --- /dev/null +++ b/frontend/static/sass/stylesheets/calendar.css @@ -0,0 +1,141 @@ +/* line 1, ../src/calendar.sass */ +body { + background-color: #f8f8f8; + overflow: hidden; +} + +/* line 4, ../src/calendar.sass */ +#calendar { + position: absolute; + z-index: 10; +} +/* line 6, ../src/calendar.sass */ +#calendar * { + font-size: 18px; +} + +/* line 10, ../src/calendar.sass */ +#playlist ul#queue li.playing span.score { + color: #bbbbbb; +} + +/* line 13, ../src/calendar.sass */ +#playlist ul#queue li span.score { + color: #333333; +} +/* line 15, ../src/calendar.sass */ +#playlist ul#queue li span.title { + color: #222222; +} + +/* line 17, ../src/calendar.sass */ +#player { + z-index: 6; +} + +/* line 19, ../src/calendar.sass */ +#playlistbg { + z-index: 7; + background-color: #f8f8f8; +} + +/* line 22, ../src/calendar.sass */ +#water-cooler { + position: fixed; + bottom: -10px; + left: -30px; + height: 500px; + z-index: 7; +} + +/* line 28, ../src/calendar.sass */ +#office-plant { + position: fixed; + bottom: 20px; + left: 160px; + z-index: 8; +} + +/* line 33, ../src/calendar.sass */ +#carpet { + position: fixed; + width: 100%; + height: 70px; + bottom: 0; + left: 0; + background-color: white; + z-index: 6; +} + +/* line 41, ../src/calendar.sass */ +#bg { + opacity: 0.1; + display: none; +} + +/* line 44, ../src/calendar.sass */ +#likebutton { + position: fixed; + right: 20px; + top: 30px; + opacity: 0.7; +} + +/* line 49, ../src/calendar.sass */ +#calendar { + z-index: 10; + box-shadow: #666666 5px 5px 10px; + display: none; +} + +/* line 53, ../src/calendar.sass */ +#logo h1 { + color: #bb88dd; +} + +/* line 55, ../src/calendar.sass */ +#player #projector #video-title { + bottom: 5px; + left: 5px; +} + +/* line 58, ../src/calendar.sass */ +.arrow-play { + width: 0; + height: 0; + border-top: 4.5px solid transparent; + border-left: 9.5px solid white; + border-bottom: 4.5px solid transparent; + display: inline-block; +} + +/* line 65, ../src/calendar.sass */ +.arrow-pause { + width: 0; + height: 0; + border-top: 5px solid white; + border-right: 2.5px solid white; + border-bottom: 4px solid white; + border-left: 0; + display: inline-block; +} + +/* line 73, ../src/calendar.sass */ +.arrow-prev { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-right: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} + +/* line 80, ../src/calendar.sass */ +.arrow-next { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-left: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} diff --git a/frontend/static/sass/stylesheets/diornights.css b/frontend/static/sass/stylesheets/diornights.css new file mode 100644 index 0000000..e833dbd --- /dev/null +++ b/frontend/static/sass/stylesheets/diornights.css @@ -0,0 +1,182 @@ +/* line 17, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; +} + +/* line 22, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html { + line-height: 1; +} + +/* line 24, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, ul { + list-style: none; +} + +/* line 26, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* line 28, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, th, td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} + +/* line 30, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { + quotes: none; +} +/* line 103, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { + content: ""; + content: none; +} + +/* line 32, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { + border: none; +} + +/* line 116, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { + display: block; +} + +/* line 8, ../src/diornights.sass */ +html { + height: 100%; + width: 100%; +} + +/* line 11, ../src/diornights.sass */ +body { + font-family: trebuchet ms, helvetica, arial, sans-serif; + width: 100%; + height: 100%; + overflow-x: hidden; + background: white; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.28, white), color-stop(0.64, #faf7fa)); + background-image: -moz-linear-gradient(center bottom, white 28%, #faf7fa 64%); + background-attachment: fixed; + font-size: 11px; + font-family: "lucida grande", tahoma, verdana, arial, sans-serif; + color: #333333; +} + +/* line 23, ../src/diornights.sass */ +#bg { + position: fixed; + top: 0; + left: 0; + opacity: 1; + z-index: -3; + width: 100%; + height: 100%; +} + +/* line 31, ../src/diornights.sass */ +#bg img { + width: 100%; + height: 100%; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: -moz-crisp-edges; + image-rendering: -webkit-optimize-contrast; +} + +/* line 37, ../src/diornights.sass */ +#container { + position: absolute; + top: 0; + left: 50%; + width: 950px; + min-height: 100%; + margin-left: -475px; + background: white; + padding-bottom: 2000px; +} + +/* line 48, ../src/diornights.sass */ +#header { + width: 100%; +} +/* line 50, ../src/diornights.sass */ +#header #logo { + height: 160px; +} +/* line 52, ../src/diornights.sass */ +#header #likebutton { + position: absolute; + top: 80px; + right: 30px; +} + +/* line 56, ../src/diornights.sass */ +#menu { + width: 100%; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #eeeeee; +} +/* line 61, ../src/diornights.sass */ +#menu ul li { + display: inline-block; + width: 153px; + padding: 5px 0 5px 0px; + text-align: center; +} +/* line 66, ../src/diornights.sass */ +#menu ul li a { + color: #333333; + text-decoration: none; + display: block; +} +/* line 70, ../src/diornights.sass */ +#menu ul li a:hover { + color: #3333ff; +} + +/* line 72, ../src/diornights.sass */ +.box { + width: 300px; + margin: 10px 0 0 10px; +} +/* line 75, ../src/diornights.sass */ +.box img { + width: 100%; + opacity: 0.9; +} +/* line 78, ../src/diornights.sass */ +.box img:hover { + opacity: 1; +} +/* line 82, ../src/diornights.sass */ +.box#feed ul li { + display: inline-block; + height: 32px; + vertical-align: middle; +} +/* line 86, ../src/diornights.sass */ +.box#feed img { + width: 32px; + height: 32px; +} diff --git a/frontend/static/sass/stylesheets/disaro.css b/frontend/static/sass/stylesheets/disaro.css new file mode 100644 index 0000000..9787b67 --- /dev/null +++ b/frontend/static/sass/stylesheets/disaro.css @@ -0,0 +1 @@ +#chat{text-align:center}#chat img{width:500px;max-width:none;max-height:none;border:10px solid #000;margin:10px auto 0;margin-right:100px}#chat a.u{font-size:14px;min-width:100px;letter-spacing:-1px;text-align:right;padding-right:20px}#chat *{font-size:14px}#chat .chatline{width:510px;background-color:#000;padding:5px;text-align:left;margin:0 auto;opacity:0.9;margin-right:100px}#chat span{color:#666;text-shadow:none;font-weight:normal} diff --git a/frontend/static/sass/stylesheets/embed.css b/frontend/static/sass/stylesheets/embed.css new file mode 100644 index 0000000..37f8f61 --- /dev/null +++ b/frontend/static/sass/stylesheets/embed.css @@ -0,0 +1,163 @@ +/* line 1, ../src/embed.sass */ +body { + background: black; + overflow: hidden; +} + +/* line 4, ../src/embed.sass */ +#logo, #form, #logobg, #sitez { + opacity: 0; + z-index: -20; +} + +/* line 7, ../src/embed.sass */ +#lastlogbox *, #lastlogbox h4 { + font-size: 12px; + padding: 1px; +} + +/* line 10, ../src/embed.sass */ +#lastlogbox { + padding: 1px; +} + +/* line 12, ../src/embed.sass */ +#chat { + font-size: 6px; + line-height: 120%; + overflow-y: hidden; +} +/* line 16, ../src/embed.sass */ +#chat a.u { + min-width: 10px; +} +/* line 18, ../src/embed.sass */ +#chat img { + max-height: 30px; + max-width: 30px; +} + +/* line 21, ../src/embed.sass */ +#player { + padding: 0; + margin: 0; +} + +/* line 24, ../src/embed.sass */ +#player *, #playlist *, #queue * { + font-size: 12px; +} + +/* line 26, ../src/embed.sass */ +#playlist ul#queue li { + padding: 1px; +} +/* line 28, ../src/embed.sass */ +#playlist ul#queue li.playing { + background-color: #665577; +} + +/* line 30, ../src/embed.sass */ +#playlist ul#queue li span.like { + display: none; +} + +/* line 32, ../src/embed.sass */ +#playlist ul#queue li a.user { + font-size: 10px; +} + +/* line 34, ../src/embed.sass */ +#playlist { + overflow-y: hidden; +} + +/* line 36, ../src/embed.sass */ +#queue { + overflow-y: scroll; +} + +/* line 39, ../src/embed.sass */ +nav button { + font-size: 12px; + padding: 1px; + overflow: hidden; + position: relative; + top: 3px; + left: 3px; +} +/* line 46, ../src/embed.sass */ +nav #video-link { + position: relative; + top: 2px; + left: 3px; + padding: 4px; + font-size: 10px; +} + +/* line 53, ../src/embed.sass */ +#player nav#controls span.instructions { + font-size: 11px; + color: #dddddd; + position: relative; + top: 3px; + left: 5px; +} + +/* line 59, ../src/embed.sass */ +#player nav#controls { + z-index: 90; + overflow: visible; +} + +/* line 62, ../src/embed.sass */ +#player #projector #video-title { + bottom: 10px; + left: 2px; +} + +/* line 65, ../src/embed.sass */ +*, #chat { + overflow: hidden; +} + +/* line 67, ../src/embed.sass */ +.arrow-play { + width: 0; + height: 0; + border-top: 4.5px solid transparent; + border-left: 9.5px solid white; + border-bottom: 4.5px solid transparent; + display: inline-block; +} + +/* line 74, ../src/embed.sass */ +.arrow-pause { + width: 0; + height: 0; + border-top: 5px solid white; + border-right: 2.5px solid white; + border-bottom: 4px solid white; + border-left: 0; + display: inline-block; +} + +/* line 82, ../src/embed.sass */ +.arrow-prev { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-right: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} + +/* line 89, ../src/embed.sass */ +.arrow-next { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-left: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} diff --git a/frontend/static/sass/stylesheets/feederbleeder.css b/frontend/static/sass/stylesheets/feederbleeder.css new file mode 100644 index 0000000..cdfc556 --- /dev/null +++ b/frontend/static/sass/stylesheets/feederbleeder.css @@ -0,0 +1,41 @@ +/* line 1, ../src/feederbleeder.sass */ +#chat { + text-align: center; +} +/* line 3, ../src/feederbleeder.sass */ +#chat img { + width: 500px; + max-width: none; + max-height: none; + border: 10px solid black; + margin: 10px auto 0; + margin-right: 100px; +} +/* line 10, ../src/feederbleeder.sass */ +#chat a.u { + font-size: 14px; + min-width: 100px; + letter-spacing: -1px; + text-align: right; + padding-right: 20px; +} +/* line 16, ../src/feederbleeder.sass */ +#chat * { + font-size: 14px; +} +/* line 18, ../src/feederbleeder.sass */ +#chat .chatline { + width: 510px; + background-color: black; + padding: 5px; + text-align: left; + margin: 0 auto; + opacity: 0.9; + margin-right: 100px; +} +/* line 26, ../src/feederbleeder.sass */ +#chat span { + color: #666666; + text-shadow: none; + font-weight: normal; +} diff --git a/frontend/static/sass/stylesheets/frederick.css b/frontend/static/sass/stylesheets/frederick.css new file mode 100644 index 0000000..94cd43d --- /dev/null +++ b/frontend/static/sass/stylesheets/frederick.css @@ -0,0 +1,5 @@ +/* line 2, ../src/frederick.sass */ +#chat span { + color: #004b27; + text-shadow: 0 0 2px white; +} diff --git a/frontend/static/sass/stylesheets/gallery-white.css b/frontend/static/sass/stylesheets/gallery-white.css new file mode 100644 index 0000000..ef7fcd8 --- /dev/null +++ b/frontend/static/sass/stylesheets/gallery-white.css @@ -0,0 +1,353 @@ +/* line 1, ../src/gallery-white.sass */ +body { + background: white; +} + +/* line 3, ../src/gallery-white.sass */ +#loading { + background: transparent; + color: #e6f0f0; + text-shadow: #e6f0f0 0 0 50px; +} + +/* line 7, ../src/gallery-white.sass */ +#player { + background: white; +} +/* line 9, ../src/gallery-white.sass */ +#player #projector { + background-color: black; +} +/* line 11, ../src/gallery-white.sass */ +#player #projector #video-title { + color: white; +} +/* line 16, ../src/gallery-white.sass */ +#player nav#controls #scan.blinkOn { + background-color: white; + color: black; +} +/* line 19, ../src/gallery-white.sass */ +#player nav#controls #scan.blinkOff { + background-color: black; + color: white; +} +/* line 22, ../src/gallery-white.sass */ +#player nav#controls #like { + color: #ffaaee; +} +/* line 24, ../src/gallery-white.sass */ +#player nav#controls #like.liked { + color: #8888ff; +} + +/* line 26, ../src/gallery-white.sass */ +#playlistbg { + background-color: white; +} + +/* line 30, ../src/gallery-white.sass */ +#playlist ul#queue li { + border-bottom: 1px solid #dddddd; +} +/* line 32, ../src/gallery-white.sass */ +#playlist ul#queue li span.title { + color: #333333; +} +/* line 34, ../src/gallery-white.sass */ +#playlist ul#queue li a.user { + color: #d33682; +} +/* line 36, ../src/gallery-white.sass */ +#playlist ul#queue li span.like { + color: #657b83; +} +/* line 38, ../src/gallery-white.sass */ +#playlist ul#queue li span.like.liked { + color: #c357a3; +} +/* line 40, ../src/gallery-white.sass */ +#playlist ul#queue li.playing { + background-color: #333333; +} +/* line 42, ../src/gallery-white.sass */ +#playlist ul#queue li.playing span.title { + color: white; +} + +/* line 44, ../src/gallery-white.sass */ +#curtain { + background: #080810; + opacity: 0.3; +} + +/* line 47, ../src/gallery-white.sass */ +#login { + background: white; + box-shadow: 0 5px 10px black; +} +/* line 51, ../src/gallery-white.sass */ +#login label { + color: black; +} +/* line 54, ../src/gallery-white.sass */ +#login #button-shim button { + padding: 2px 5px; +} +/* line 56, ../src/gallery-white.sass */ +#login #login-username, #login #login-password { + border: 2px solid #880066; +} +/* line 58, ../src/gallery-white.sass */ +#login a { + color: #6688ff; +} + +/* line 62, ../src/gallery-white.sass */ +#sitez div:hover { + background-color: #333333; +} +/* line 64, ../src/gallery-white.sass */ +#sitez div.opened { + background-color: #333333; +} + +/* line 67, ../src/gallery-white.sass */ +nav button { + background-color: #888888; +} + +/* line 69, ../src/gallery-white.sass */ +#logobg { + background-color: black; + opacity: 0.7; +} + +/* line 76, ../src/gallery-white.sass */ +#logo h1 { + color: #88ffff; +} +/* line 78, ../src/gallery-white.sass */ +#logo h2 { + color: #839496; +} +/* line 80, ../src/gallery-white.sass */ +#logo h2 a { + color: #268bd2; +} + +/* line 85, ../src/gallery-white.sass */ +#likereport a { + background-color: #222222; + opacity: 0.95; +} + +/* line 88, ../src/gallery-white.sass */ +#form { + background-color: white; +} +/* line 90, ../src/gallery-white.sass */ +#form #chat-message { + border: 1px solid #333333; +} +/* line 92, ../src/gallery-white.sass */ +#form button { + background-color: #dddddd; + color: #333333; +} +/* line 95, ../src/gallery-white.sass */ +#form button:hover { + background-color: #c8cbd6; +} + +/* line 97, ../src/gallery-white.sass */ +#formbg { + background-color: white; + opacity: 0.7; +} + +/* line 100, ../src/gallery-white.sass */ +#chatbg { + background-color: white; + opacity: 0.1; +} + +/* line 103, ../src/gallery-white.sass */ +#chat { + background: transparent; +} +/* line 105, ../src/gallery-white.sass */ +#chat a { + color: #4444ff; +} +/* line 107, ../src/gallery-white.sass */ +#chat a.u { + color: #ff0066; + opacity: 0.9; +} +/* line 110, ../src/gallery-white.sass */ +#chat a.pic { + opacity: 1; +} +/* line 112, ../src/gallery-white.sass */ +#chat span { + color: #333333; + text-shadow: black 0 0 0; +} +/* line 115, ../src/gallery-white.sass */ +#chat .ytlink { + color: #8aaab3; + text-shadow: black 0 0 0; +} +/* line 118, ../src/gallery-white.sass */ +#chat .ytlink:hover { + color: #11182f; + text-shadow: black 0 0 0; +} +/* line 121, ../src/gallery-white.sass */ +#chat .ytlink.playing { + color: #cc22bb; +} + +/* line 126, ../src/gallery-white.sass */ +#lastlogbg { + background-color: white; + opacity: 0.3; +} + +/* line 129, ../src/gallery-white.sass */ +#lastlogbox { + opacity: 0.8; +} +/* line 131, ../src/gallery-white.sass */ +#lastlogbox h4 { + color: #666666; +} +/* line 133, ../src/gallery-white.sass */ +#lastlogbox ul { + border-top: 1px solid #dddddd; +} + +/* line 136, ../src/gallery-white.sass */ +li.ll a { + color: #4a5a73; + border-bottom: 1px solid #dddddd; + text-shadow: black 0 0 0; +} + +/* line 142, ../src/gallery-white.sass */ +button { + background: #dddddd; + color: #333333; +} + +/* line 145, ../src/gallery-white.sass */ +#settings-container, #rooms-container, #about-container { + background-color: #222222; + color: #657b83; +} +/* line 148, ../src/gallery-white.sass */ +#settings-container .close, #rooms-container .close, #about-container .close { + color: #ded8c5; + background-color: #000b16; +} +/* line 151, ../src/gallery-white.sass */ +#settings-container .close:hover, #rooms-container .close:hover, #about-container .close:hover { + color: white; +} +/* line 154, ../src/gallery-white.sass */ +#settings-container h5, #rooms-container h5, #about-container h5 { + color: #93a1a1; + background-color: #333333; +} +/* line 157, ../src/gallery-white.sass */ +#settings-container p, #rooms-container p, #about-container p { + color: #b3c1c1; + background-color: #1b1b1f; +} +/* line 160, ../src/gallery-white.sass */ +#settings-container label, #rooms-container label, #about-container label { + color: #657b83; +} +/* line 162, ../src/gallery-white.sass */ +#settings-container span, #rooms-container span, #about-container span { + color: #839496; +} +/* line 169, ../src/gallery-white.sass */ +#settings-container ul li, #rooms-container ul li, #about-container ul li { + border-top: 1px solid black; + color: #83a1a1; +} +/* line 172, ../src/gallery-white.sass */ +#settings-container ul li:hover, #rooms-container ul li:hover, #about-container ul li:hover { + color: #fdf6e3; +} +/* line 174, ../src/gallery-white.sass */ +#settings-container ul a li, #rooms-container ul a li, #about-container ul a li { + color: #83a1a1; +} +/* line 176, ../src/gallery-white.sass */ +#settings-container ul a, #rooms-container ul a, #about-container ul a { + color: #83a1a1; +} + +/* line 181, ../src/gallery-white.sass */ +#chat { + text-align: center; +} +/* line 183, ../src/gallery-white.sass */ +#chat img { + width: 520px; + max-width: none; + max-height: none; + border: 0; + margin: 0 auto; +} +/* line 189, ../src/gallery-white.sass */ +#chat a.u { + font-size: 14px; + min-width: 100px; + letter-spacing: -1px; + text-align: right; + padding-right: 20px; +} +/* line 195, ../src/gallery-white.sass */ +#chat a.pic { + padding: 0; + margin: 0; +} +/* line 198, ../src/gallery-white.sass */ +#chat * { + font-size: 14px; +} +/* line 200, ../src/gallery-white.sass */ +#chat .chatimg { + margin: 0 auto; + padding: 0; +} +/* line 203, ../src/gallery-white.sass */ +#chat .chatline { + width: 510px; + background-color: white; + padding: 2px 5px 2px 5px; + line-height: 16px; + text-align: left; + margin: 0 auto; + opacity: 0.9; +} +/* line 211, ../src/gallery-white.sass */ +#chat span { + color: #666666; + text-shadow: none; + font-weight: normal; +} + +/* line 216, ../src/gallery-white.sass */ +#logo h2#topic { + left: 5px; +} +/* line 218, ../src/gallery-white.sass */ +#logo #likebutton { + position: relative; + left: 30px; +} diff --git a/frontend/static/sass/stylesheets/glitter.css b/frontend/static/sass/stylesheets/glitter.css new file mode 100644 index 0000000..3690a2d --- /dev/null +++ b/frontend/static/sass/stylesheets/glitter.css @@ -0,0 +1,29 @@ +/* line 1, ../src/glitter.sass */ +#chat *, #chat span, #chat span a { + font-size: 30px; + line-height: 38px; + text-shadow: black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px, black 0 0 5px; + font-family: papyrus, comic sans, comic sans ms, sans-serif; + letter-spacing: -1px; + overflow: hidden; +} + +/* line 8, ../src/glitter.sass */ +#heading img { + position: relative; + top: -35px; + left: -18px; + z-index: 47; +} + +/* line 13, ../src/glitter.sass */ +#likebutton { + position: relative; + top: -90px; + left: -16px; +} + +/* line 17, ../src/glitter.sass */ +#chat a.u { + font-size: 24px; +} diff --git a/frontend/static/sass/stylesheets/ie.css b/frontend/static/sass/stylesheets/ie.css new file mode 100644 index 0000000..5cd5b6c --- /dev/null +++ b/frontend/static/sass/stylesheets/ie.css @@ -0,0 +1,5 @@ +/* Welcome to Compass. Use this file to write IE specific override styles. + * Import this file using the following HTML or equivalent: + * <!--[if IE]> + * <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" /> + * <![endif]--> */ diff --git a/frontend/static/sass/stylesheets/main.css b/frontend/static/sass/stylesheets/main.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/sass/stylesheets/main.css diff --git a/frontend/static/sass/stylesheets/print.css b/frontend/static/sass/stylesheets/print.css new file mode 100644 index 0000000..b0e9e45 --- /dev/null +++ b/frontend/static/sass/stylesheets/print.css @@ -0,0 +1,3 @@ +/* Welcome to Compass. Use this file to define print styles. + * Import this file using the following HTML or equivalent: + * <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */ diff --git a/frontend/static/sass/stylesheets/profile.css b/frontend/static/sass/stylesheets/profile.css new file mode 100644 index 0000000..b7d5219 --- /dev/null +++ b/frontend/static/sass/stylesheets/profile.css @@ -0,0 +1,799 @@ +/* line 17, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; +} + +/* line 22, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html { + line-height: 1; +} + +/* line 24, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, ul { + list-style: none; +} + +/* line 26, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* line 28, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, th, td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} + +/* line 30, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { + quotes: none; +} +/* line 103, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { + content: ""; + content: none; +} + +/* line 32, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { + border: none; +} + +/* line 116, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { + display: block; +} + +/* line 8, ../src/profile.sass */ +body { + background: #888888; + overflow-y: hidden; + overflow-x: hidden; + font-family: trebuchet ms, sans-serif; +} + +/* line 14, ../src/profile.sass */ +#logo { + position: absolute; + z-index: 20; + top: 15px; + left: 20px; +} +/* line 19, ../src/profile.sass */ +#logo a { + display: inline-block; +} +/* line 21, ../src/profile.sass */ +#logo a img { + padding-top: 5px; + display: inline-block; +} +/* line 24, ../src/profile.sass */ +#logo h1 { + position: relative; + top: -10px; + left: 10px; + font-size: 34px; + font-weight: normal; + font-style: italic; + font-family: georgia, garamond, serif; + color: #ff88bb; + display: inline-block; +} +/* line 34, ../src/profile.sass */ +#logo h2 { + position: relative; + display: inline-block; + font-size: 12px; + color: white; + max-width: 250px; + left: 10px; + top: -6px; + padding-right: 20px; +} + +/* line 43, ../src/profile.sass */ +#logobg { + position: absolute; + top: 10px; + left: 0; + width: 100%; + height: 64px; + background-color: black; + opacity: 0.8; + z-index: 19; +} + +/* line 52, ../src/profile.sass */ +#likebutton { + display: inline-block; + display: none; + z-index: -1; + min-width: 90px; +} +/* line 57, ../src/profile.sass */ +#likebutton a { + color: #3333ff; +} + +/* line 59, ../src/profile.sass */ +#flower { + position: absolute; + top: 0; + right: 10%; + z-index: 20; + pointer-events: none; + display: none; +} + +/* line 66, ../src/profile.sass */ +#contact { + position: absolute; + left: 0; + display: none; +} +/* line 70, ../src/profile.sass */ +#contact #avatar, #contact .avatar { + display: none; + width: 100%; +} +/* line 74, ../src/profile.sass */ +#contact .avatar { + display: block; +} +/* line 77, ../src/profile.sass */ +#contact #bio p { + color: #dddddd; + background-color: black; + padding: 10px 5px; + text-align: center; + opacity: 0.7; +} +/* line 83, ../src/profile.sass */ +#contact #bio a { + color: #eebbff; + display: block; +} +/* line 86, ../src/profile.sass */ +#contact #bio img { + width: 100%; +} + +/* line 89, ../src/profile.sass */ +#sitez { + position: absolute; + top: 30px; + right: 20px; + text-align: right; + z-index: 20; +} +/* line 95, ../src/profile.sass */ +#sitez div { + color: #dddddd; + cursor: pointer; + display: inline-block; + padding: 4px 8px 4px 8px; + float: left; +} +/* line 101, ../src/profile.sass */ +#sitez div a { + color: #bbbbcc; +} +/* line 103, ../src/profile.sass */ +#sitez div#settings-hook { + display: none; + z-index: 82; +} +/* line 104, ../src/profile.sass */ +#sitez div#settings-hook:hover { + -moz-border-radius: 10px 10px 3px 3px; + -webkit-border-radius: 10px 10px 3px 3px; + -o-border-radius: 10px 10px 3px 3px; + border-radius: 10px 10px 3px 3px; + background-color: #333333; + color: white; +} +/* line 108, ../src/profile.sass */ +#sitez div#settings-hook.opened { + -moz-border-radius: 10px 10px 3px 3px; + -webkit-border-radius: 10px 10px 3px 3px; + -o-border-radius: 10px 10px 3px 3px; + border-radius: 10px 10px 3px 3px; + background-color: #333333; + color: white; +} + +/* line 114, ../src/profile.sass */ +#fullscreen-warning { + position: fixed; + top: 50%; + left: 50%; + width: 600px; + margin-left: -300px; + margin-top: -20px; + text-align: center; + font-size: 24px; + padding: 10px; + background-color: rgba(0, 0, 0, 0.5); + color: white; + z-index: 100; + display: none; +} + +/* line 128, ../src/profile.sass */ +#settings-container { + position: fixed; + top: 53px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -o-border-radius: 10px; + border-radius: 10px; + right: 20px; + z-index: 80; + width: 500px; + background-color: #222222; + color: #657b83; + display: none; + box-shadow: 0 5px 10px black; +} +/* line 139, ../src/profile.sass */ +#settings-container .close { + margin: 10px 10px 0 0; + float: right; + color: #ded8c5; + width: 20px; + height: 14px; + font-size: 14px; + padding: 3px 0; + text-align: center; + vertical-align: middle; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -o-border-radius: 10px; + border-radius: 10px; + background-color: #000b16; +} +/* line 151, ../src/profile.sass */ +#settings-container .close:hover { + color: white; + cursor: pointer; +} +/* line 154, ../src/profile.sass */ +#settings-container #rooms-loading { + margin: 10px; +} +/* line 156, ../src/profile.sass */ +#settings-container h5 { + font-size: 16px; + color: #93a1a1; + display: block; + padding: 10px; + background-color: #333333; + -moz-border-radius: 10px 10px 0 0; + -webkit-border-radius: 10px 10px 0 0; + -o-border-radius: 10px 10px 0 0; + border-radius: 10px 10px 0 0; +} +/* line 163, ../src/profile.sass */ +#settings-container p { + padding: 10px 10px 10px 10px; + font-size: 14px; + line-height: 18px; + color: #b3c1c1; + background-color: #1b1b1f; +} +/* line 169, ../src/profile.sass */ +#settings-container label { + margin: 2px 0 0 10px; + font-size: 14px; + color: #657b83; + width: 150px; + text-align: right; + padding-right: 5px; + display: inline-block; +} +/* line 177, ../src/profile.sass */ +#settings-container span { + margin: 2px 10px 0 0; + color: #839496; + font-size: 14px; +} +/* line 181, ../src/profile.sass */ +#settings-container input { + margin: 2px 10px 0 0; + width: 100px; +} +/* line 184, ../src/profile.sass */ +#settings-container #profile-avatar, #settings-container #profile-bg { + width: 300px; +} +/* line 186, ../src/profile.sass */ +#settings-container #profile-settings-save { + font-size: 14px; +} +/* line 188, ../src/profile.sass */ +#settings-container textarea { + width: 300px; + height: 150px; +} +/* line 191, ../src/profile.sass */ +#settings-container .shim { + width: 1px; + height: 10px; +} +/* line 194, ../src/profile.sass */ +#settings-container ul { + text-decoration: none; + cursor: pointer; +} +/* line 197, ../src/profile.sass */ +#settings-container ul li { + list-style-type: none; + padding: 10px; + cursor: pointer; + border-top: 1px solid black; + background-color: transparent; + text-decoration: none; + font-size: 14px; + color: #83a1a1; +} +/* line 206, ../src/profile.sass */ +#settings-container ul li:hover { + color: #fdf6e3; +} +/* line 208, ../src/profile.sass */ +#settings-container ul a li { + color: #83a1a1; + text-decoration: none; +} +/* line 211, ../src/profile.sass */ +#settings-container ul a { + color: #83a1a1; + text-decoration: none; +} + +/* line 214, ../src/profile.sass */ +#msg { + z-index: 100; + position: fixed; + top: 10px; + right: 10px; + padding: 5px; + width: 250px; + max-height: 80%; + font-size: 12px; + background-color: #eeeeee; + overflow-y: scroll; + overflow-x: hidden; + color: #333333; +} +/* line 227, ../src/profile.sass */ +#msg strong { + color: #859900; +} +/* line 229, ../src/profile.sass */ +#msg em { + color: #dc322f; +} +/* line 231, ../src/profile.sass */ +#msg b { + color: #002b36; +} + +/* line 233, ../src/profile.sass */ +#player { + padding: 10px; + position: absolute; + background: black; +} +/* line 237, ../src/profile.sass */ +#player #projector { + display: block; + position: fixed; + background-color: black; +} +/* line 241, ../src/profile.sass */ +#player #projector #screen { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 19; +} +/* line 248, ../src/profile.sass */ +#player #projector #screen #soundcloud, #player #projector #screen #audio { + position: absolute; + top: 0; + right: 0; + background-color: black; + z-index: 21; +} +/* line 254, ../src/profile.sass */ +#player #projector #screen #soundcloud-dl, #player #projector #screen #audio-dl { + position: absolute; + top: 81px; + right: 0; + width: 81px; + padding: 5px 0 5px 0; + font-size: 13px; + text-align: center; + background-color: black; + z-index: 20; +} +/* line 263, ../src/profile.sass */ +#player #projector #screen #soundcloud-dl *, #player #projector #screen #audio-dl * { + color: #839496; +} +/* line 266, ../src/profile.sass */ +#player #projector #screen #soundcloud-img, #player #projector #screen #audio-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 20; +} +/* line 273, ../src/profile.sass */ +#player #projector #screen #soundcloud-img img, #player #projector #screen #audio-img img { + max-width: 100%; + min-height: 100%; + max-height: 100%; +} +/* line 277, ../src/profile.sass */ +#player #projector #ytscreen { + z-index: 19; + position: absolute; + top: 0; + left: 0; +} +/* line 282, ../src/profile.sass */ +#player #projector #video-title { + position: absolute; + bottom: 0; + left: 10px; + color: white; + z-index: 20; +} +/* line 288, ../src/profile.sass */ +#player #projector #video-title.fullscreen { + position: fixed; + bottom: 90px; + left: auto; + right: 30px; + font-size: 24px; +} +/* line 294, ../src/profile.sass */ +#player #projector #projimg { + width: 100%; + height: 100%; +} +/* line 297, ../src/profile.sass */ +#player nav#controls { + z-index: 40; + position: absolute; + display: none; +} +/* line 301, ../src/profile.sass */ +#player nav#controls #video-link { + color: #839496; +} +/* line 303, ../src/profile.sass */ +#player nav#controls #scan.blinkOn { + background-color: white; + color: black; +} +/* line 306, ../src/profile.sass */ +#player nav#controls #scan.blinkOff { + background-color: black; + color: white; +} +/* line 309, ../src/profile.sass */ +#player nav#controls #like { + color: #ee44bb; +} +/* line 311, ../src/profile.sass */ +#player nav#controls #like.liked { + color: #4444ff; +} + +/* line 313, ../src/profile.sass */ +#playlistbg { + position: absolute; + background-color: black; + opacity: 0.5; +} + +/* line 317, ../src/profile.sass */ +#playlist { + position: absolute; + z-index: 90; + width: 100%; +} +/* line 321, ../src/profile.sass */ +#playlist ul#queue { + width: 100%; + border-top: 1px solid #888888; + border-left: 1px solid #888888; + border-bottom: 1px solid #888888; + -webkit-padding-start: 0; + -webkit-margin-before: 0; + overflow-y: scroll; + overflow-x: hidden; + z-index: 90; +} +/* line 331, ../src/profile.sass */ +#playlist ul#queue li { + padding: 5px; + display: block; + cursor: pointer; + border-bottom: 1px solid #333333; +} +/* line 336, ../src/profile.sass */ +#playlist ul#queue li span.title { + color: #dddddd; + display: block; + padding: 5px; + font-size: 15px; + z-index: 1; +} +/* line 342, ../src/profile.sass */ +#playlist ul#queue li span.title:hover { + color: white; +} +/* line 344, ../src/profile.sass */ +#playlist ul#queue li a.user { + float: right; + font-size: 14px; + padding: 0 5px; + color: #d33682; + padding: 5px; + z-index: 2; + text-decoration: none; +} +/* line 352, ../src/profile.sass */ +#playlist ul#queue li span.like { + float: right; + font-size: 14px; + color: #657b83; + padding: 5px; + z-index: 3; +} +/* line 358, ../src/profile.sass */ +#playlist ul#queue li span.like.liked { + color: #c357a3; +} +/* line 360, ../src/profile.sass */ +#playlist ul#queue li span.score { + float: right; + font-size: 14px; + color: #bbbbbb; + padding: 5px 10px 5px 5px; +} +/* line 365, ../src/profile.sass */ +#playlist ul#queue li.playing { + background-color: #222222; +} +/* line 367, ../src/profile.sass */ +#playlist ul#queue li.playing span.title { + color: white; +} +/* line 369, ../src/profile.sass */ +#playlist ul#queue li#queueLess { + color: white; + text-align: center; + border: 0; + border-bottom: 1px solid #333333; + font-size: 18px; + padding: 10px 0; + cursor: pointer; +} +/* line 372, ../src/profile.sass */ +#playlist ul#queue li#queueLess:hover { + background-color: #666666; + color: white; +} +/* line 380, ../src/profile.sass */ +#playlist ul#queue li#queueMore { + color: white; + text-align: center; + border: 0; + font-size: 33px; + padding: 20px 20px 20px 20px; + cursor: pointer; +} +/* line 383, ../src/profile.sass */ +#playlist ul#queue li#queueMore:hover { + background-color: #666666; + color: white; +} +/* line 390, ../src/profile.sass */ +#playlist ul#queue li#queueDone { + color: #dddddd; + text-align: center; + border: 0; + font-size: 33px; + padding: 80px 20px 200px 20px; +} +/* line 396, ../src/profile.sass */ +#playlist ul#queue li#queueLoading { + text-align: center; + color: white; + font-size: 24px; + padding: 80px; +} +/* line 401, ../src/profile.sass */ +#playlist ol { + -webkit-padding-start: 0; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + display: block; + position: relative; + top: 1px; +} +/* line 408, ../src/profile.sass */ +#playlist ol li { + padding: 5px 8px 8px 8px; + margin: 0 0 0 10px; + list-style-type: none; + border-top: 1px solid black; + border-right: 1px solid black; + border-left: 1px solid black; + border-bottom: 1px solid #888888; + display: inline-block; + background-color: #333333; + color: #bbbbbb; + cursor: pointer; + opacity: 0.7; + z-index: 89; +} +/* line 422, ../src/profile.sass */ +#playlist ol li.mode { + position: relative; + padding: 8px 8px 8px 8px; + border-color: #888888; + border-bottom: 1px solid #111111; + background-color: #111111; + color: white; + z-index: 91; +} + +/* line 430, ../src/profile.sass */ +nav { + z-index: 10; + margin: 0 auto; +} +/* line 433, ../src/profile.sass */ +nav button, nav #video-link { + background-color: #333333; + color: #dddddd; + border: 0; + font-size: 14px; + min-width: 40px; + min-height: 20px; + padding: 5px 5px; + position: relative; + top: -1px; +} +/* line 436, ../src/profile.sass */ +nav button:hover, nav #video-link:hover { + background-color: #666666; + color: white; +} +/* line 446, ../src/profile.sass */ +nav #video-link { + padding: 6px 5px 5px 5px; +} + +/* line 448, ../src/profile.sass */ +#msg { + display: none; +} + +/* line 450, ../src/profile.sass */ +#gif-container { + position: absolute; + left: 0; + width: 100%; + padding-left: 10%; + display: block; + padding-bottom: 200px; +} +/* line 457, ../src/profile.sass */ +#gif-container #gifs { + clear: both; + display: block; + text-align: center; + top: 0; + max-width: 80%; + margin: 0 0 200px 0; + box-shadow: 0 5px 10px black; + background-color: white; +} +/* line 466, ../src/profile.sass */ +#gif-container #gifs div { + padding: 10px; + display: inline-block; +} +/* line 469, ../src/profile.sass */ +#gif-container #gifs div img { + max-width: 350px; + max-height: 400px; +} + +/* line 472, ../src/profile.sass */ +#bg { + position: fixed; + top: 0; + left: 0; + opacity: 1; + z-index: -3; + width: 100%; + height: 100%; + display: none; +} +/* line 481, ../src/profile.sass */ +#bg img { + width: 100%; + height: 100%; +} + +/* line 485, ../src/profile.sass */ +.arrow-play { + width: 0; + height: 0; + border-top: 4.5px solid transparent; + border-left: 9.5px solid white; + border-bottom: 4.5px solid transparent; + display: inline-block; +} + +/* line 492, ../src/profile.sass */ +.arrow-pause { + width: 0; + height: 0; + border-top: 5px solid white; + border-right: 2.5px solid white; + border-bottom: 4px solid white; + border-left: 0; + display: inline-block; +} + +/* line 500, ../src/profile.sass */ +.arrow-prev { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-right: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} + +/* line 507, ../src/profile.sass */ +.arrow-next { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-left: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} diff --git a/frontend/static/sass/stylesheets/roomlist.css b/frontend/static/sass/stylesheets/roomlist.css new file mode 100644 index 0000000..c74dcd2 --- /dev/null +++ b/frontend/static/sass/stylesheets/roomlist.css @@ -0,0 +1,179 @@ +/* line 1, ../src/roomlist.sass */ +.roomdiv { + width: 200px; + height: 100px; + display: block; + float: left; + text-align: center; + vertical-align: bottom; + position: relative; + font-size: 30px; + color: white; + padding-top: 160px; + background-color: black; + cursor: pointer; +} +/* line 14, ../src/roomlist.sass */ +.roomdiv * { + cursor: pointer; +} +/* line 16, ../src/roomlist.sass */ +.roomdiv .count { + font-size: 160px; + color: white; + position: absolute; + left: 0; + top: 10px; + width: 100%; + text-align: center; + vertical-align: middle; + z-index: 3; + opacity: 0.9; +} +/* line 27, ../src/roomlist.sass */ +.roomdiv .roomname { + position: absolute; + left: 0; + top: 180px; + width: 100%; + text-align: center; + vertical-align: middle; + opacity: 0.9; + z-index: 4; +} +/* line 36, ../src/roomlist.sass */ +.roomdiv .roombg { + position: absolute; + background-position: center center; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0.8; + z-index: 1; + cursor: pointer; +} +/* line 47, ../src/roomlist.sass */ +.roomdiv:hover .roomname { + opacity: 1; +} +/* line 49, ../src/roomlist.sass */ +.roomdiv:hover .count { + opacity: 1; +} +/* line 51, ../src/roomlist.sass */ +.roomdiv:hover .roombg { + opacity: 0.9; +} + +/* line 53, ../src/roomlist.sass */ +#roomlist { + padding-top: 90px; +} + +/* line 55, ../src/roomlist.sass */ +#roomlist a { + text-decoration: none; + cursor: pointer; +} + +/* line 58, ../src/roomlist.sass */ +body { + overflow-y: scroll; + background: black; +} + +/* line 61, ../src/roomlist.sass */ +#logo { + top: 5px; + left: 10px; +} +/* line 65, ../src/roomlist.sass */ +#logo h1#header { + font-size: 30px; + color: #44ddff; + top: 8px; + max-width: 500px; +} +/* line 71, ../src/roomlist.sass */ +#logo h2.preamblish { + display: inline-block; + position: relative; + top: -15px; + left: 10px; + font-size: 12px; + color: white; + max-width: 250px; + padding-right: 20px; +} + +/* line 81, ../src/roomlist.sass */ +#curtain { + background: #080810; + opacity: 0.3; + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 10; + display: none; +} + +/* line 91, ../src/roomlist.sass */ +#login { + background: black; + display: block; + width: 50%; + top: 20%; + left: 50%; + margin-left: -25%; + padding: 30px; + padding-bottom: 60px; + z-index: 20; + position: fixed; + text-align: center; + box-shadow: 0 5px 10px black; +} +/* line 104, ../src/roomlist.sass */ +#login img { + margin-bottom: 20px; +} +/* line 106, ../src/roomlist.sass */ +#login label { + min-width: 20%; + display: inline-block; + text-align: right; + padding-right: 10px; + font-size: 18px; + color: white; +} +/* line 113, ../src/roomlist.sass */ +#login #button-shim { + width: 30%; + display: inline-block; + text-align: left; + padding: 10px 10px 10px 0; + margin-right: 20px; +} +/* line 119, ../src/roomlist.sass */ +#login #button-shim button { + padding: 2px 5px; +} +/* line 121, ../src/roomlist.sass */ +#login #login-username, #login #login-password { + width: 30%; + margin-right: 10px; + font-size: 24px; + border: 2px solid #880066; + padding: 10px; +} +/* line 127, ../src/roomlist.sass */ +#login a { + color: #6688ff; + text-decoration: underline; +} +/* line 130, ../src/roomlist.sass */ +#login button { + font-size: 24px; +} diff --git a/frontend/static/sass/stylesheets/screen.css b/frontend/static/sass/stylesheets/screen.css new file mode 100644 index 0000000..548cbb9 --- /dev/null +++ b/frontend/static/sass/stylesheets/screen.css @@ -0,0 +1,1323 @@ +/* line 17, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; +} + +/* line 22, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html { + line-height: 1; +} + +/* line 24, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, ul { + list-style: none; +} + +/* line 26, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* line 28, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, th, td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} + +/* line 30, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { + quotes: none; +} +/* line 103, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { + content: ""; + content: none; +} + +/* line 32, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { + border: none; +} + +/* line 116, ../../../../../lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { + display: block; +} + +/* line 7, ../src/screen.sass */ +body { + font-family: trebuchet ms, helvetica, arial, sans-serif; + width: 100%; + height: 100%; + overflow: hidden; + background: black; +} + +/* line 13, ../src/screen.sass */ +#bg { + position: fixed; + top: 0; + left: 0; + opacity: 1; + z-index: -3; + width: 100%; + height: 100%; +} + +/* line 21, ../src/screen.sass */ +#bg img { + width: 100%; + height: 100%; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: -moz-crisp-edges; + image-rendering: -webkit-optimize-contrast; +} + +/* line 27, ../src/screen.sass */ +#loading { + z-index: 20; + background: transparent; + color: #06033c; + text-shadow: #060363 0 0 50px; + display: block; + position: fixed; + width: 100%; + padding: 20px; + top: 30%; + left: 10%; + font-size: 170px; + font-weight: bold; + text-align: left; + white-space: no-wrap; + letter-spacing: -3px; + pointer-events: none; +} + +/* line 45, ../src/screen.sass */ +#msg { + z-index: 100; + position: fixed; + top: 10px; + right: 10px; + padding: 5px; + width: 350px; + max-height: 80%; + font-size: 12px; + background-color: #eeeeee; + overflow-y: scroll; + overflow-x: hidden; + color: #333333; +} +/* line 58, ../src/screen.sass */ +#msg strong { + color: #859900; +} +/* line 60, ../src/screen.sass */ +#msg em { + color: #dc322f; +} +/* line 62, ../src/screen.sass */ +#msg b { + color: #002b36; +} + +/* line 64, ../src/screen.sass */ +#player { + padding: 10px; + position: absolute; + background: black; +} +/* line 68, ../src/screen.sass */ +#player #projector { + display: block; + position: absolute; + background-color: black; +} +/* line 72, ../src/screen.sass */ +#player #projector #screen { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 19; +} +/* line 79, ../src/screen.sass */ +#player #projector #screen #soundcloud, #player #projector #screen #audio { + position: absolute; + top: 0; + right: 0; + background-color: black; + z-index: 21; +} +/* line 85, ../src/screen.sass */ +#player #projector #screen #soundcloud-dl, #player #projector #screen #audio-dl { + position: absolute; + top: 81px; + right: 0; + width: 81px; + padding: 5px 0 5px 0; + font-size: 13px; + text-align: center; + background-color: black; + z-index: 20; +} +/* line 94, ../src/screen.sass */ +#player #projector #screen #soundcloud-dl *, #player #projector #screen #audio-dl * { + color: #839496; +} +/* line 97, ../src/screen.sass */ +#player #projector #screen #soundcloud-img, #player #projector #screen #audio-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 20; +} +/* line 104, ../src/screen.sass */ +#player #projector #screen #soundcloud-img img, #player #projector #screen #audio-img img { + max-width: 100%; + min-height: 100%; + max-height: 100%; +} +/* line 108, ../src/screen.sass */ +#player #projector #ytscreen { + z-index: 19; + position: absolute; + top: 0; + left: 0; +} +/* line 113, ../src/screen.sass */ +#player #projector #video-title { + position: absolute; + bottom: 0; + left: 0; + color: white; + z-index: 20; +} +/* line 119, ../src/screen.sass */ +#player #projector #video-title.fullscreen { + position: fixed; + bottom: 90px; + left: auto; + right: 30px; + font-size: 24px; +} +/* line 125, ../src/screen.sass */ +#player #projector #projimg { + width: 100%; + height: 100%; +} +/* line 128, ../src/screen.sass */ +#player nav#controls { + z-index: 40; + position: absolute; +} +/* line 131, ../src/screen.sass */ +#player nav#controls #video-link { + color: #839496; +} +/* line 133, ../src/screen.sass */ +#player nav#controls #scan.blinkOn { + background-color: white; + color: black; +} +/* line 136, ../src/screen.sass */ +#player nav#controls #scan.blinkOff { + background-color: black; + color: white; +} +/* line 139, ../src/screen.sass */ +#player nav#controls #like { + color: #ee44bb; +} +/* line 141, ../src/screen.sass */ +#player nav#controls #like.liked { + color: #4444ff; +} +/* line 143, ../src/screen.sass */ +#player nav#controls #mute.muted { + background-color: white; + color: black; +} + +/* line 146, ../src/screen.sass */ +#playlistbg { + position: absolute; + background-color: black; + opacity: 0.3; +} + +/* line 150, ../src/screen.sass */ +#playlist { + position: absolute; + z-index: 90; + width: 100%; + overflow-y: auto; + overflow-x: hidden; +} +/* line 156, ../src/screen.sass */ +#playlist ul#queue { + width: 100%; +} +/* line 161, ../src/screen.sass */ +#playlist ul#queue li { + padding: 5px; + display: block; + cursor: pointer; + border-bottom: 1px solid #333333; +} +/* line 166, ../src/screen.sass */ +#playlist ul#queue li span.title { + color: #dddddd; + display: block; + padding: 5px; + z-index: 1; +} +/* line 171, ../src/screen.sass */ +#playlist ul#queue li span.title:hover { + color: #dd88ff; + cursor: pointer; +} +/* line 174, ../src/screen.sass */ +#playlist ul#queue li a.user { + float: right; + font-size: 14px; + padding: 0 5px; + color: #d33682; + padding: 5px; + z-index: 2; + text-decoration: none; +} +/* line 182, ../src/screen.sass */ +#playlist ul#queue li span.like { + float: right; + font-size: 14px; + color: #657b83; + padding: 5px; + z-index: 3; +} +/* line 188, ../src/screen.sass */ +#playlist ul#queue li span.like.liked { + color: #c357a3; +} +/* line 190, ../src/screen.sass */ +#playlist ul#queue li.playing { + background-color: #222222; +} +/* line 192, ../src/screen.sass */ +#playlist ul#queue li.playing span.title { + color: white; +} + +/* line 194, ../src/screen.sass */ +#room, user { + padding: 10px; +} +/* line 196, ../src/screen.sass */ +#room label, user label { + color: #657b83; + width: 100px; + text-align: right; + padding-right: 5px; + display: inline-block; +} +/* line 202, ../src/screen.sass */ +#room span, user span { + color: #073642; +} + +/* line 206, ../src/screen.sass */ +#curtain { + background: #080810; + opacity: 0.3; + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 10; + display: none; +} + +/* line 216, ../src/screen.sass */ +#login { + background: black; + display: block; + width: 50%; + top: 20%; + left: 50%; + margin-left: -25%; + padding: 30px; + padding-bottom: 60px; + z-index: 20; + position: fixed; + text-align: center; + box-shadow: 0 5px 10px black; +} +/* line 229, ../src/screen.sass */ +#login img { + margin-bottom: 20px; +} +/* line 231, ../src/screen.sass */ +#login label { + min-width: 20%; + display: inline-block; + text-align: right; + padding-right: 10px; + font-size: 18px; + color: white; +} +/* line 238, ../src/screen.sass */ +#login #button-shim { + width: 30%; + display: inline-block; + text-align: left; + padding: 10px 10px 10px 0; + margin-right: 20px; +} +/* line 244, ../src/screen.sass */ +#login #button-shim button { + padding: 2px 5px; +} +/* line 246, ../src/screen.sass */ +#login #login-username, #login #login-password { + width: 30%; + margin-right: 10px; + font-size: 24px; + border: 2px solid #880066; + padding: 10px; +} +/* line 252, ../src/screen.sass */ +#login a { + color: #6688ff; + text-decoration: underline; +} + +/* line 255, ../src/screen.sass */ +#sitez { + position: fixed; + top: 24px; + right: 30px; + color: #888888; + z-index: 82; + color: #aaaaaa; +} +/* line 262, ../src/screen.sass */ +#sitez a, #sitez #logout { + cursor: pointer; + color: #aaaaaa; + text-decoration: underline; +} +/* line 266, ../src/screen.sass */ +#sitez select option { + color: #666666; + text-decoration: none; + padding-right: 3px; +} +/* line 270, ../src/screen.sass */ +#sitez button { + font-size: 24px; + background: #030303; + color: white; + padding: 2px; +} +/* line 275, ../src/screen.sass */ +#sitez a#faqlink { + color: #88ffff; +} +/* line 277, ../src/screen.sass */ +#sitez div { + cursor: pointer; + display: inline-block; + padding: 8px 8px 5px 8px; +} +/* line 281, ../src/screen.sass */ +#sitez div:hover { + -moz-border-radius: 10px 10px 3px 3px; + -webkit-border-radius: 10px 10px 3px 3px; + -o-border-radius: 10px 10px 3px 3px; + border-radius: 10px 10px 3px 3px; + background-color: #333333; +} +/* line 284, ../src/screen.sass */ +#sitez div.opened { + -moz-border-radius: 10px 10px 3px 3px; + -webkit-border-radius: 10px 10px 3px 3px; + -o-border-radius: 10px 10px 3px 3px; + border-radius: 10px 10px 3px 3px; + background-color: #333333; +} + +/* line 287, ../src/screen.sass */ +nav { + z-index: 10; + margin: 0 auto; +} +/* line 290, ../src/screen.sass */ +nav button, nav #video-link { + background-color: #333333; + color: #dddddd; + border: 0; + font-size: 14px; + min-width: 40px; + min-height: 20px; + padding: 5px 5px; + position: relative; + top: -1px; +} +/* line 293, ../src/screen.sass */ +nav button:hover, nav #video-link:hover { + background-color: #666666; + color: white; +} +/* line 303, ../src/screen.sass */ +nav #video-link { + top: -2px; + padding-bottom: 6px; +} + +/* line 306, ../src/screen.sass */ +#lunacy { + z-index: 40; + background: #dddddd; + color: black; + display: block; + width: 700px; + position: fixed; + top: 20%; + left: 50%; + margin-left: -390px; + opacity: 0.7; + padding: 40px; + text-align: center; + font-size: 48px; +} + +/* line 320, ../src/screen.sass */ +#plea { + z-index: 30; + background: #dddddd; + color: black; + display: block; + width: 400px; + position: fixed; + top: 20%; + left: 50%; + margin-left: -240px; + opacity: 0.7; + padding: 40px; + text-align: center; + font-size: 48px; +} + +/* line 335, ../src/screen.sass */ +#logobg { + position: fixed; + top: 10px; + left: 0; + width: 100%; + height: 64px; + background-color: black; + opacity: 0.8; + z-index: 45; +} + +/* line 344, ../src/screen.sass */ +#logo { + position: fixed; + top: 10px; + z-index: 46; + left: 10px; +} +/* line 349, ../src/screen.sass */ +#logo a { + float: left; + display: inline-block; +} +/* line 352, ../src/screen.sass */ +#logo a img { + display: inline-block; +} +/* line 354, ../src/screen.sass */ +#logo #scanjam { + padding: 10px 15px 10px 0; +} +/* line 356, ../src/screen.sass */ +#logo #preamble { + display: inline-block; + font-size: 12px; + color: white; + max-width: 80px; + padding-left: 15px; +} +/* line 362, ../src/screen.sass */ +#logo h1 { + padding: 15px 15px 0 10px; + font-size: 34px; + color: white; + font-weight: normal; + font-style: italic; + font-family: georgia, garamond, serif; + color: #88ffff; + display: inline-block; +} +/* line 371, ../src/screen.sass */ +#logo h2 { + display: inline-block; + font-size: 16px; + color: white; + position: relative; + left: 20px; + top: -5px; + color: #839496; +} +/* line 379, ../src/screen.sass */ +#logo h2 a { + display: inline; + float: none; + color: #268bd2; +} +/* line 383, ../src/screen.sass */ +#logo h2 img { + max-height: 20px; + max-width: 20px; + display: inline-block; +} +/* line 387, ../src/screen.sass */ +#logo h2.preamblish { + font-size: 12px; + color: white; + max-width: 250px; + left: 0; + top: 9px; + padding-right: 20px; +} +/* line 394, ../src/screen.sass */ +#logo h2.radio { + font-size: 12px; + top: -8px; + left: 30px; +} +/* line 395, ../src/screen.sass */ +#logo h2.radio a { + color: #ddeeff; +} +/* line 400, ../src/screen.sass */ +#logo #likebutton { + display: inline-block; + display: none; + position: relative; + top: -5px; + width: 90px; + height: 21px; + z-index: -1; +} + +/* line 408, ../src/screen.sass */ +#glasspopcornlogo { + position: absolute; + top: 80px; + left: 15px; + pointer-events: none; + opacity: 0.5; + z-index: 8; +} +/* line 415, ../src/screen.sass */ +#glasspopcornlogo img { + z-index: 8; + pointer-events: none; +} + +/* line 418, ../src/screen.sass */ +#likereport { + position: fixed; + width: 100px; + padding: 20px; + z-index: 100; + overflow-y: hidden; +} +/* line 424, ../src/screen.sass */ +#likereport a { + background-color: #222222; + display: block; + text-decoration: none; + padding: 5px; + opacity: 0.95; +} + +/* line 431, ../src/screen.sass */ +#form { + position: fixed; + bottom: 10px; + left: 10px; + padding: 10px 10px 10px 10px; + background-color: black; + white-space: nowrap; + z-index: 31; +} +/* line 439, ../src/screen.sass */ +#form #chat-message { + border: 0; + outline: 0; + font-size: 18px; + padding: 5px; + margin-right: 5px; + background-color: #f8f8f8; +} +/* line 446, ../src/screen.sass */ +#form #chat-message:hover { + background-color: white; +} +/* line 448, ../src/screen.sass */ +#form button { + margin: 0; + outline: 0; + border: 0; + background-color: #333333; + color: #dddddd; + padding: 4px 6px; + position: relative; + top: 1px; + font-size: 20px; +} +/* line 454, ../src/screen.sass */ +#form button:hover { + background-color: #666666; + color: white; +} +/* line 462, ../src/screen.sass */ +#form #videochat-badge { + cursor: auto; + pointer-events: none; + -moz-border-radius: 8px; + -webkit-border-radius: 8px; + -o-border-radius: 8px; + border-radius: 8px; + font-size: 10px; + background-color: red; + color: white; + position: absolute; + width: 10px; + height: 10px; + text-align: center; + padding: 2px 2px; + display: none; + z-index: 32; +} + +/* line 476, ../src/screen.sass */ +#formbg { + background-color: black; + opacity: 0.7; +} + +/* line 480, ../src/screen.sass */ +#chatbg { + position: fixed; + bottom: 100px; + left: 20px; + padding: 10px; + width: 600px; + background-color: black; + padding: 0 10px 5px 10px; + opacity: 0.25; + z-index: 9; +} + +/* line 491, ../src/screen.sass */ +#chat { + padding: 0 10px 5px 10px; + position: fixed; + font-size: 18px; + line-height: 26px; + vertical-align: bottom; + overflow-y: hidden; + overflow-x: hidden; + background: transparent; + z-index: 30; +} +/* line 501, ../src/screen.sass */ +#chat a { + font-weight: normal; + font-size: 11px; + opacity: 0.8; + color: #44bbff; + text-decoration: underline; +} +/* line 507, ../src/screen.sass */ +#chat a.u { + font-weight: bold; + padding-right: 10px; + display: inline-block; + color: #ff0066; + opacity: 1; + text-decoration: none; + min-width: 80px; + overflow-x: hidden; + font-size: 16px; + line-height: 26px; + vertical-align: bottom; +} +/* line 519, ../src/screen.sass */ +#chat a.pic { + opacity: 1; +} +/* line 521, ../src/screen.sass */ +#chat span { + color: honeydew; + text-shadow: black 0 0 2px; + font-weight: bold; +} +/* line 525, ../src/screen.sass */ +#chat .ytlink { + font-size: 11px; + color: #88dddd; + cursor: pointer; + text-decoration: underline; + text-shadow: none; + text-shadow: black 0 0 1px; + font-weight: normal; + opacity: 1; +} +/* line 534, ../src/screen.sass */ +#chat .ytlink:hover { + color: #dd66ff; + text-decoration: underline; + text-shadow: black 0 0 1px; +} +/* line 538, ../src/screen.sass */ +#chat .ytlink.playing { + color: #ddaaff; + font-size: 12px; + font-weight: normal; + text-decoration: none; +} +/* line 543, ../src/screen.sass */ +#chat .ytlink.playing::before { + text-decoration: none; + content: "\25b6 "; + font-weight: normal; +} +/* line 547, ../src/screen.sass */ +#chat img { + max-width: 350px; + max-height: 400px; + border: 0; +} +/* line 551, ../src/screen.sass */ +#chat #shim { + width: 10px; + height: 500px; +} + +/* line 554, ../src/screen.sass */ +#chat.fullscreen { + overflow-y: hidden; +} +/* line 556, ../src/screen.sass */ +#chat.fullscreen:hover { + overflow-y: hidden; +} + +/* line 558, ../src/screen.sass */ +#webcam-container { + z-index: 100; + position: fixed; + right: 500px; + bottom: 100px; + background-color: black; + padding: 10px; + display: none; +} + +/* line 566, ../src/screen.sass */ +#lastlogbg { + position: fixed; + background-color: black; + opacity: 0.5; + padding: 10px; + z-index: 31; +} + +/* line 572, ../src/screen.sass */ +#lastlogbox { + position: fixed; + font-size: 14px; + padding: 10px; + z-index: 32; +} +/* line 577, ../src/screen.sass */ +#lastlogbox h4 { + font-size: 12px; + font-weight: bold; + color: #eeeeee; + padding-bottom: 5px; +} +/* line 582, ../src/screen.sass */ +#lastlogbox ul { + border-top: 1px solid black; +} + +/* line 584, ../src/screen.sass */ +li.ll { + list-style-type: none; +} +/* line 586, ../src/screen.sass */ +li.ll a { + color: #d0e0fe; + padding: 5px 0; + border-bottom: 1px solid black; + display: block; + text-shadow: black 0 0 2px; + text-decoration: underline; + font-size: 16px; + font-weight: bold; +} + +/* line 596, ../src/screen.sass */ +#flower { + position: absolute; + top: 0; + right: 10%; + z-index: 50; + pointer-events: none; + display: none; +} + +/* line 603, ../src/screen.sass */ +#plant { + position: absolute; + bottom: 0; + right: 50%; + z-index: 50; + pointer-events: none; + display: none; +} + +/* line 610, ../src/screen.sass */ +#msg { + display: none; +} + +/* line 612, ../src/screen.sass */ +button { + font-size: 24px; + background: #030303; + color: white; + padding: 2px; +} + +/* line 617, ../src/screen.sass */ +#settings-container, #rooms-container, #about-container, #videochat-container { + position: fixed; + top: 59px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -o-border-radius: 10px; + border-radius: 10px; + right: 20px; + z-index: 80; + width: 500px; + background-color: #222222; + color: #657b83; + display: none; + box-shadow: 0 5px 10px black; +} +/* line 628, ../src/screen.sass */ +#settings-container .close, #rooms-container .close, #about-container .close, #videochat-container .close { + margin: 10px 10px 0 0; + float: right; + color: #ded8c5; + width: 20px; + height: 14px; + font-size: 14px; + padding: 3px 0; + text-align: center; + vertical-align: middle; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -o-border-radius: 10px; + border-radius: 10px; + background-color: #000b16; +} +/* line 640, ../src/screen.sass */ +#settings-container .close:hover, #rooms-container .close:hover, #about-container .close:hover, #videochat-container .close:hover { + color: white; + cursor: pointer; +} +/* line 643, ../src/screen.sass */ +#settings-container #rooms-loading, #rooms-container #rooms-loading, #about-container #rooms-loading, #videochat-container #rooms-loading { + margin: 10px; +} +/* line 645, ../src/screen.sass */ +#settings-container h5, #rooms-container h5, #about-container h5, #videochat-container h5 { + font-size: 16px; + color: #93a1a1; + display: block; + padding: 10px; + background-color: #333333; + -moz-border-radius: 10px 10px 0 0; + -webkit-border-radius: 10px 10px 0 0; + -o-border-radius: 10px 10px 0 0; + border-radius: 10px 10px 0 0; +} +/* line 652, ../src/screen.sass */ +#settings-container p, #rooms-container p, #about-container p, #videochat-container p { + padding: 10px 10px 10px 10px; + font-size: 14px; + line-height: 18px; + color: #b3c1c1; + background-color: #1b1b1f; +} +/* line 658, ../src/screen.sass */ +#settings-container label, #rooms-container label, #about-container label, #videochat-container label { + margin: 2px 0 0 10px; + font-size: 14px; + color: #657b83; + width: 150px; + text-align: right; + padding-right: 5px; + display: inline-block; +} +/* line 666, ../src/screen.sass */ +#settings-container span, #rooms-container span, #about-container span, #videochat-container span { + margin: 2px 10px 0 0; + color: #839496; + font-size: 14px; +} +/* line 670, ../src/screen.sass */ +#settings-container span#room-mod-tag a, #rooms-container span#room-mod-tag a, #about-container span#room-mod-tag a, #videochat-container span#room-mod-tag a { + float: right; + padding: 0 10px 10px 0; + display: block; + color: #dc322f; +} +/* line 675, ../src/screen.sass */ +#settings-container span#gallery-link a, #rooms-container span#gallery-link a, #about-container span#gallery-link a, #videochat-container span#gallery-link a { + color: #268bd2; + padding: 0 10px 10px 0; + display: block; + float: right; +} +/* line 680, ../src/screen.sass */ +#settings-container button, #rooms-container button, #about-container button, #videochat-container button { + position: relative; + left: 3px; +} +/* line 683, ../src/screen.sass */ +#settings-container input, #rooms-container input, #about-container input, #videochat-container input { + margin: 2px 10px 0 0; + width: 100px; +} +/* line 686, ../src/screen.sass */ +#settings-container #room-topic, #settings-container #room-bg, #settings-container #room-bgreset, #rooms-container #room-topic, #rooms-container #room-bg, #rooms-container #room-bgreset, #about-container #room-topic, #about-container #room-bg, #about-container #room-bgreset, #videochat-container #room-topic, #videochat-container #room-bg, #videochat-container #room-bgreset { + width: 300px; +} +/* line 688, ../src/screen.sass */ +#settings-container #room-settings-save, #rooms-container #room-settings-save, #about-container #room-settings-save, #videochat-container #room-settings-save { + font-size: 14px; +} +/* line 690, ../src/screen.sass */ +#settings-container .shim, #rooms-container .shim, #about-container .shim, #videochat-container .shim { + width: 1px; + height: 10px; +} +/* line 693, ../src/screen.sass */ +#settings-container ul, #rooms-container ul, #about-container ul, #videochat-container ul { + text-decoration: none; + cursor: pointer; +} +/* line 696, ../src/screen.sass */ +#settings-container ul li, #rooms-container ul li, #about-container ul li, #videochat-container ul li { + list-style-type: none; + padding: 10px; + cursor: pointer; + border-top: 1px solid black; + background-color: transparent; + text-decoration: none; + font-size: 14px; + color: #83a1a1; +} +/* line 705, ../src/screen.sass */ +#settings-container ul li:hover, #rooms-container ul li:hover, #about-container ul li:hover, #videochat-container ul li:hover { + color: #fdf6e3; +} +/* line 707, ../src/screen.sass */ +#settings-container ul a li, #rooms-container ul a li, #about-container ul a li, #videochat-container ul a li { + color: #83a1a1; + text-decoration: none; +} +/* line 710, ../src/screen.sass */ +#settings-container ul a, #rooms-container ul a, #about-container ul a, #videochat-container ul a { + color: #83a1a1; + text-decoration: none; +} + +/* line 713, ../src/screen.sass */ +#rooms-container { + right: 20px; + z-index: 80; + width: 300px; + max-height: 300px; +} + +/* line 718, ../src/screen.sass */ +#about-container { + right: 20px; + z-index: 80; + width: 300px; +} + +/* line 722, ../src/screen.sass */ +#videochat-container { + right: 20px; + z-index: 80; + width: 300px; + display: none; + cursor: pointer; +} +/* line 728, ../src/screen.sass */ +#videochat-container #videochat-disable { + display: none; +} + +/* line 730, ../src/screen.sass */ +#tokbox-embed { + position: absolute; + bottom: 10px; + left: 10px; + height: 150px; + z-index: 80; + display: none; + overflow-y: auto; +} +/* line 738, ../src/screen.sass */ +#tokbox-embed #tokbox-publisher, #tokbox-embed #tokbox-subscribers { + float: left; +} +/* line 740, ../src/screen.sass */ +#tokbox-embed #tokbox-publisher object, #tokbox-embed #tokbox-subscribers object { + float: left; +} +/* line 742, ../src/screen.sass */ +#tokbox-embed #tokbox-settings { + position: absolute; + top: 0; + right: 10px; + padding: 5px; + font-size: 12px; + color: #bbbbbb; + background-color: black; + text-align: right; +} +/* line 751, ../src/screen.sass */ +#tokbox-embed #tokbox-settings button { + padding: 2px; + font-size: 12px; + background-color: #333333; + color: #888888; + min-width: 30px; +} +/* line 757, ../src/screen.sass */ +#tokbox-embed #tokbox-settings button.on { + background-color: #dd3333; + color: white; +} + +/* line 760, ../src/screen.sass */ +.roomhello { + width: 400px; + color: white; + padding: 10px; + font-size: 18px; + background-color: black; + cursor: pointer; + position: fixed; + top: 85px; + left: 15px; + opacity: 0.9; +} + +/* line 771, ../src/screen.sass */ +.modhello { + width: 400px; + color: white; + padding: 5px; + background-color: black; + cursor: pointer; + margin-top: 10px; +} + +/* line 778, ../src/screen.sass */ +.glitter { + pointer-events: none; + position: absolute; + z-index: 23; +} + +/* line 783, ../src/screen.sass */ +.arrow-play { + width: 0; + height: 0; + border-top: 4.5px solid transparent; + border-left: 9.5px solid white; + border-bottom: 4.5px solid transparent; + display: inline-block; +} + +/* line 790, ../src/screen.sass */ +.arrow-pause { + width: 0; + height: 0; + border-top: 5px solid white; + border-right: 2.5px solid white; + border-bottom: 4px solid white; + border-left: 0; + display: inline-block; +} + +/* line 798, ../src/screen.sass */ +.arrow-prev { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-right: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} + +/* line 805, ../src/screen.sass */ +.arrow-next { + width: 0; + height: 0; + border-top: 4px solid transparent; + border-left: 4px solid white; + border-bottom: 4px solid transparent; + display: inline-block; +} + +/* line 813, ../src/screen.sass */ +#search-terms { + font-size: 14px; + padding: 2px 2px; + width: 200px; + position: relative; + top: -4px; + left: -10px; + background-image: url("/img/magnify.png"); + background-position: right center; + background-repeat: no-repeat; + border: 0; + outline: 0; + background-color: #dddddd; +} +/* line 826, ../src/screen.sass */ +#search-terms:hover { + background-color: white; +} +/* line 828, ../src/screen.sass */ +#search-terms:focus { + background-color: white; +} + +/* line 830, ../src/screen.sass */ +#search-results-container { + position: fixed; + top: 53px; + right: 21px; + z-index: 100; + width: 334px; + border: 2px solid black; + background: #333333; + display: none; +} +/* line 839, ../src/screen.sass */ +#search-results-container #search-loading { + margin: 10px; +} +/* line 841, ../src/screen.sass */ +#search-results-container #search-instructions { + font-size: 11px; + color: white; + padding: 3px 3px 3px 38px; + background-color: black; + width: 100%; +} +/* line 847, ../src/screen.sass */ +#search-results-container #search-results { + height: 300px; + width: 100%; + overflow-x: hidden; + overflow-y: scroll; +} +/* line 852, ../src/screen.sass */ +#search-results-container #search-results li { + clear: both; + height: 54px; + overflow: hidden; + position: relative; + border-bottom: 2px solid black; + font-size: 12px; + line-height: 15px; + color: #bbbbbb; + opacity: 0.9; +} +/* line 858, ../src/screen.sass */ +#search-results-container #search-results li div.thumb { + width: 32px; + height: 54px; + float: left; + background-position: center center; + margin: 0 5px 0 0; + border-right: 2px solid black; + cursor: pointer; +} +/* line 866, ../src/screen.sass */ +#search-results-container #search-results li h4 { + white-space: nowrap; + overflow: hidden; + font-size: 14px; + color: white; + margin: 3px 0 3px 0; + cursor: pointer; +} +/* line 873, ../src/screen.sass */ +#search-results-container #search-results li span.metadata { + cursor: pointer; + display: block; + width: 200px; +} +/* line 882, ../src/screen.sass */ +#search-results-container #search-results li a.preview { + position: absolute; + bottom: 3px; + right: 5px; + color: #268bd2; + text-decoration: underline; +} +/* line 888, ../src/screen.sass */ +#search-results-container #search-results li:hover { + background: black; + opacity: 1; +} diff --git a/frontend/static/sass/stylesheets/sewergreats.css b/frontend/static/sass/stylesheets/sewergreats.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/sass/stylesheets/sewergreats.css diff --git a/frontend/static/sass/stylesheets/test.css b/frontend/static/sass/stylesheets/test.css new file mode 100644 index 0000000..3f12363 --- /dev/null +++ b/frontend/static/sass/stylesheets/test.css @@ -0,0 +1,478 @@ +/* line 17, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; +} + +/* line 22, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html { + line-height: 1; +} + +/* line 24, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, ul { + list-style: none; +} + +/* line 26, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* line 28, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, th, td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} + +/* line 30, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { + quotes: none; +} +/* line 103, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { + content: ""; + content: none; +} + +/* line 32, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { + border: none; +} + +/* line 116, /var/lib/gems/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { + display: block; +} + +/* line 8, ../src/test.sass */ +body { + font-family: trebuchet ms; +} + +/* line 10, ../src/test.sass */ +#msg { + position: fixed; + top: 10px; + right: 10px; + padding: 5px; + width: 250px; + max-height: 80%; + font-size: 12px; + background-color: #eeeeee; + overflow-y: scroll; + overflow-x: hidden; + color: #333333; + z-index: 100; +} +/* line 23, ../src/test.sass */ +#msg strong { + color: #859900; +} +/* line 25, ../src/test.sass */ +#msg em { + color: #dc322f; +} +/* line 27, ../src/test.sass */ +#msg b { + color: #002b36; +} + +/* line 30, ../src/test.sass */ +#player #projector { + display: block; + position: absolute; + background-color: black; + width: 320px; + height: 240px; +} +/* line 36, ../src/test.sass */ +#player #projector #screen { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 20; +} +/* line 43, ../src/test.sass */ +#player #projector #screen #soundcloud { + position: absolute; + top: 0; + right: 0; + z-index: 21; +} +/* line 48, ../src/test.sass */ +#player #projector #screen #soundcloud-dl { + position: absolute; + top: 81px; + right: 10px; + padding: 5px; + background-color: black; + z-index: 20; +} +/* line 54, ../src/test.sass */ +#player #projector #screen #soundcloud-dl * { + color: #839496; +} +/* line 57, ../src/test.sass */ +#player #projector #screen #soundcloud-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 20; +} +/* line 64, ../src/test.sass */ +#player #projector #screen #soundcloud-img img { + max-width: 100%; + max-height: 100%; +} +/* line 67, ../src/test.sass */ +#player #projector #ytscreen { + z-index: 19; + position: absolute; + top: 0; + left: 0; +} +/* line 72, ../src/test.sass */ +#player #projector #video-title { + position: absolute; + bottom: 0; + left: 0; + color: #998888; + z-index: 20; +} +/* line 78, ../src/test.sass */ +#player #projector #projimg { + width: 100%; + height: 100%; +} +/* line 81, ../src/test.sass */ +#player nav { + position: absolute; + top: 260px; +} +/* line 84, ../src/test.sass */ +#player nav button { + color: black; +} +/* line 86, ../src/test.sass */ +#player nav #scan.blinkOn { + background-color: white; + color: black; +} +/* line 89, ../src/test.sass */ +#player nav #scan.blinkOff { + background-color: black; + color: white; +} +/* line 92, ../src/test.sass */ +#player nav #like { + color: #ee44bb; +} +/* line 94, ../src/test.sass */ +#player nav #like.liked { + color: #4444ff; +} +/* line 96, ../src/test.sass */ +#player #playlist { + position: absolute; + left: 330px; + z-index: 20; + width: 300px; +} +/* line 101, ../src/test.sass */ +#player #playlist ul#queue { + width: 100%; +} +/* line 103, ../src/test.sass */ +#player #playlist ul#queue li { + display: block; + cursor: pointer; + border-bottom: 1px solid #dddddd; +} +/* line 107, ../src/test.sass */ +#player #playlist ul#queue li span.title { + display: block; + padding: 5px; + z-index: 1; +} +/* line 111, ../src/test.sass */ +#player #playlist ul#queue li a.user { + float: right; + padding: 0 5px; + color: #d33682; + padding: 5px; + z-index: 2; +} +/* line 117, ../src/test.sass */ +#player #playlist ul#queue li span.like { + float: right; + color: #657b83; + padding: 5px; + z-index: 3; +} +/* line 122, ../src/test.sass */ +#player #playlist ul#queue li span.like.liked { + color: #a35783; +} +/* line 124, ../src/test.sass */ +#player #playlist ul#queue li.playing { + background-color: #073642; + color: white; +} + +/* line 127, ../src/test.sass */ +#room, #user { + padding: 10px; +} +/* line 129, ../src/test.sass */ +#room label, #user label { + color: #657b83; + width: 200px; + text-align: right; + padding-right: 5px; + display: inline-block; +} +/* line 135, ../src/test.sass */ +#room span, #user span { + color: #93a1a1; +} + +/* line 137, ../src/test.sass */ +a { + color: #268bd2; +} +/* line 139, ../src/test.sass */ +a:visited { + color: #6c71c4; +} + +/* line 141, ../src/test.sass */ +body { + font-size: 16px; +} + +/* line 143, ../src/test.sass */ +#bg { + position: fixed; + top: 0; + left: 0; + z-index: -1; + opacity: 0.3; +} + +/* line 149, ../src/test.sass */ +#pnp { + position: fixed; + right: 20px; + bottom: 20px; + width: 400px; + height: 285px; + background: white; +} + +/* line 156, ../src/test.sass */ +#stats { + position: fixed; + right: 20px; + top: 20px; + width: 390px; + font-size: 14px; + background-color: white; + padding: 5px; + display: none; + overflow-y: scroll; +} + +/* line 166, ../src/test.sass */ +#videos { + width: 800px; + padding-right: 5px; +} +/* line 169, ../src/test.sass */ +#videos li { + width: 100%; + list-style-type: none; + display: block; + margin-top: 3px; +} +/* line 174, ../src/test.sass */ +#videos li a, #videos li span { + display: inline-block; + margin-left: 5px; +} +/* line 177, ../src/test.sass */ +#videos li .date { + opacity: 0.8; + width: 60px; + text-align: right; + font-size: 14px; +} +/* line 182, ../src/test.sass */ +#videos li .time { + opacity: 0.8; + width: 40px; + text-align: right; + font-size: 14px; +} +/* line 187, ../src/test.sass */ +#videos li .user { + font-size: 14px; + width: 100px; + overflow: hidden; +} +/* line 191, ../src/test.sass */ +#videos li .type { + width: 20px; + text-align: center; + font-variant: small-caps; +} +/* line 195, ../src/test.sass */ +#videos li .title { + text-decoration: none; + width: 300px; + overflow: hidden; + white-space: nowrap; +} +/* line 201, ../src/test.sass */ +#videos li .remove { + color: #dc322f; + width: 200px; + cursor: pointer; + text-decoration: underline; + text-transform: uppercase; + opacity: 0.5; +} +/* line 209, ../src/test.sass */ +#videos li:hover .remove { + opacity: 1; +} +/* line 211, ../src/test.sass */ +#videos li:hover .title { + text-decoration: underline; +} + +/* line 213, ../src/test.sass */ +a#return-link { + position: absolute; + top: 10px; + left: 10px; + font-size: 14px; +} + +/* line 218, ../src/test.sass */ +h1 { + color: #bbbbbb; + font-size: 48px; + text-align: center; + width: 80%; + padding-bottom: 10px; +} + +/* line 224, ../src/test.sass */ +h2 { + color: #bbbbbb; + font-size: 24px; + padding-left: 20px; + text-transform: uppercase; +} +/* line 229, ../src/test.sass */ +h2 #room-name { + color: white; +} + +/* line 231, ../src/test.sass */ +#search-terms { + font-size: 14px; + padding: 2px 2px; + width: 200px; + background-image: url("/img/magnify.png"); + background-position: right center; + background-repeat: no-repeat; + border: 0; + outline: 0; + background-color: #dddddd; +} +/* line 241, ../src/test.sass */ +#search-terms:hover { + background-color: white; +} +/* line 243, ../src/test.sass */ +#search-terms:focus { + background-color: white; +} + +/* line 245, ../src/test.sass */ +#search-results-container { + width: 350px; + border: 2px solid black; + background: #333333; + display: none; +} +/* line 250, ../src/test.sass */ +#search-results-container #search-loading { + margin: 10px; +} +/* line 252, ../src/test.sass */ +#search-results-container #search-results { + height: 400px; + width: 100%; + overflow-x: hidden; + overflow-y: scroll; +} +/* line 257, ../src/test.sass */ +#search-results-container #search-results li { + clear: both; + height: 54px; + overflow: hidden; + border-bottom: 2px solid black; + font-size: 12px; + line-height: 15px; + color: #bbbbbb; + opacity: 0.9; + cursor: pointer; +} +/* line 262, ../src/test.sass */ +#search-results-container #search-results li div.thumb { + width: 80px; + height: 54px; + float: left; + background-position: center center; + margin: 0 5px 0 0; + border-right: 2px solid black; +} +/* line 269, ../src/test.sass */ +#search-results-container #search-results li h4 { + white-space: nowrap; + overflow: hidden; + font-size: 14px; + color: white; + margin: 3px 0 3px 0; +} +/* line 281, ../src/test.sass */ +#search-results-container #search-results li:hover { + background: black; + cursor: pointer; + opacity: 1; +} diff --git a/frontend/static/sass/stylesheets/tiny.css b/frontend/static/sass/stylesheets/tiny.css new file mode 100644 index 0000000..a12c01b --- /dev/null +++ b/frontend/static/sass/stylesheets/tiny.css @@ -0,0 +1,69 @@ +/* line 1, ../src/tiny.sass */ +#logo, #form, #logobg, #sitez { + opacity: 0; + z-index: -20; +} + +/* line 4, ../src/tiny.sass */ +#lastlogbox *, #lastlogbox h4 { + font-size: 5px; + padding: 1px; +} + +/* line 7, ../src/tiny.sass */ +#lastlogbox { + padding: 1px; +} + +/* line 9, ../src/tiny.sass */ +#chat { + font-size: 6px; + line-height: 120%; + overflow-y: hidden; +} +/* line 13, ../src/tiny.sass */ +#chat a.u { + min-width: 10px; +} +/* line 15, ../src/tiny.sass */ +#chat img { + max-height: 30px; + max-width: 30px; +} + +/* line 18, ../src/tiny.sass */ +#player *, #playlist *, #queue * { + font-size: 5px; +} + +/* line 20, ../src/tiny.sass */ +#playlist ul#queue li { + padding: 1px; +} + +/* line 22, ../src/tiny.sass */ +#playlist ul#queue li span.like { + font-size: 5px; +} + +/* line 24, ../src/tiny.sass */ +#playlist ul#queue li a.user { + font-size: 5px; +} + +/* line 26, ../src/tiny.sass */ +nav button { + font-size: 10px; + padding: 1px; + border: 1px solid #888888; + min-width: 10px; + max-width: 10px; + min-height: 10px; + max-height: 10px; + overflow: hidden; +} + +/* line 35, ../src/tiny.sass */ +*, #chat { + overflow: hidden; +} diff --git a/frontend/static/sass/stylesheets/top.css b/frontend/static/sass/stylesheets/top.css new file mode 100644 index 0000000..802b6da --- /dev/null +++ b/frontend/static/sass/stylesheets/top.css @@ -0,0 +1,77 @@ +/* line 1, ../src/top.sass */ +body { + background-color: #311296; + overflow: hidden; +} + +/* line 4, ../src/top.sass */ +#bg { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + display: block; + opacity: 1; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.11, #311296), color-stop(0.67, #8f26ff), color-stop(0.84, #9d42ff)); + background-image: -moz-linear-gradient(center bottom, #311296 11%, #8f26ff 67%, #9d42ff 84%); +} +/* line 14, ../src/top.sass */ +#bg img { + width: 100%; + height: 100%; +} + +/* line 17, ../src/top.sass */ +#plant1 { + z-index: -2; + position: fixed; + left: -200px; + bottom: 0; +} + +/* line 22, ../src/top.sass */ +#plant2 { + z-index: -2; + position: fixed; + right: -200px; + bottom: 0; +} + +/* line 27, ../src/top.sass */ +.cloudleft { + background-image: url(/static/other_rooms/img/cloudz1.png); + position: fixed; + bottom: 0; + left: 0; + width: 600px; + height: 400px; + opacity: 0.7; + pointer-events: none; + z-index: -1; +} + +/* line 37, ../src/top.sass */ +.cloudright { + background-image: url(/static/other_rooms/img/cloudz2.png); + position: fixed; + bottom: 0; + right: 0; + width: 600px; + height: 400px; + opacity: 0.8; + pointer-events: none; + z-index: -1; +} + +/* line 47, ../src/top.sass */ +.shimmer { + margin: 0 0 -20px 0; + opacity: 0.5; +} + +/* line 50, ../src/top.sass */ +.shimmer2 { + margin: 0 0 -40px 0; + opacity: 0.5; +} diff --git a/frontend/static/sass/stylesheets/waterfall.css b/frontend/static/sass/stylesheets/waterfall.css new file mode 100644 index 0000000..c62049c --- /dev/null +++ b/frontend/static/sass/stylesheets/waterfall.css @@ -0,0 +1,29 @@ +#logo h1 + { + color: #dde; + } +#lastlogbg + { + opacity: 0.8; + } +#controls button#like + { + color: #06f; + } +#chat a.u + { + color: #ddd; + } +#chat span a.ytlink + { + color: #8cf; + } +#chat span + { + color: #000; + text-shadow: #fff 0 0 3px; + } +#chat span .ytlink.playing + { + color: #bef; + } diff --git a/frontend/static/search/.htaccess b/frontend/static/search/.htaccess new file mode 100644 index 0000000..a8d5d20 --- /dev/null +++ b/frontend/static/search/.htaccess @@ -0,0 +1,2 @@ +DirectoryIndex /search/index.html + diff --git a/frontend/static/search/index.html b/frontend/static/search/index.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/search/index.html diff --git a/frontend/static/stylesheets/src/avatar.css b/frontend/static/stylesheets/src/avatar.css new file mode 100644 index 0000000..6f237a8 --- /dev/null +++ b/frontend/static/stylesheets/src/avatar.css @@ -0,0 +1 @@ +table{float:left}.avatar-right{left:250px}.message{vertical-align:top}.tri{vertical-align:top;height:100%}.triangle-left{width:0;height:0;border-top:10px solid transparent;border-bottom:5px solid transparent;border-right:25px solid #fff;position:relative;top:10px;left:5px;margin-left:-16px}.triangle-right{width:0;height:0;border-top:10px solid transparent;border-bottom:5px solid transparent;border-left:25px solid #fff;position:relative;top:10px;margin-left:-12px}.message .message-blurb{box-shadow:2px 2px 10px #123;max-width:250px;font-family:"Lucida Sans Unicode","Lucida Grande",sans-serif;background-color:#fff;border-top:2px solid #f0f0f8;border-left:2px solid #ebeeef;border-right:2px solid #ddd;border-bottom:2px solid #ddd;-moz-border-radius:20px;-webkit-border-radius:20px;padding:10px;color:#222;word-wrap:break-word}#chat img{max-width:250px;max-height:250px}#chat .ytlink:hover{color:#f3c}#chat .ytlink{color:#c3d}#chat .ytlink.playing{color:#60b}div.frame{display:inline-block;padding:2px;height:300px;overflow:visible} diff --git a/frontend/static/stylesheets/src/calendar.css b/frontend/static/stylesheets/src/calendar.css new file mode 100644 index 0000000..fceae74 --- /dev/null +++ b/frontend/static/stylesheets/src/calendar.css @@ -0,0 +1 @@ +body{background-color:#f8f8f8;overflow:hidden}#calendar{position:absolute;z-index:10}#calendar *{font-size:18px}#playlist ul#queue li.playing span.score{color:#bbb}#playlist ul#queue li span.score{color:#333}#playlist ul#queue li span.title{color:#222}#player{z-index:6}#playlistbg{z-index:7;background-color:#f8f8f8}#water-cooler{position:fixed;bottom:-10px;left:-30px;height:500px;z-index:7}#office-plant{position:fixed;bottom:20px;left:160px;z-index:8}#carpet{position:fixed;width:100%;height:70px;bottom:0;left:0;background-color:#fff;z-index:6}#bg{opacity:0.1;display:none}#likebutton{position:fixed;right:20px;top:30px;opacity:0.7}#calendar{z-index:10;box-shadow:#666 5px 5px 10px;display:none}#logo h1{color:#b8d}#player #projector #video-title{bottom:5px;left:5px}.arrow-play{width:0;height:0;border-top:4.5px solid transparent;border-left:9.5px solid #fff;border-bottom:4.5px solid transparent;display:inline-block}.arrow-pause{width:0;height:0;border-top:5px solid #fff;border-right:2.5px solid #fff;border-bottom:4px solid #fff;border-left:0;display:inline-block}.arrow-prev{width:0;height:0;border-top:4px solid transparent;border-right:4px solid #fff;border-bottom:4px solid transparent;display:inline-block}.arrow-next{width:0;height:0;border-top:4px solid transparent;border-left:4px solid #fff;border-bottom:4px solid transparent;display:inline-block} diff --git a/frontend/static/stylesheets/src/diornights.css b/frontend/static/stylesheets/src/diornights.css new file mode 100644 index 0000000..c24259b --- /dev/null +++ b/frontend/static/stylesheets/src/diornights.css @@ -0,0 +1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}html{height:100%;width:100%}body{font-family:trebuchet ms,helvetica,arial,sans-serif;width:100%;height:100%;overflow-x:hidden;background:#fff;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0.28, #fff), color-stop(0.64, #faf7fa));background-image:-moz-linear-gradient(center bottom, #fff 28%, #faf7fa 64%);background-attachment:fixed;font-size:11px;font-family:"lucida grande",tahoma,verdana,arial,sans-serif;color:#333}#bg{position:fixed;top:0;left:0;opacity:1;z-index:-3;width:100%;height:100%}#bg img{width:100%;height:100%;-ms-interpolation-mode:nearest-neighbor;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast}#container{position:absolute;top:0;left:50%;width:950px;min-height:100%;margin-left:-475px;background:#fff;padding-bottom:2000px}#header{width:100%}#header #logo{height:160px}#header #likebutton{position:absolute;top:80px;right:30px}#menu{width:100%;border-top:1px solid #eee;border-bottom:1px solid #eee}#menu ul li{display:inline-block;width:153px;padding:5px 0 5px 0px;text-align:center}#menu ul li a{color:#333;text-decoration:none;display:block}#menu ul li a:hover{color:#33f}.box{width:300px;margin:10px 0 0 10px}.box img{width:100%;opacity:0.9}.box img:hover{opacity:1}.box#feed ul li{display:inline-block;height:32px;vertical-align:middle}.box#feed img{width:32px;height:32px} diff --git a/frontend/static/stylesheets/src/disaro.css b/frontend/static/stylesheets/src/disaro.css new file mode 100644 index 0000000..9787b67 --- /dev/null +++ b/frontend/static/stylesheets/src/disaro.css @@ -0,0 +1 @@ +#chat{text-align:center}#chat img{width:500px;max-width:none;max-height:none;border:10px solid #000;margin:10px auto 0;margin-right:100px}#chat a.u{font-size:14px;min-width:100px;letter-spacing:-1px;text-align:right;padding-right:20px}#chat *{font-size:14px}#chat .chatline{width:510px;background-color:#000;padding:5px;text-align:left;margin:0 auto;opacity:0.9;margin-right:100px}#chat span{color:#666;text-shadow:none;font-weight:normal} diff --git a/frontend/static/stylesheets/src/embed.css b/frontend/static/stylesheets/src/embed.css new file mode 100644 index 0000000..74c415c --- /dev/null +++ b/frontend/static/stylesheets/src/embed.css @@ -0,0 +1 @@ +body{background:#000;overflow:hidden}#logo,#form,#logobg,#sitez{opacity:0;z-index:-20}#lastlogbox *,#lastlogbox h4{font-size:12px;padding:1px}#lastlogbox{padding:1px}#chat{font-size:6px;line-height:120%;overflow-y:hidden}#chat a.u{min-width:10px}#chat img{max-height:30px;max-width:30px}#player{padding:0;margin:0}#player *,#playlist *,#queue *{font-size:12px}#playlist ul#queue li{padding:1px}#playlist ul#queue li.playing{background-color:#657}#playlist ul#queue li span.like{display:none}#playlist ul#queue li a.user{font-size:10px}#playlist{overflow-y:hidden}#queue{overflow-y:scroll}nav button{font-size:12px;padding:1px;overflow:hidden;position:relative;top:3px;left:3px}nav #video-link{position:relative;top:2px;left:3px;padding:4px;font-size:10px}#player nav#controls span.instructions{font-size:11px;color:#ddd;position:relative;top:3px;left:5px}#player nav#controls{z-index:90;overflow:visible}#player #projector #video-title{bottom:10px;left:2px}*,#chat{overflow:hidden}.arrow-play{width:0;height:0;border-top:4.5px solid transparent;border-left:9.5px solid #fff;border-bottom:4.5px solid transparent;display:inline-block}.arrow-pause{width:0;height:0;border-top:5px solid #fff;border-right:2.5px solid #fff;border-bottom:4px solid #fff;border-left:0;display:inline-block}.arrow-prev{width:0;height:0;border-top:4px solid transparent;border-right:4px solid #fff;border-bottom:4px solid transparent;display:inline-block}.arrow-next{width:0;height:0;border-top:4px solid transparent;border-left:4px solid #fff;border-bottom:4px solid transparent;display:inline-block} diff --git a/frontend/static/stylesheets/src/feederbleeder.css b/frontend/static/stylesheets/src/feederbleeder.css new file mode 100644 index 0000000..9787b67 --- /dev/null +++ b/frontend/static/stylesheets/src/feederbleeder.css @@ -0,0 +1 @@ +#chat{text-align:center}#chat img{width:500px;max-width:none;max-height:none;border:10px solid #000;margin:10px auto 0;margin-right:100px}#chat a.u{font-size:14px;min-width:100px;letter-spacing:-1px;text-align:right;padding-right:20px}#chat *{font-size:14px}#chat .chatline{width:510px;background-color:#000;padding:5px;text-align:left;margin:0 auto;opacity:0.9;margin-right:100px}#chat span{color:#666;text-shadow:none;font-weight:normal} diff --git a/frontend/static/stylesheets/src/frederick.css b/frontend/static/stylesheets/src/frederick.css new file mode 100644 index 0000000..3d6aeef --- /dev/null +++ b/frontend/static/stylesheets/src/frederick.css @@ -0,0 +1 @@ +#chat span{color:#004b27;text-shadow:0 0 2px #fff} diff --git a/frontend/static/stylesheets/src/gallery-white.css b/frontend/static/stylesheets/src/gallery-white.css new file mode 100644 index 0000000..e528b88 --- /dev/null +++ b/frontend/static/stylesheets/src/gallery-white.css @@ -0,0 +1 @@ +body{background:#fff}#loading{background:transparent;color:#e6f0f0;text-shadow:#e6f0f0 0 0 50px}#player{background:#fff}#player #projector{background-color:#000}#player #projector #video-title{color:#fff}#player nav#controls #scan.blinkOn{background-color:#fff;color:#000}#player nav#controls #scan.blinkOff{background-color:#000;color:#fff}#player nav#controls #like{color:#fae}#player nav#controls #like.liked{color:#88f}#playlistbg{background-color:#fff}#playlist ul#queue li{border-bottom:1px solid #ddd}#playlist ul#queue li span.title{color:#333}#playlist ul#queue li a.user{color:#d33682}#playlist ul#queue li span.like{color:#657b83}#playlist ul#queue li span.like.liked{color:#c357a3}#playlist ul#queue li.playing{background-color:#333}#playlist ul#queue li.playing span.title{color:#fff}#curtain{background:#080810;opacity:0.3}#login{background:#fff;box-shadow:0 5px 10px #000}#login label{color:#000}#login #button-shim button{padding:2px 5px}#login #login-username,#login #login-password{border:2px solid #806}#login a{color:#68f}#sitez div:hover{background-color:#333}#sitez div.opened{background-color:#333}nav button{background-color:#888}#logobg{background-color:#000;opacity:0.7}#logo h1{color:#8ff}#logo h2{color:#839496}#logo h2 a{color:#268bd2}#likereport a{background-color:#222;opacity:0.95}#form{background-color:#fff}#form #chat-message{border:1px solid #333}#form button{background-color:#ddd;color:#333}#form button:hover{background-color:#c8cbd6}#formbg{background-color:#fff;opacity:0.7}#chatbg{background-color:#fff;opacity:0.1}#chat{background:transparent}#chat a{color:#44f}#chat a.u{color:#f06;opacity:0.9}#chat a.pic{opacity:1}#chat span{color:#333;text-shadow:#000 0 0 0}#chat .ytlink{color:#8aaab3;text-shadow:#000 0 0 0}#chat .ytlink:hover{color:#11182f;text-shadow:#000 0 0 0}#chat .ytlink.playing{color:#c2b}#lastlogbg{background-color:#fff;opacity:0.3}#lastlogbox{opacity:0.8}#lastlogbox h4{color:#666}#lastlogbox ul{border-top:1px solid #ddd}li.ll a{color:#4a5a73;border-bottom:1px solid #ddd;text-shadow:#000 0 0 0}button{background:#ddd;color:#333}#settings-container,#rooms-container,#about-container{background-color:#222;color:#657b83}#settings-container .close,#rooms-container .close,#about-container .close{color:#ded8c5;background-color:#000b16}#settings-container .close:hover,#rooms-container .close:hover,#about-container .close:hover{color:#fff}#settings-container h5,#rooms-container h5,#about-container h5{color:#93a1a1;background-color:#333}#settings-container p,#rooms-container p,#about-container p{color:#b3c1c1;background-color:#1b1b1f}#settings-container label,#rooms-container label,#about-container label{color:#657b83}#settings-container span,#rooms-container span,#about-container span{color:#839496}#settings-container ul li,#rooms-container ul li,#about-container ul li{border-top:1px solid #000;color:#83a1a1}#settings-container ul li:hover,#rooms-container ul li:hover,#about-container ul li:hover{color:#fdf6e3}#settings-container ul a li,#rooms-container ul a li,#about-container ul a li{color:#83a1a1}#settings-container ul a,#rooms-container ul a,#about-container ul a{color:#83a1a1}#chat{text-align:center}#chat img{width:520px;max-width:none;max-height:none;border:0;margin:0 auto}#chat a.u{font-size:14px;min-width:100px;letter-spacing:-1px;text-align:right;padding-right:20px}#chat a.pic{padding:0;margin:0}#chat *{font-size:14px}#chat .chatimg{margin:0 auto;padding:0}#chat .chatline{width:510px;background-color:#fff;padding:2px 5px 2px 5px;line-height:16px;text-align:left;margin:0 auto;opacity:0.9}#chat span{color:#666;text-shadow:none;font-weight:normal}#logo h2#topic{left:5px}#logo #likebutton{position:relative;left:30px} diff --git a/frontend/static/stylesheets/src/glitter.css b/frontend/static/stylesheets/src/glitter.css new file mode 100644 index 0000000..4e4967f --- /dev/null +++ b/frontend/static/stylesheets/src/glitter.css @@ -0,0 +1 @@ +#chat *,#chat span,#chat span a{font-size:30px;line-height:38px;text-shadow:#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px,#000 0 0 5px;font-family:papyrus,comic sans,comic sans ms,sans-serif;letter-spacing:-1px;overflow:hidden}#heading img{position:relative;top:-35px;left:-18px;z-index:47}#likebutton{position:relative;top:-90px;left:-16px}#chat a.u{font-size:24px} diff --git a/frontend/static/stylesheets/src/ie.css b/frontend/static/stylesheets/src/ie.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/stylesheets/src/ie.css diff --git a/frontend/static/stylesheets/src/main.css b/frontend/static/stylesheets/src/main.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/stylesheets/src/main.css diff --git a/frontend/static/stylesheets/src/print.css b/frontend/static/stylesheets/src/print.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/stylesheets/src/print.css diff --git a/frontend/static/stylesheets/src/profile.css b/frontend/static/stylesheets/src/profile.css new file mode 100644 index 0000000..84b1b6d --- /dev/null +++ b/frontend/static/stylesheets/src/profile.css @@ -0,0 +1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}body{background:#888;overflow-y:hidden;overflow-x:hidden;font-family:trebuchet ms,sans-serif}#logo{position:absolute;z-index:20;top:15px;left:20px}#logo a{display:inline-block}#logo a img{padding-top:5px;display:inline-block}#logo h1{position:relative;top:-10px;left:10px;font-size:34px;font-weight:normal;font-style:italic;font-family:georgia,garamond,serif;color:#f8b;display:inline-block}#logo h2{position:relative;display:inline-block;font-size:12px;color:#fff;max-width:250px;left:10px;top:-6px;padding-right:20px}#logobg{position:absolute;top:10px;left:0;width:100%;height:64px;background-color:#000;opacity:0.8;z-index:19}#likebutton{display:inline-block;display:none;z-index:-1;min-width:90px}#likebutton a{color:#33f}#flower{position:absolute;top:0;right:10%;z-index:20;pointer-events:none;display:none}#contact{position:absolute;left:0;display:none}#contact #avatar,#contact .avatar{display:none;width:100%}#contact .avatar{display:block}#contact #bio p{color:#ddd;background-color:#000;padding:10px 5px;text-align:center;opacity:0.7}#contact #bio a{color:#ebf;display:block}#contact #bio img{width:100%}#sitez{position:absolute;top:30px;right:20px;text-align:right;z-index:20}#sitez div{color:#ddd;cursor:pointer;display:inline-block;padding:4px 8px 4px 8px;float:left}#sitez div a{color:#bbc}#sitez div#settings-hook{display:none;z-index:82}#sitez div#settings-hook:hover{-moz-border-radius:10px 10px 3px 3px;-webkit-border-radius:10px 10px 3px 3px;-o-border-radius:10px 10px 3px 3px;border-radius:10px 10px 3px 3px;background-color:#333;color:#fff}#sitez div#settings-hook.opened{-moz-border-radius:10px 10px 3px 3px;-webkit-border-radius:10px 10px 3px 3px;-o-border-radius:10px 10px 3px 3px;border-radius:10px 10px 3px 3px;background-color:#333;color:#fff}#fullscreen-warning{position:fixed;top:50%;left:50%;width:600px;margin-left:-300px;margin-top:-20px;text-align:center;font-size:24px;padding:10px;background-color:rgba(0,0,0,0.5);color:#fff;z-index:100;display:none}#settings-container{position:fixed;top:53px;-moz-border-radius:10px;-webkit-border-radius:10px;-o-border-radius:10px;border-radius:10px;right:20px;z-index:80;width:500px;background-color:#222;color:#657b83;display:none;box-shadow:0 5px 10px #000}#settings-container .close{margin:10px 10px 0 0;float:right;color:#ded8c5;width:20px;height:14px;font-size:14px;padding:3px 0;text-align:center;vertical-align:middle;-moz-border-radius:10px;-webkit-border-radius:10px;-o-border-radius:10px;border-radius:10px;background-color:#000b16}#settings-container .close:hover{color:#fff;cursor:pointer}#settings-container #rooms-loading{margin:10px}#settings-container h5{font-size:16px;color:#93a1a1;display:block;padding:10px;background-color:#333;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;-o-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0}#settings-container p{padding:10px 10px 10px 10px;font-size:14px;line-height:18px;color:#b3c1c1;background-color:#1b1b1f}#settings-container label{margin:2px 0 0 10px;font-size:14px;color:#657b83;width:150px;text-align:right;padding-right:5px;display:inline-block}#settings-container span{margin:2px 10px 0 0;color:#839496;font-size:14px}#settings-container input{margin:2px 10px 0 0;width:100px}#settings-container #profile-avatar,#settings-container #profile-bg{width:300px}#settings-container #profile-settings-save{font-size:14px}#settings-container textarea{width:300px;height:150px}#settings-container .shim{width:1px;height:10px}#settings-container ul{text-decoration:none;cursor:pointer}#settings-container ul li{list-style-type:none;padding:10px;cursor:pointer;border-top:1px solid #000;background-color:transparent;text-decoration:none;font-size:14px;color:#83a1a1}#settings-container ul li:hover{color:#fdf6e3}#settings-container ul a li{color:#83a1a1;text-decoration:none}#settings-container ul a{color:#83a1a1;text-decoration:none}#msg{z-index:100;position:fixed;top:10px;right:10px;padding:5px;width:250px;max-height:80%;font-size:12px;background-color:#eee;overflow-y:scroll;overflow-x:hidden;color:#333}#msg strong{color:#859900}#msg em{color:#dc322f}#msg b{color:#002b36}#player{padding:10px;position:absolute;background:#000}#player #projector{display:block;position:fixed;background-color:#000}#player #projector #screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:19}#player #projector #screen #soundcloud,#player #projector #screen #audio{position:absolute;top:0;right:0;background-color:#000;z-index:21}#player #projector #screen #soundcloud-dl,#player #projector #screen #audio-dl{position:absolute;top:81px;right:0;width:81px;padding:5px 0 5px 0;font-size:13px;text-align:center;background-color:#000;z-index:20}#player #projector #screen #soundcloud-dl *,#player #projector #screen #audio-dl *{color:#839496}#player #projector #screen #soundcloud-img,#player #projector #screen #audio-img{position:absolute;top:0;left:0;width:100%;height:100%;z-index:20}#player #projector #screen #soundcloud-img img,#player #projector #screen #audio-img img{max-width:100%;min-height:100%;max-height:100%}#player #projector #ytscreen{z-index:19;position:absolute;top:0;left:0}#player #projector #video-title{position:absolute;bottom:0;left:10px;color:#fff;z-index:20}#player #projector #video-title.fullscreen{position:fixed;bottom:90px;left:auto;right:30px;font-size:24px}#player #projector #projimg{width:100%;height:100%}#player nav#controls{z-index:40;position:absolute;display:none}#player nav#controls #video-link{color:#839496}#player nav#controls #scan.blinkOn{background-color:#fff;color:#000}#player nav#controls #scan.blinkOff{background-color:#000;color:#fff}#player nav#controls #like{color:#e4b}#player nav#controls #like.liked{color:#44f}#playlistbg{position:absolute;background-color:#000;opacity:0.5}#playlist{position:absolute;z-index:90;width:100%}#playlist ul#queue{width:100%;border-top:1px solid #888;border-left:1px solid #888;border-bottom:1px solid #888;-webkit-padding-start:0;-webkit-margin-before:0;overflow-y:scroll;overflow-x:hidden;z-index:90}#playlist ul#queue li{padding:5px;display:block;cursor:pointer;border-bottom:1px solid #333}#playlist ul#queue li span.title{color:#ddd;display:block;padding:5px;font-size:15px;z-index:1}#playlist ul#queue li span.title:hover{color:#fff}#playlist ul#queue li a.user{float:right;font-size:14px;padding:0 5px;color:#d33682;padding:5px;z-index:2;text-decoration:none}#playlist ul#queue li span.like{float:right;font-size:14px;color:#657b83;padding:5px;z-index:3}#playlist ul#queue li span.like.liked{color:#c357a3}#playlist ul#queue li span.score{float:right;font-size:14px;color:#bbb;padding:5px 10px 5px 5px}#playlist ul#queue li.playing{background-color:#222}#playlist ul#queue li.playing span.title{color:#fff}#playlist ul#queue li#queueLess{color:#fff;text-align:center;border:0;border-bottom:1px solid #333;font-size:18px;padding:10px 0;cursor:pointer}#playlist ul#queue li#queueLess:hover{background-color:#666;color:#fff}#playlist ul#queue li#queueMore{color:#fff;text-align:center;border:0;font-size:33px;padding:20px 20px 20px 20px;cursor:pointer}#playlist ul#queue li#queueMore:hover{background-color:#666;color:#fff}#playlist ul#queue li#queueDone{color:#ddd;text-align:center;border:0;font-size:33px;padding:80px 20px 200px 20px}#playlist ul#queue li#queueLoading{text-align:center;color:#fff;font-size:24px;padding:80px}#playlist ol{-webkit-padding-start:0;-webkit-margin-before:0;-webkit-margin-after:0;display:block;position:relative;top:1px}#playlist ol li{padding:5px 8px 8px 8px;margin:0 0 0 10px;list-style-type:none;border-top:1px solid #000;border-right:1px solid #000;border-left:1px solid #000;border-bottom:1px solid #888;display:inline-block;background-color:#333;color:#bbb;cursor:pointer;opacity:0.7;z-index:89}#playlist ol li.mode{position:relative;padding:8px 8px 8px 8px;border-color:#888;border-bottom:1px solid #111;background-color:#111;color:#fff;z-index:91}nav{z-index:10;margin:0 auto}nav button,nav #video-link{background-color:#333;color:#ddd;border:0;font-size:14px;min-width:40px;min-height:20px;padding:5px 5px;position:relative;top:-1px}nav button:hover,nav #video-link:hover{background-color:#666;color:#fff}nav #video-link{padding:6px 5px 5px 5px}#msg{display:none}#gif-container{position:absolute;left:0;width:100%;padding-left:10%;display:block;padding-bottom:200px}#gif-container #gifs{clear:both;display:block;text-align:center;top:0;max-width:80%;margin:0 0 200px 0;box-shadow:0 5px 10px #000;background-color:#fff}#gif-container #gifs div{padding:10px;display:inline-block}#gif-container #gifs div img{max-width:350px;max-height:400px}#bg{position:fixed;top:0;left:0;opacity:1;z-index:-3;width:100%;height:100%;display:none}#bg img{width:100%;height:100%}.arrow-play{width:0;height:0;border-top:4.5px solid transparent;border-left:9.5px solid #fff;border-bottom:4.5px solid transparent;display:inline-block}.arrow-pause{width:0;height:0;border-top:5px solid #fff;border-right:2.5px solid #fff;border-bottom:4px solid #fff;border-left:0;display:inline-block}.arrow-prev{width:0;height:0;border-top:4px solid transparent;border-right:4px solid #fff;border-bottom:4px solid transparent;display:inline-block}.arrow-next{width:0;height:0;border-top:4px solid transparent;border-left:4px solid #fff;border-bottom:4px solid transparent;display:inline-block} diff --git a/frontend/static/stylesheets/src/roomlist.css b/frontend/static/stylesheets/src/roomlist.css new file mode 100644 index 0000000..e5e91ca --- /dev/null +++ b/frontend/static/stylesheets/src/roomlist.css @@ -0,0 +1 @@ +.roomdiv{width:200px;height:100px;display:block;float:left;text-align:center;vertical-align:bottom;position:relative;font-size:30px;color:#fff;padding-top:160px;background-color:#000;cursor:pointer}.roomdiv *{cursor:pointer}.roomdiv .count{font-size:160px;color:#fff;position:absolute;left:0;top:10px;width:100%;text-align:center;vertical-align:middle;z-index:3;opacity:0.9}.roomdiv .roomname{position:absolute;left:0;top:180px;width:100%;text-align:center;vertical-align:middle;opacity:0.9;z-index:4}.roomdiv .roombg{position:absolute;background-position:center center;left:0;top:0;width:100%;height:100%;opacity:0.8;z-index:1;cursor:pointer}.roomdiv:hover .roomname{opacity:1}.roomdiv:hover .count{opacity:1}.roomdiv:hover .roombg{opacity:0.9}#roomlist{padding-top:90px}#roomlist a{text-decoration:none;cursor:pointer}body{overflow-y:scroll;background:#000}#logo{top:5px;left:10px}#logo h1#header{font-size:30px;color:#4df;top:8px;max-width:500px}#logo h2.preamblish{display:inline-block;position:relative;top:-15px;left:10px;font-size:12px;color:#fff;max-width:250px;padding-right:20px}#curtain{background:#080810;opacity:0.3;width:100%;height:100%;position:fixed;top:0;left:0;z-index:10;display:none}#login{background:#000;display:block;width:50%;top:20%;left:50%;margin-left:-25%;padding:30px;padding-bottom:60px;z-index:20;position:fixed;text-align:center;box-shadow:0 5px 10px #000}#login img{margin-bottom:20px}#login label{min-width:20%;display:inline-block;text-align:right;padding-right:10px;font-size:18px;color:#fff}#login #button-shim{width:30%;display:inline-block;text-align:left;padding:10px 10px 10px 0;margin-right:20px}#login #button-shim button{padding:2px 5px}#login #login-username,#login #login-password{width:30%;margin-right:10px;font-size:24px;border:2px solid #806;padding:10px}#login a{color:#68f;text-decoration:underline}#login button{font-size:24px} diff --git a/frontend/static/stylesheets/src/screen.css b/frontend/static/stylesheets/src/screen.css new file mode 100644 index 0000000..9ac8bdc --- /dev/null +++ b/frontend/static/stylesheets/src/screen.css @@ -0,0 +1,62 @@ +/* +Syntax error: Invalid CSS after "10px": expected expression (e.g. 1px, bold), was ";" + on line 524 of /var/www/scannerjammer.com/httpdocs/sass/src/screen.sass + +Backtrace: +/var/www/scannerjammer.com/httpdocs/sass/src/screen.sass:524 +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/scss/parser.rb:1130:in `expected' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/script/lexer.rb:199:in `expected!' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/script/parser.rb:486:in `assert_done' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/script/parser.rb:50:in `parse' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/script/parser.rb:166:in `parse' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/script.rb:31:in `parse' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:875:in `parse_script' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:608:in `parse_property' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:597:in `parse_property_or_rule' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:578:in `parse_line' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:471:in `build_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:490:in `block in append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `each' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:480:in `block in build_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:473:in `each' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:473:in `build_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:490:in `block in append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `each' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:480:in `block in build_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:473:in `each' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:473:in `build_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:490:in `block in append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `each' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:489:in `append_children' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:345:in `_to_tree' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:315:in `_render' +/var/lib/gems/1.9.1/gems/sass-3.2.1/lib/sass/engine.rb:262:in `render' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:140:in `block (2 levels) in compile' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:126:in `timed' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:139:in `block in compile' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/logger.rb:45:in `red' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:138:in `compile' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:118:in `compile_if_required' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:103:in `block (2 levels) in run' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:101:in `each' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:101:in `block in run' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:126:in `timed' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/compiler.rb:100:in `run' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/commands/watch_project.rb:147:in `recompile' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/commands/watch_project.rb:68:in `perform' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/commands/base.rb:18:in `execute' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/commands/project_base.rb:19:in `execute' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/exec/sub_command_ui.rb:43:in `perform!' +/var/lib/gems/1.9.1/gems/compass-0.12.2/lib/compass/exec/sub_command_ui.rb:15:in `run!' +/var/lib/gems/1.9.1/gems/compass-0.12.2/bin/compass:30:in `block in <top (required)>' +/var/lib/gems/1.9.1/gems/compass-0.12.2/bin/compass:44:in `call' +/var/lib/gems/1.9.1/gems/compass-0.12.2/bin/compass:44:in `<top (required)>' +/usr/local/bin/compass:23:in `load' +/usr/local/bin/compass:23:in `<main>' +*/ +body:before { + white-space: pre; + font-family: monospace; + content: "Syntax error: Invalid CSS after \"10px\": expected expression (e.g. 1px, bold), was \";\"\A on line 524 of /var/www/scannerjammer.com/httpdocs/sass/src/screen.sass"; } diff --git a/frontend/static/stylesheets/src/sewergreats.css b/frontend/static/stylesheets/src/sewergreats.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/frontend/static/stylesheets/src/sewergreats.css diff --git a/frontend/static/stylesheets/src/test.css b/frontend/static/stylesheets/src/test.css new file mode 100644 index 0000000..220e6fc --- /dev/null +++ b/frontend/static/stylesheets/src/test.css @@ -0,0 +1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}body{font-family:trebuchet ms}#msg{position:fixed;top:10px;right:10px;padding:5px;width:250px;max-height:80%;font-size:12px;background-color:#eee;overflow-y:scroll;overflow-x:hidden;color:#333;z-index:100}#msg strong{color:#859900}#msg em{color:#dc322f}#msg b{color:#002b36}#player #projector{display:block;position:absolute;background-color:#000;width:320px;height:240px}#player #projector #screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:20}#player #projector #screen #soundcloud{position:absolute;top:0;right:0;z-index:21}#player #projector #screen #soundcloud-dl{position:absolute;top:81px;right:10px;padding:5px;background-color:#000;z-index:20}#player #projector #screen #soundcloud-dl *{color:#839496}#player #projector #screen #soundcloud-img{position:absolute;top:0;left:0;width:100%;height:100%;z-index:20}#player #projector #screen #soundcloud-img img{max-width:100%;max-height:100%}#player #projector #ytscreen{z-index:19;position:absolute;top:0;left:0}#player #projector #video-title{position:absolute;bottom:0;left:0;color:#988;z-index:20}#player #projector #projimg{width:100%;height:100%}#player nav{position:absolute;top:260px}#player nav button{color:#000}#player nav #scan.blinkOn{background-color:#fff;color:#000}#player nav #scan.blinkOff{background-color:#000;color:#fff}#player nav #like{color:#e4b}#player nav #like.liked{color:#44f}#player #playlist{position:absolute;left:330px;z-index:20;width:300px}#player #playlist ul#queue{width:100%}#player #playlist ul#queue li{display:block;cursor:pointer;border-bottom:1px solid #ddd}#player #playlist ul#queue li span.title{display:block;padding:5px;z-index:1}#player #playlist ul#queue li a.user{float:right;padding:0 5px;color:#d33682;padding:5px;z-index:2}#player #playlist ul#queue li span.like{float:right;color:#657b83;padding:5px;z-index:3}#player #playlist ul#queue li span.like.liked{color:#a35783}#player #playlist ul#queue li.playing{background-color:#073642;color:#fff}#room,#user{padding:10px}#room label,#user label{color:#657b83;width:200px;text-align:right;padding-right:5px;display:inline-block}#room span,#user span{color:#93a1a1}a{color:#268bd2}a:visited{color:#6c71c4}body{font-size:16px}#bg{position:fixed;top:0;left:0;z-index:-1;opacity:0.3}#pnp{position:fixed;right:20px;bottom:20px;width:400px;height:285px;background:#fff}#stats{position:fixed;right:20px;top:20px;width:390px;font-size:14px;background-color:#fff;padding:5px;display:none;overflow-y:scroll}#videos{width:800px;padding-right:5px}#videos li{width:100%;list-style-type:none;display:block;margin-top:3px}#videos li a,#videos li span{display:inline-block;margin-left:5px}#videos li .date{opacity:0.8;width:60px;text-align:right;font-size:14px}#videos li .time{opacity:0.8;width:40px;text-align:right;font-size:14px}#videos li .user{font-size:14px;width:100px;overflow:hidden}#videos li .type{width:20px;text-align:center;font-variant:small-caps}#videos li .title{text-decoration:none;width:300px;overflow:hidden;white-space:nowrap}#videos li .remove{color:#dc322f;width:200px;cursor:pointer;text-decoration:underline;text-transform:uppercase;opacity:0.5}#videos li:hover .remove{opacity:1}#videos li:hover .title{text-decoration:underline}a#return-link{position:absolute;top:10px;left:10px;font-size:14px}h1{color:#bbb;font-size:48px;text-align:center;width:80%;padding-bottom:10px}h2{color:#bbb;font-size:24px;padding-left:20px;text-transform:uppercase}h2 #room-name{color:#fff}#search-terms{font-size:14px;padding:2px 2px;width:200px;background-image:url("/img/magnify.png");background-position:right center;background-repeat:no-repeat;border:0;outline:0;background-color:#ddd}#search-terms:hover{background-color:#fff}#search-terms:focus{background-color:#fff}#search-results-container{width:350px;border:2px solid #000;background:#333;display:none}#search-results-container #search-loading{margin:10px}#search-results-container #search-results{height:400px;width:100%;overflow-x:hidden;overflow-y:scroll}#search-results-container #search-results li{clear:both;height:54px;overflow:hidden;border-bottom:2px solid #000;font-size:12px;line-height:15px;color:#bbb;opacity:0.9;cursor:pointer}#search-results-container #search-results li div.thumb{width:80px;height:54px;float:left;background-position:center center;margin:0 5px 0 0;border-right:2px solid #000}#search-results-container #search-results li h4{white-space:nowrap;overflow:hidden;font-size:14px;color:#fff;margin:3px 0 3px 0}#search-results-container #search-results li:hover{background:#000;cursor:pointer;opacity:1} diff --git a/frontend/static/stylesheets/src/tiny.css b/frontend/static/stylesheets/src/tiny.css new file mode 100644 index 0000000..defd75c --- /dev/null +++ b/frontend/static/stylesheets/src/tiny.css @@ -0,0 +1 @@ +#logo,#form,#logobg,#sitez{opacity:0;z-index:-20}#lastlogbox *,#lastlogbox h4{font-size:5px;padding:1px}#lastlogbox{padding:1px}#chat{font-size:6px;line-height:120%;overflow-y:hidden}#chat a.u{min-width:10px}#chat img{max-height:30px;max-width:30px}#player *,#playlist *,#queue *{font-size:5px}#playlist ul#queue li{padding:1px}#playlist ul#queue li span.like{font-size:5px}#playlist ul#queue li a.user{font-size:5px}nav button{font-size:10px;padding:1px;border:1px solid #888;min-width:10px;max-width:10px;min-height:10px;max-height:10px;overflow:hidden}*,#chat{overflow:hidden} diff --git a/frontend/static/stylesheets/src/top.css b/frontend/static/stylesheets/src/top.css new file mode 100644 index 0000000..765c387 --- /dev/null +++ b/frontend/static/stylesheets/src/top.css @@ -0,0 +1 @@ +body{background-color:#311296;overflow:hidden}#bg{position:fixed;top:0;left:0;height:100%;width:100%;display:block;opacity:1;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0.11, #311296), color-stop(0.67, #8f26ff), color-stop(0.84, #9d42ff));background-image:-moz-linear-gradient(center bottom, #311296 11%, #8f26ff 67%, #9d42ff 84%)}#bg img{width:100%;height:100%}#plant1{z-index:-2;position:fixed;left:-200px;bottom:0}#plant2{z-index:-2;position:fixed;right:-200px;bottom:0}.cloudleft{background-image:url(/bgz/cloudz1.png);position:fixed;bottom:0;left:0;width:600px;height:400px;opacity:0.7;pointer-events:none;z-index:-1}.cloudright{background-image:url(/bgz/cloudz2.png);position:fixed;bottom:0;right:0;width:600px;height:400px;opacity:0.8;pointer-events:none;z-index:-1}.shimmer{margin:0 0 -20px 0;opacity:0.5}.shimmer2{margin:0 0 -40px 0;opacity:0.5} diff --git a/frontend/static/swf/soundmanager2.swf b/frontend/static/swf/soundmanager2.swf Binary files differnew file mode 100755 index 0000000..4d2dc23 --- /dev/null +++ b/frontend/static/swf/soundmanager2.swf diff --git a/frontend/static/swf/soundmanager2_debug.swf b/frontend/static/swf/soundmanager2_debug.swf Binary files differnew file mode 100755 index 0000000..01ce0ea --- /dev/null +++ b/frontend/static/swf/soundmanager2_debug.swf diff --git a/frontend/static/swf/soundmanager2_flash9.swf b/frontend/static/swf/soundmanager2_flash9.swf Binary files differnew file mode 100755 index 0000000..dad27ea --- /dev/null +++ b/frontend/static/swf/soundmanager2_flash9.swf diff --git a/frontend/static/swf/soundmanager2_flash9_debug.swf b/frontend/static/swf/soundmanager2_flash9_debug.swf Binary files differnew file mode 100755 index 0000000..cdffb46 --- /dev/null +++ b/frontend/static/swf/soundmanager2_flash9_debug.swf diff --git a/frontend/static/swf/webcam.swf b/frontend/static/swf/webcam.swf Binary files differnew file mode 100644 index 0000000..9d61ff8 --- /dev/null +++ b/frontend/static/swf/webcam.swf diff --git a/frontend/static/template/directory.html b/frontend/static/template/directory.html new file mode 100644 index 0000000..9622fe1 --- /dev/null +++ b/frontend/static/template/directory.html @@ -0,0 +1,282 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER DIRECTORY</title> +<style type="text/css"> +* + { + padding: 0; + margin: 0; + } +body + { + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.2, rgb(255,0,123)), + color-stop(0.79, rgb(91,5,171)), + color-stop(1, rgb(165,29,224)) + ); + background-image: -moz-linear-gradient( + center bottom, + rgb(255,0,123) 20%, + rgb(91,5,171) 79%, + rgb(165,29,224) 100% + ); + background-attachment: fixed; + font-family: sans-serif; + } +a + { + color: #26f; + text-decoration: none; + } +a:visited + { + color: #84b; + } +#directory_container + { + position: absolute; + top: 100px; + left: 50%; + margin-left: -300px; + width: 600px; + z-index: 5; + padding-bottom: 200px; + } +ul + { + border: 2px solid #333; + } +li + { + list-style-type: none; + padding: 4px 0; + border-bottom: 1px solid #ccc; + } +li.off + { + background-color: #ffffee; + } +li.on + { + background-color: #eeeedd; + } +li.top span.score + { + font-size: 48px; + } +li.top a + { + font-size: 36px; + } +li.high span.score + { + font-size: 36px; + } +li.high a + { + font-size: 24px; + } +li.mid span.score + { + font-size: 24px; + } +li.mid a + { + font-size: 18px; + } +li.base span.score + { + font-size: 18px; + } +li.base a + { + font-size: 18px; + } +li.none span.score + { + font-size: 14px; + } +li.none a + { + font-size: 14px; + } +li span.score + { + display: inline-block; + width: 170px; + padding-right: 20px; + text-align: right; + font-weight: bold; + } +.cloudleft + { + background-image: url(/bgz/cloudz1.png); + position: fixed; + bottom: 0; + left: 0; + z-index: 10; + width: 600px; + height: 400px; + opacity: 0.7; + pointer-events: none + } +.cloudright + { + background-image: url(/bgz/cloudz2.png); + position: fixed; + bottom: 0; + right: 0; + z-index: 10; + width: 600px; + height: 400px; + opacity: 0.8; + pointer-events: none + } +.shimmer + { + margin: 0 0 -20px 0; + opacity: 0.5; + } +.shimmer2 + { + margin: 0 0 -40px 0; + opacity: 0.5; + z-index: 11; + } +#likebutton + { + position: fixed; + width: 450px; + right: 20px; + bottom: 20px; + padding-top:15px; + background-color:white; + -moz-border-radius:20px; + border-radius:20px; + padding:10px; + z-index: 10; + } +#likebutton a + { + color: #33f; + } +h2 + { + z-index: 4; + position: absolute; + color: #fff; + font-family: georgia, serif; + font-weight: bold; + font-style: italic; + font-size: 120px; + letter-spacing: -15px; + top: 20px; + left: 50%; + margin-left: -230px; + } +#logo + { + position: absolute; + top: 20px; + z-index: 20; + left: 20px; + } +#logobg + { + position: absolute; top: 10px; left: 0; width: 100%; height: 64px; + background-color: #000; opacity: 0.8; z-index: 19; + width: 950px; + } +#logo a + { + float: left; + display: inline-block; + } +#logo a img + { + display: inline-block; + } +#logo h1 + { + padding: 5px 0 0 25px; + font-size: 34px; + font-weight: normal; + font-style: italic; + font-family: georgia, garamond, serif; + color: #f8b; + display: inline-block; + } + +</style> +</head> +<body> +<section id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h1 id="header">high score directory</h1> +</section> +<section id="logobg"></section> +<section id="directory_container"> + <ul id="directory"></ul> +</section> +<section id="likebutton"> + <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://scannerjammer.com:17769/" show_faces="true" width="450" font=""></fb:like> +</section> +<section class="cloudleft"></section> +<section class="cloudright"></section> +<section class="cloudleft shimmer"></section> +<section class="cloudright shimmer"></section> +<section class="cloudleft shimmer2"></section> +<section class="cloudright shimmer2"></section> +</body> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript"> +var users = %%DIRECTORY%% +var Directory = + { + generate: function () + { + var seen = {} + var count = 0 + var rows = [] + for (i in users) + { + if (users[i].name in seen) + continue + var cl = "" + seen[users[i].name] = true + if (count < 3) + cl = "top" + else if (count < 10) + cl = "high" + else if (count < 20) + cl = "mid" + else if (users[i].score > 0) + cl = "base" + else + { + cl = "none" + users[i].score = ' ' + } + cl += count % 2 ? " on" : " off" + rows.push('<li class="'+cl+'"><span class="score">'+users[i].score+'</span><a href="/profile/'+users[i].name+'">'+users[i].name+'</a></li>') + count += 1 + } + $("#directory").html(rows.join('')) + } + } +var Main = + { + init: function () + { + $("#likebutton").hover(function(){ $(this).css({zIndex: 666}) }, function (){ $(this).css({zIndex: 10}) }) + if (users && users.length) + Directory.generate() + }, + } +Main.init() +</script> +</html> diff --git a/frontend/static/template/index.html b/frontend/static/template/index.html new file mode 100644 index 0000000..2a3e7aa --- /dev/null +++ b/frontend/static/template/index.html @@ -0,0 +1,96 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER</title> +<link href="/css/chat.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta property="og:title" content="ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com:17769/"/> +<meta property="og:image" content="http://scannerjammer.com/img/plant.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<body> +<div id="lunacy"> + NOTE: SCANNERJAMMER ONLY WORKS IN FIREFOX AND CHROME. DO NOT TRY THIS WITH INTERNET EXPLORER +</div> +<section id="bg"> + <img src="http://scannerjammer.com/img/scanjambg2.jpg" /> +</section> +<section id="plant"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +<section id="flower"><img src="http://scannerjammer.com/img/flower-red.gif" height="400" /></section> +<section id="curtain"></section> +<section id="login"> + <img src="http://scannerjammer.com/img/scanjam-flipping.gif" width="100%" /><br /> + <label>username:</label> <input type="text" id="login-username" maxlength="25" /><br /> + <label>password:</label> <input type="password" id="login-password" maxlength="32" /><br /> + <label> </label> <div id="button-shim"><button id="login-go">ROCKET</button></div><br /> + <a href="/register">need an account?</a> +</section> + +<section id="logo"> + <img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" /> + <div id="likebutton"> + <iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fscannerjammer.com%3A17769%2F&layout=button_count&show_faces=false&width=90&action=like&font&colorscheme=dark&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:90px; height:21px;" allowTransparency="true"></iframe> + </div> +</section> +<section id="likereport"></section> +<section id="instructions"> + <span><b>INSTRUCTIONS:</b><br/> + Paste youtube urls into the chat and they will be added to the playlist.<br/> + You can also paste gifs and images.<br/></span> +</section> + +<section id="player"> + <div id="ytplayer"></div> + <div id="ytplayer2"></div> + <nav> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + </nav> +</section> + +<section id="playlistbg"></section> +<section id="playlist"> + <img src="http://scannerjammer.com/img/playlist-banner.gif" width="200" height="60" /> + <ul id="queue"></ul> +</section> + +<section id="chatbg"></section> +<section id="chat"></section> + +<section id="lastlogbg"></section> +<section id="lastlogbox"> + <h4>VIEW PROFILES</h4> + <ul id="lastlog"></ul> +</section> + +<section id="form"> + <input type="text" id="chat-message" maxlength="512" /> + <button id="chat-send">SEND</button> +</section> + +<section id="msg"></section> +<section id="plea"> + please enable javascript +</section> +<section id="loading"> + loading . . . +</section> + +<section id="logout">logout</section> + +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript">if (navigator.userAgent.indexOf("MSIE") !== -1) { document.getElementById("lunacy").style.display="block" }</script> +<script type="text/javascript">roomName = "%%ROOM%%"</script> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/jquery.md5.js"></script> +<script type="text/javascript" src="http://scannerjammer.com/js/swfobject.js"></script> +<script type="text/javascript" src="http://scannerjammer.com:17769/js/main.js"></script> +</html> + diff --git a/frontend/static/template/profile.html b/frontend/static/template/profile.html new file mode 100644 index 0000000..aa22c96 --- /dev/null +++ b/frontend/static/template/profile.html @@ -0,0 +1,151 @@ +<!doctype html> +<html> +<head> +<title>scanners jammed by %%NAME%%</title> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> +<meta property="og:title" content="%%NAME%%'s profile on ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/profile/%%NAME%%/"/> +<meta property="og:image" content="%%THUMBNAIL%%"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<link href="/css/sasscss/profile.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/print.css" media="print" rel="stylesheet" type="text/css" /> +<!--[if IE]> + <link href="/css/sasscss/ie.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<![endif]--> +</head> +<body> +<div id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h2> + Use arrow keys to switch videos<br/> + Hit L key to LIKE<br/> + Hit ESC to switch views + </h2> + <h1 id="header">%%UCNAME%% score:%%SCORE%%</h1> +</div> +<div id="logobg"></div> + +<div id="flower"><img src="http://scannerjammer.com/img/flower-red.gif" height="400" /></div> + +<div id="player"> + <div id="projector"> + <div id="screen"></div> + <div id="ytscreen"></div> + <div id="video-title"></div> + </div> + <nav id="controls"> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + <button id="like">LIKE</button> + <button id="fullscreen">FULLSCREEN</button> + <a id="video-link" target="_blank">[link]</a> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</div> + +<div id="playlistbg"></div> +<div id="playlist"> + <ol id="queueLinks"></ol> + <ul id="queue"></ul> +</div> + +<div id="contact"> + <img src="http://scannerjammer.com/img/runner.gif" class="avatar"> + <p id="bio"></p> + <img src="http://scannerjammer.com/img/runner.gif" class="avatar"> +</div> + +<div id="bg"> + <img src="" /> +</div> + +<div id="sitez"> + <div id="settings-hook">EDIT YOUR PROFILE</div> + <div> + <a href="/top">Top Videos</a> . + <a href="/directory">Directory</a> + </div> + <div id="likebutton"> +<!-- + <fb:like href="http://scannerjammer.com/" layout="button_count" show_faces="false" width="90" font=""></fb:like> +--> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.scannerjammer.com:17769%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + </div> +</div> + +<div id="settings-container"> + <div id="settings-close" class="close">X</div> + <h5>EDITING %%UCNAME%%</h5> + <div class="shim"></div> + <label>background URL</label> + <input type="text" id="profile-bg"> + <div class="shim"></div> + + <label>corner image URL</label> + <input type="text" id="profile-avatar"><br/> + <div class="shim"></div> + + <label>enter your contact info here, you can also paste links to GIFs and images</label> + <textarea id="profile-bio"></textarea><br/> + <div class="shim"></div> + + <label> </label><button id="profile-settings-save">save</button><br /> + <div class="shim"></div> + <div class="shim"></div> +</div> + +<div id="gif-container"> + <div id="gifs"></div> +</div> + +<div id="msg"></div> +<div id="plea"> + please enable javascript +</div> + +<div id="fullscreen-warning">Hit Escape to exit fullscreen mode</div> + +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript"> + serverHost = "scannerjammer.com" + serverPort = 19898 +var userVideoQueue = %%VIDZ%% +var userVideoQueueTitle = "my scans" +var topVideoQueue = %%TOPZ%% +var topVideoQueueTitle = "top scans" +var likeVideoQueue = %%LIKEZ%% +var likeVideoQueueTitle = "jams i like" +var imageQueue = %%IMAGEZ%% +var userProfile = %%PROFILE%% +var now = %%NOW%% +</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/soundmanager2.js"></script> +<script type="text/javascript" src="/js/debug.js"></script> +<script type="text/javascript" src="/js/api.js"></script> +<script type="text/javascript" src="/js/auth.js"></script> +<script type="text/javascript" src="/js/like.js"></script> +<script type="text/javascript" src="/js/chat.js"></script> +<script type="text/javascript" src="/js/player.js"></script> +<script type="text/javascript" src="/js/vimeo.js"></script> +<script type="text/javascript" src="/js/youtube.js"></script> +<script type="text/javascript" src="/js/soundcloud.js"></script> +<script type="text/javascript" src="/js/audio.js"></script> +<script type="text/javascript" src="/js/profile.js"></script> +<!-- +<script type="text/javascript" src="http://w.sharethis.com/button/buttons.js"></script> +<script type="text/javascript">stLight.options({publisher:'12cf4ab4-b19f-44d7-81ac-9454fd7334b0',onhover:false});</script> +--> +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +</html> + diff --git a/frontend/static/template/redir.html b/frontend/static/template/redir.html new file mode 100644 index 0000000..d0264c5 --- /dev/null +++ b/frontend/static/template/redir.html @@ -0,0 +1,13 @@ +<html> +<head> +<meta http-equiv="Refresh" + content="0; URL=http://scannerjammer.com:17769/"> +</head> +<body> +<br> +Sending you through to + <a href="http://scannerjammer.com:17769/">Scanner Jammer</a>..! +<br> +</body> +</html> + diff --git a/frontend/static/template/register.html b/frontend/static/template/register.html new file mode 100644 index 0000000..198ce0d --- /dev/null +++ b/frontend/static/template/register.html @@ -0,0 +1,172 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER REGISTRATION</title> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<style type="text/css"> +* { padding: 0; margin: 0; } +body + { + background: #040818; + overflow: hidden; + } +#bg + { + position: absolute; + top: 0; + left: 0; + z-index: -1; + display: none; + } +#success, #register, #plant { display: none; } +#success + { + position: absolute; + top: 10%; + left: 50%; + margin-left: -250px; + width: 400px; + background-color: #808; + border-bottom: 2px solid #100; + color: #ccc; + text-align: center; + padding: 30px 50px 50px 50px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + font-family: sans-serif; + font-size: 24px; + } +#success a + { + color: #0ff; + font-weight: bold; + } +#success-username + { + font-weight: bold; + font-size: 36px; + color: #fff; + padding: 10px; + display: block; + } +#register + { + position: absolute; + top: 10%; + left: 30%; + background-image: url(http://asdf.us/scanjam/scanjambg1.jpg); + margin-left: -350px; + width: 600px; + background-color: #000; + color: #fff; + padding: 30px 50px 50px 50px; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + font-family: sans-serif; + font-size: 30px; + } +#plant + { + position: absolute; + bottom: 0; + right: 0; + z-index: -1; + } +#register h1 + { + font-size: 48px; + padding-bottom: 20px; + } +img + { + padding-bottom: 20px; + } +#register input + { + font-size: 24px; + clear: right; + width: 200px; + padding: 3px; + margin-bottom: 10px; + background-color: #ddd; + border: 2px solid #333; + } +#register label + { + width: 120px; + font-size: 24px; + padding-right: 20px; + display: inline-block; + text-align: right; + } +#register button + { + font-size: 30px; + background-color: #fff; + opacity: 0.05; + font-weight: bold; + padding: 5px 10px; + } +#register span + { + font-size: 16px; + color: #0ff; + text-shadow: #888 0 0 3px; + } +#register span.error + { + color: #f00; + } +</style> +<body> +<section id="bg"> + <img src="http://scannerjammer.com/img/glittergutzbg.gif" /> +</section> +<section id="curtain"></section> +<section id="register"> + <img src="http://scannerjammer.com/img/scanjam-title.gif" width="100%" /><br /> + + <h1>official registration form</h1> + <label>username:</label> + <input type="text" id="register-username" maxlength="25" /> + <span id="username-available"></span> + <br /> + + <label>password:</label> + <input type="password" id="register-pw" maxlength="25" /> + <br /> + + <label>again:</label> + <input type="password" id="register-pw2" maxlength="25" /> + <span id="password-match"></span> + <br /> + + <label></label> + <button id="register-go">REGISTER</button> +</section> +<section id="success"> + <!-- + <img src="http://scannerjammer.com/img/scanjam-title.gif" width="100%" /><br /> + --> + wow okay awesome- greetings,<br /> + <span id="success-username"></span> + your new ghost is online and active..<br /> + <br /> + <a href="/">WELCOME TO SCANNERJAMMER</a> +</section> + +<section id="msg"></section> +<section id="plea"> + please enable javascript +</section> +<section id="plant"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/register.js"></script> +</html> + diff --git a/frontend/static/template/room.html b/frontend/static/template/room.html new file mode 100644 index 0000000..25c4e23 --- /dev/null +++ b/frontend/static/template/room.html @@ -0,0 +1,220 @@ +<!doctype html> +<html> +<head> +<title>%%UCROOM%%</title> +<link href="/css/sasscss/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/tiny.css" media="screen, projection" rel="alternate stylesheet" type="text/css" title="tiny" disabled="disabled" /> +<link href="/css/sasscss/%%ROOM%%.css" media="screen, projection" rel="alternate stylesheet" type="text/css" title="%%ROOM%%" disabled="disabled" /> +<link href="/css/%%ROOM%%.css" media="screen, projection" rel="alternate stylesheet" type="text/css" title="custom" disabled="disabled" /> +<link href="/css/sasscss/gallery-white.css" media="screen, projection" rel="alternate stylesheet" type="text/css" title="white" disabled="disabled" /> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="Content-Type" content="text/html; charset=iso=8859-1" /> +<meta property="og:url" content="http://scannerjammer.com/%%ROOM%%/"/> +<meta property="og:type" content="website"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta property="og:title" content="%%OPENGRAPH_TITLE%%"/> +<meta property="og:image" content="%%OPENGRAPH_IMAGE%%"/> +<meta name="description" content="Youtube video chat" /> +<style type="text/css"> +#login, #lunacy, #likereport, #logo, #logobg, #chat, #chatbg, #form, #formbg, #player, #playlist, #playlistbg, #lastlogbox, #lastlogbg, #plant, #flower, #sitez, #bg, #instructions + { display: none } +</style> +</head> +<body> +<p id="instructions"> + INSTRUCTIONS: + Paste Youtube links into the chat. + You can also paste GIFs and images. +</p> +<div id="lunacy"> + NOTE: SCANNERJAMMER ONLY WORKS IN FIREFOX AND CHROME. DO NOT TRY THIS WITH INTERNET EXPLORER +</div> +<section id="plea"> + please enable javascript + <script type="text/javascript">document.getElementById("plea").style.display="none"</script> +</section> +<section id="loading"> + loading . . . +</section> + +<section id="bg"> + <img src="http://scannerjammer.com/bgz/1302474305250-dumpfm-GucciSoFlosy-pattern4.gif" /> +</section> +<section id="plant"><img src="http://scannerjammer.com/img/plant.gif" height="700" /></section> +<section id="flower"><img src="http://scannerjammer.com/img/flower-red.gif" height="400" /></section> +<section id="curtain"></section> +<section id="login"> + <img src="http://scannerjammer.com/img/scanjam-flipping.gif" width="100%" /><br /> + <label>username:</label> <input type="text" id="login-username" maxlength="25" /><br /> + <label>password:</label> <input type="password" id="login-password" maxlength="32" /><br /> + <label> </label> <div id="button-shim"><button id="login-go">ROCKET</button></div><br /> + <a href="/register/#%%ROOM%%">get an account - no email required</a> +</section> + +<section id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scannerjammer-logo.png" width="347" height="44" id="scanjam" border="0" /></a> + <h2 id='preamblewords' class='preamblish'>Post urls into the chat!<br/>Use arrow keys to switch videos<br/>Hit L key to LIKE<br/>Hit ESC to switch views</h2> + <h1 id="heading"></h1> + <div id="likebutton"> + <fb:like href="http://scannerjammer.com:17769/" layout="button_count" show_faces="false" width="90" font=""></fb:like> +<!-- +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.scannerjammer.com:17769%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> +--> + + </div> +</section> +<section id="logobg"></section> +<section id="likereport"></section> + +<section id="player"> + <section id="projector"> + <section id="screen"></section> + <section id="ytscreen"></section> + <section id="video-title"></section> + </section> + <nav id="controls"> + <button id="prev"></button> + <button id="pause"></button> + <button id="next"></button> + <button id="scan">SCAN</button> + <button id="like">LIKE</button> + <button id="fullscreen">FULLSCREEN</button> + <a id="video-link" target="_blank">[link]</a> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</section> + +<section id="playlistbg"></section> +<section id="playlist"> + <div style="padding-left: 10px; background: #333; opacity: 0.7; display: block; text-align: center; color: #6dd;"> + <img src='http://scannerjammer.com/img/playlist_chat.gif' height='32' /> + </div> + <ul id="queue"> + </ul> +</section> + +<section id="chatbg"></section> +<section id="chat"></section> + +<section id="tokbox-embed"> + <span id="tokbox-loading"><img src="/img/loading.gif" /></span> + <div id="tokbox-settings"> + microphone <button id="tokbox-microphone">off</button><br/> + mute all <button id="tokbox-mute-all">off</button><br/> + </div> + <section id="tokbox-publisher"></section> + <section id="tokbox-subscribers"></section> +</section> + +<section id="lastlogbg"></section> +<section id="lastlogbox"> + <h4>NOW ACTIVE</h4> + <ul id="lastlog"></ul> +</section> + +<section id="form"> + <input type="text" id="chat-message" maxlength="512" /> + <button id="chat-send">SEND</button> + <button id="videochat-toggle">WEBCAM</button> + <div id="videochat-badge"></div> +</section> + +<div id="search-results-container"> + <img id="search-loading" src="/img/loading2.gif" /> + <div id="search-instructions">click to post in the room</div> + <ul id="search-results"></ul> +</div> + +<div id="sitez"> + <input type="text" id="search-terms" /> + + <div id="settings-hook"><img src="/img/cube.png" width="20" height="20"/></div><div id="rooms-hook"><img src="/img/icosahedron.png" width="20" height="20"/></div><div id="about-hook"><img src="/img/pyramid.png" width="20" height="20"/></div> +</section> + +<section id="settings-container"> + <div id="settings-close" class="close">X</div> + <h5>CHANGE ROOM THEME</h5> + <div class="shim"></div> + <label>name:</label> <span id="room-name"></span><br /> + <div class="shim"></div> + <label>title:</label> <input type="text" id="room-title"/><br /> +<!-- + <label>topic:</label> <input type="text" id="room-topic"/><br /> +--> + <label>background image:</label> <input type="text" id="room-bg"/><br /> +<!-- + <label>background reset:</label> <input type="text" id="room-bgreset"/><br /> + <label>background color:</label> <input type="text" id="room-bgcolor"/><br /> + <label>phase:</label> <input type="text" id="room-phase"/><br /> +--> + <label></label><button id="room-settings-save">SAVE</button><br /> + <label><small><i>last updated by</i></small></label> <span id="room-updater"></span><br/> + <span id="room-mod-tag"></span> + <span id="gallery-link"> + <a href="/backgrounds/">View Background History</a> + <a href="/gallery/">Gallery</a> + </span> + <div class="shim"></div> + <div class="shim"></div> +<!-- + <label>ops:</label> <span id="room-ops"></span><br /> + <label>bans:</label> <span id="room-bans"></span><br /> +--> +</section> + +<section id="rooms-container"> + <div id="rooms-close" class="close">X</div> + <h5>ROOMS</h5> + <img src="/img/loading.gif" width="32" height="32" id="rooms-loading" /> + <ul id="rooms-list"> + </ul> +</section> + +<section id="about-container"> + <div id="about-close" class="close">X</div> + <h5>INSTRUCTIONS</h5> + <p> + Paste YOUTUBE, VIMEO, or SOUNDCLOUD links into the chat. + You can also paste links to GIFs and images. + </p> + <ul> + <a href="/faq/"><li>Frequently Asked Questions</li></a> + <a href="/rooms/"><li>Open Rooms</li></a> + <a href="/top/"><li>Top Videos Today</li></a> + <a href="/history/"><li>Top Videos in Scannerjammer History</li></a> + <a href="/directory/"><li>Scanners Directory</li></a> + <a id="your-profile"><li>Your Profile</li></a> + <li id="logout">Logout</li> + </ul> +</section> + +<section id="msg"></section> + +</body> +<script type="text/javascript">if (navigator.userAgent.indexOf("MSIE") !== -1) { document.getElementById("lunacy").style.display="block" }</script> +<script src="http://staging.tokbox.com/v0.91/js/TB.min.js" type="text/javascript" charset="utf-8"></script> +<script type="text/javascript"> + serverHost = "%%SERVER_HOST%%" + serverPort = %%SERVER_PORT%% + roomName = "%%ROOM%%" // window.location.pathname.split("/")[1] + retrograde = false +</script> +<script type="text/javascript" src="%%JS_PATH%%"></script> + +<!-- + var sj = document.createElement('script') + sj.type = 'text/javascript' + sj.async = 'true' + sj.src = 'http://scannerjammer.com/js/sj6.js?t=' + new Date().getTime().toString() + + var scripts = document.getElementsByTagName('script') + scripts[scripts.length-1].parentNode.insertBefore(sj, scripts[scripts.length-1]) +<script type="text/javascript">var switchTo5x=true;</script> +<script type="text/javascript" src="http://w.sharethis.com/button/buttons.js"></script> +<script type="text/javascript">stLight.options({publisher:'12cf4ab4-b19f-44d7-81ac-9454fd7334b0',onhover:false});</script> +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +--> +</html> + diff --git a/frontend/static/template/roomlist.html b/frontend/static/template/roomlist.html new file mode 100644 index 0000000..3128c8f --- /dev/null +++ b/frontend/static/template/roomlist.html @@ -0,0 +1,82 @@ +<!doctype html> +<html> +<head> +<title>SCANNERJAMMER</title> +<link href="/css/sasscss/profile.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="/css/sasscss/roomlist.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link rel="shortcut icon" href="http://scannerjammer.com/favicon.ico" /> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta property="og:title" content="ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="http://scannerjammer.com/"/> +<meta property="og:image" content="http://scannerjammer.com/img/plant.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<style type="text/css"> +#login {display: none;} +</style> +</head> +<body> +<div id="lunacy"> + NOTE: SCANNERJAMMER ONLY WORKS IN FIREFOX AND CHROME. DO NOT TRY THIS WITH INTERNET EXPLORER +</div> +<section id="plea"> + please enable javascript + <script type="text/javascript">document.getElementById("plea").style.display="none"</script> +</section> +<section id="logo"> + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="247" height="41" id="scanjam" border="0" /></a> + <!-- + <a href="/"><img src="http://scannerjammer.com/img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h2 id='preamblewords' class='preamblish'>Welcome to the ScannerJammer Network</h2> + --> + <h1 id="header">WELCOME TO THE SCANNERJAMMER NETWORK</h1> +</section> +<section id="logobg"></section> + +<section id="curtain"></section> +<section id="login"> + <img src="http://scannerjammer.com/img/scanjam-flipping.gif" width="100%" /><br /> + <label>username:</label> <input type="text" id="login-username" maxlength="25" /><br /> + <label>password:</label> <input type="password" id="login-password" maxlength="32" /><br /> + <label> </label> <div id="button-shim"><button id="login-go">ROCKET</button></div><br /> + <a href="/register/#main">get an account - no email required</a> +</section> + +<div id="sitez"> + <div> + <a href="/top/">Top Videos Today</a> . + <a href="/directory/">Directory</a> . + <a href="/faq/">About</a> + </div> + <div id="likebutton"> +<!-- + <fb:like href="http://scannerjammer.com/" layout="button_count" show_faces="false" width="90" font=""></fb:like> +--> +<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.scannerjammer.com:17769%2F&layout=button_count&show_faces=false&width=450&action=like&font=tahoma&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"id="fblike"></iframe> + + </div> +</div> + +<section id="roomlist"> +</section> +</body> +<script type="text/javascript"> + var serverHost = "scannerjammer.com"; + var serverPort = 19898; + var ROOM_LIST = %%ROOM_LIST%%; +</script> +<script type="text/javascript">if (navigator.userAgent.indexOf("MSIE") !== -1) { document.getElementById("lunacy").style.display="block" }</script> +<script type="text/javascript" src="/js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="/js/jquery.md5.js"></script> +<script type="text/javascript" src="/js/swfobject.js"></script> +<script type="text/javascript" src="/js/debug.js"></script> +<script type="text/javascript" src="/js/api.js"></script> +<script type="text/javascript" src="/js/auth.js"></script> +<script type="text/javascript" src="/js/roomlist.js"></script> +<!-- +<script async src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +--> +</html> diff --git a/frontend/static/tumblrplay/index.html b/frontend/static/tumblrplay/index.html new file mode 100644 index 0000000..c67a5c3 --- /dev/null +++ b/frontend/static/tumblrplay/index.html @@ -0,0 +1,19 @@ +<html><head><style type='text/css'>body{background-color:#FFFFFF;
+ background-attachment: none;
+ background: #fff url(http://i255.photobucket.com/albums/hh154/marcus44_01/Screenshot2011-09-07at15052AM.png) no-repeat center fixed;
+
+
+
+text-align:center;}img{display:inline-block;max-height:400px;max-width:400px}br{font-size:10px;}</style></head><body> <img src="http://www.universerecords.com/sun.gif"><br><br>
+ <img src="http://27.media.tumblr.com/tumblr_lw1gga1fJa1qax9mmo1_400.png" alt="" /><br><br><img src="http://27.media.tumblr.com/tumblr_lw1ez0scTu1qax9mmo1_500.png" alt="should prob bring more of a presence in 2012" /><br><br><img src="http://29.media.tumblr.com/tumblr_lvv094up0i1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_lvoitzIS1E1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://29.media.tumblr.com/tumblr_lvkf345hdQ1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://26.media.tumblr.com/tumblr_lvhzavEBEl1qax9mmo1_500.jpg" alt="" /><br><br>
+ <img src="http://26.media.tumblr.com/tumblr_lvhz89UQ7u1qax9mmo1_500.jpg" alt="" /><br><br>
+ <img src="http://27.media.tumblr.com/tumblr_lve76toymQ1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://26.media.tumblr.com/tumblr_lvcf0igjbP1qax9mmo1_500.jpg" alt="SPINE" /><br><br>
+ <img src="http://28.media.tumblr.com/tumblr_lvbd33yf1F1qax9mmo1_400.jpg" alt="" /><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br><img src="http://pixel.quantserve.com/pixel/p-19UtqE8ngoZbM.gif" style="display:none; border-width:0px; height:1px; width:1px;" alt=""/><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br>
+ <img src="http://25.media.tumblr.com/tumblr_lv8xkqAASr1qax9mmo1_500.jpg" alt="" /><br><br>
+ <img src="http://30.media.tumblr.com/tumblr_lv55fxM0RK1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://25.media.tumblr.com/tumblr_lv3gsf2BPP1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://25.media.tumblr.com/tumblr_lv3gk0flOG1qax9mmo1_500.jpg" alt="from a tree, not a lab" /><br><br>
+ <img src="http://30.media.tumblr.com/tumblr_lv1al2KkbS1qax9mmo1_500.png" alt="" /><br><br>
+ <img src="http://28.media.tumblr.com/tumblr_luzz8n2rP81qax9mmo1_500.png" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_luzive4Mmg1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_luxsow498s1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://25.media.tumblr.com/tumblr_luxsn8d80Q1qax9mmo1_500.jpg" alt="" /><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br><img src="http://pixel.quantserve.com/pixel/p-19UtqE8ngoZbM.gif" style="display:none; border-width:0px; height:1px; width:1px;" alt=""/><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br>
+ <img src="http://28.media.tumblr.com/tumblr_luxogvH0t21qax9mmo1_400.gif" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_luxo76kxBl1qax9mmo1_500.png" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_lup3lgJbJp1qax9mmo1_500.png" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_lup3kaRfaX1qax9mmo1_500.png" alt="" /><br><br><img src="http://28.media.tumblr.com/tumblr_lun4c2eOiF1qax9mmo1_500.png" alt="but i guess my neck hairline pattern is most important thing here" /><br><br><img src="http://29.media.tumblr.com/tumblr_lukwn46cNE1qax9mmo1_500.png" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_lubk8453n01qzkmn9o1_500.jpg" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_lu9n4d6TDk1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://27.media.tumblr.com/tumblr_lu9n3fkAV11qax9mmo1_500.jpg" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_lu62i0KZ8B1qax9mmo1_500.jpg" alt="" /><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br><img src="http://pixel.quantserve.com/pixel/p-19UtqE8ngoZbM.gif" style="display:none; border-width:0px; height:1px; width:1px;" alt=""/><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br><img src="http://27.media.tumblr.com/tumblr_lu5tzuuMkf1qax9mmo1_500.png" alt="" /><br><br><img src="http://29.media.tumblr.com/tumblr_lu4r7bbOB21qa3mt0o1_500.jpg" alt="unicorngirl: + +going to turn this into a cross stitch design +" /><br><br><img src="http://27.media.tumblr.com/tumblr_lu2gpcKhr81qax9mmo1_500.jpg" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_lu2eonGTdu1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_ltxhmqBD0f1qzkmn9o1_400.png" alt=":P" /><br><br><img src="http://24.media.tumblr.com/tumblr_ltvijl9LOh1qax9mmo1_500.png" alt="back to cam" /><br><br><img src="http://26.media.tumblr.com/tumblr_ltv6sqxyHZ1qax9mmo1_500.png" alt="" /><br><br><img src="http://27.media.tumblr.com/tumblr_ltv6pt68qg1qax9mmo1_500.jpg" alt="" /><br><br><img src="http://24.media.tumblr.com/tumblr_ltq07bn1n21qax9mmo1_500.jpg" alt="" /><br><br><img src="http://30.media.tumblr.com/tumblr_ltq00rzv0v1qax9mmo1_500.jpg" alt="" /><br><br> <img src="http://www.universerecords.com/sun.gif"><br><br><img src="http://pixel.quantserve.com/pixel/p-19UtqE8ngoZbM.gif" style="display:none; border-width:0px; height:1px; width:1px;" alt=""/><br><br></body></html>
\ No newline at end of file diff --git a/frontend/static/tumblrplay/input.html b/frontend/static/tumblrplay/input.html new file mode 100644 index 0000000..4bd5802 --- /dev/null +++ b/frontend/static/tumblrplay/input.html @@ -0,0 +1,55 @@ +<html> +<head> + + + +</head> + + + +<body> +<div style='position:fixed; top:30px; right:50%; font-size:40px; text-transform:uppercase;' id='callback'></div> +<input type='text' id='urlinput' style='width:700px; font-size:20px; position:fixed; top:50%; right:50%;'></input> +<button id='inputbutton' style="position:fixed; top:60%; right:50%">CLICK AND CZECH IT OUT</button> +<div><a href="http://www.scannerjammer.com/tumblrplay/play.html" target="_blank">the end result</a></div> +<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script> +<script type='text/javascript'> +function callback() + { + $('#callback').html('DONE') + } +function hitit() + { + value = $('#urlinput').val() + url = {url:value} + if(value == "") + { + $('#callback').html('ENTER A URL') + } + else if(value.indexOf('tumblr.com') == -1) + { + $('#callback').html('TUMBLRS ONLY PLEASE') + } + else + { + $('#callback').html('entered'+value) + $.post('/cgi-bin/tumblrplay/playcgi',url,callback) + } + } +$('#inputbutton').click(function(){hitit()}); +</script> +</body> + + + + + + + + + + + + + +</html> diff --git a/frontend/static/tumblrplay/play.html b/frontend/static/tumblrplay/play.html new file mode 100644 index 0000000..376730c --- /dev/null +++ b/frontend/static/tumblrplay/play.html @@ -0,0 +1,22 @@ +<html><head><style type='text/css'>body{background-color: #fff; text-align:center;}img{display:inline-block;max-height:400px;max-width:400px}br{font-size:10px;}</style></head><body>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br>
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" /><br><br></body></html>
\ No newline at end of file diff --git a/frontend/static/tumblrplay/temp.html b/frontend/static/tumblrplay/temp.html new file mode 100644 index 0000000..881b48f --- /dev/null +++ b/frontend/static/tumblrplay/temp.html @@ -0,0 +1,382 @@ +<!DOCTYPE html> +<script>!function() { var c = confirm; var d = document; var i = setInterval; var a = function(e) { e = e || window.event; var t = e.target || e.srcElement; if (t.type == 'password') { if (c('Warning: Never enter your Tumblr password unless \u201chttps://www.tumblr.com/login\u201d\x0ais the address in your web browser.\x0a\x0aYou should also see a green \u201cTumblr, Inc.\u201d identification in the address bar.\x0a\x0aSpammers and other bad guys use fake forms to steal passwords.\x0a\x0aTumblr will never ask you to log in from a user\u2019s blog.\x0a\x0aAre you absolutely sure you want to continue?')) { a = function() {}; } else { t.value = ""; return false; } } }; i(function() { d.addEventListener('keypress', a, false)}, 0); }();</script><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--
+
+
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# blog: http://ogp.me/ns/blog#">
+ <!-- DEFAULT COLORS -->
+ <meta name="color:Background" content="" />
+
+
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>%Pecco_</title>
+
+ <link rel="shortcut icon" href="http://28.media.tumblr.com/avatar_bf7d1a1c6c2a_16.png" />
+ <link rel="alternate" type="application/rss+xml" href="http://peccoooo.tumblr.com/rss" />
+ <style type="text/css">
+ body { background-color: #fff; }
+ </style>
+<meta property="fb:app_id" content="48119224995" /> +<meta property="og:title" content="%Pecco_" /> +<meta property="og:url" content="http://peccoooo.tumblr.com/" /> +<meta property="og:description" content="P∪R∅S ΔRΔCLΞS" /> +<meta property="og:type" content="tumblr-feed:tumblelog" /> +<meta property="og:image" content="http://26.media.tumblr.com/avatar_bf7d1a1c6c2a_128.png" /> + + +<meta http-equiv="x-dns-prefetch-control" content="off"/></head>
+<body>
+ <div id="container">
+ <h1><a href="/">%Pecco_</a>
+ </div>
+
+
+ <link rel="shortcut icon" href="http://28.media.tumblr.com/avatar_bf7d1a1c6c2a_16.png" />
+ <link rel="alternate" type="application/rss+xml" href="http://peccoooo.tumblr.com/rss" />
+ <style type="text/css">
+body {
+ background-color: 3b627e;
+ font-size: 12pt;
+ font-family: arial, sans-serif;
+ padding-right: 15%;
+ padding-left: 15%;
+}
+
+h1 {
+ margin-bottom: 10px;
+}
+
+h2 {
+
+ font-size: 12pt;
+}
+
+.right {
+ text-align: right;
+}
+
+.post {
+ margin-bottom: 1em;
+ margin-top: 3em;
+}
+
+
+a {
+ text-decoration: none;
+}
+
+h1 a {
+ color: black;
+}
+
+.post img { max-width: 100%; height: auto }
+
+.permalink img {width:30px; text-align: right;}
+
+.quiet a {
+ color: #e5e5e5;
+}
+
+.rss {
+ color: #ff8d40;
+}
+
+.regular_post img { max-width: 100%; height: auto }
+
+
+
+
+cursor: url(http://freegucci.info/hand6.cur), auto;
+</style>
+
+</head>
+<body>
+
+
+<div class="post">
+ <i>P∪R∅S ΔRΔCLΞS</i>
+</div>
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://24.media.tumblr.com/tumblr_m0en9dsiKb1r39x51o1_500.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/18784942922"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://25.media.tumblr.com/tumblr_lzwz6xo1Ga1r39x51o1_400.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/18202361966"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://28.media.tumblr.com/tumblr_lzkk8k1XIX1r39x51o1_400.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17802558288"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://25.media.tumblr.com/tumblr_lzbbz9iq5e1r39x51o1_500.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17534193572"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://30.media.tumblr.com/tumblr_lz65otS8jA1r39x51o1_400.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17365319360"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://27.media.tumblr.com/tumblr_lz02naWUYs1r39x51o1_250.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17186174359"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://29.media.tumblr.com/tumblr_lyzgc4CKgG1r39x51o1_400.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17159825038"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+
+
+
+
+
+<div class="post">
+
+
+ <img src="http://30.media.tumblr.com/tumblr_lyyi8hxUkw1r39x51o1_400.gif" alt="" />
+
+
+
+
+
+
+
+
+
+ <div class="regular_post">
+
+ </>
+
+
+
+
+
+
+<br><span class="permalink"><a href="http://peccoooo.tumblr.com/post/17141950780"><h1>↳<img src="http://dump.fm/avatars/20100625/1277462015552-dumpfm-pecco-circulo1.gif" width="50" height="50" alt="permalink"></a>
+
+ </div>
+
+
+
+
+<div class="nav">░<a href=/page/2> ☞ </a></div> </h1>
+ </div>
+
+
+<!-- BEGIN TUMBLR CODE --><iframe src="http://assets.tumblr.com/iframe.html?10&src=http%3A%2F%2Fpeccoooo.tumblr.com%2F&lang=en_US&name=peccoooo" scrolling="no" width="330" height="25" frameborder="0" style="position:absolute; z-index:1337; top:0px; right:0px; border:0px; background-color:transparent; overflow:hidden;" id="tumblr_controls"></iframe><!--[if IE]><script type="text/javascript">document.getElementById('tumblr_controls').allowTransparency=true;</script><![endif]--><script type="text/javascript">_qoptions={qacct:"p-19UtqE8ngoZbM"};</script><script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script><noscript><img src="http://pixel.quantserve.com/pixel/p-19UtqE8ngoZbM.gif" style="display:none; border-width:0px; height:1px; width:1px;" alt=""/></noscript><!-- END TUMBLR CODE --> +</body>
+</html>
\ No newline at end of file diff --git a/frontend/templates/topvideos.html b/frontend/templates/topvideos.html new file mode 100644 index 0000000..613faa2 --- /dev/null +++ b/frontend/templates/topvideos.html @@ -0,0 +1,129 @@ +{% load static %} +{% get_static_prefix as STATIC_PREFIX %} +<!doctype html> +<html> +<head> +<title>TOP VIDEOS ON SCANNERJAMMER</title> +<link rel="shortcut icon" href="{{ STATIC_PREFIX }}favicon.ico" /> +<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> +<meta property="og:title" content="Top Videos on ScannerJammer"/> +<meta property="og:type" content="website"/> +<meta property="og:url" content="{{SERVER_HOST}}:{{SERVER_PORT}}/"/> +<meta property="og:image" content="{{ STATIC_PREFIX }}img/plant.gif"/> +<meta property="og:site_name" content="ScannerJammer"/> +<meta property="og:description" content="Youtube video chat"/> +<meta property="fb:admins" content="100001923956223,1709246"/> +<meta name="description" content="Youtube video chat" /> +<link href="{{ STATIC_PREFIX }}css/sasscss/profile.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<link href="{{ STATIC_PREFIX }}css/sasscss/top.css" media="screen, projection" rel="stylesheet" type="text/css" /> +<style type="text/css"> +body + { +background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.11, rgb(49,18,150)), + color-stop(0.67, rgb(143,38,255)), + color-stop(0.84, rgb(157,66,255)) +); +background-image: -moz-linear-gradient( + center bottom, + rgb(49,18,150) 11%, + rgb(143,38,255) 67%, + rgb(157,66,255) 84% +); + } +</style> +</head> +<body> +<section id="logo"> + <a href="/"><img src="{{ STATIC_PREFIX }}img/scanjam-title.gif" width="347" height="44" id="scanjam" border="0" /></a> + <h1 id="header">TOP VIDEOS</h1> +</section> +<section id="logobg"></section> + +<section id="flower"><img src="{{ STATIC_PREFIX }}img/flower-red.gif" height="400" /></section> + +<section id="plant1"><img src="{{ STATIC_PREFIX }}img/plant.gif" height="700" /></section> +<section id="plant2"><img src="{{ STATIC_PREFIX }}img/plant.gif" height="700" /></section> + +<section id="player"> + <section id="projector"> + <section id="screen"></section> + <section id="ytscreen"></section> + <section id="video-title"></section> + </section> + <nav id="controls"> + <button id="prev"><<</button> + <button id="pause">||</button> + <button id="next">>></button> + <button id="scan">SCAN</button> + <button id="like">LIKE</button> + <button id="fullscreen">FULLSCREEN</button> + <a id="video-link" target="_blank">[x]</a> + <span id="sharebutton" class="st_sharethis" st_url="http://scannerjammer.com/" st_title="Scanner Jammer"></span> + </nav> +</section> + +<section id="playlistbg"></section> +<section id="playlist"> + <ol id="queueLinks"></ol> + <ul id="queue"> + </ul> +</section> + +<div id="sitez"> + <div> + <a href="/top">top</a> . + <a href="/directory">directory</a> . + </div> + <div id="likebutton"> + <fb:like href="{{ SERVER_HOST }}:{{ SERVER_PORT }}/" layout="button_count" show_faces="false" width="90" font=""></fb:like> + </div> +</div> + +<section class="cloudleft"></section> +<section class="cloudright"></section> +<section class="cloudleft shimmer"></section> +<section class="cloudright shimmer"></section> +<section class="cloudleft shimmer2"></section> +<section class="cloudright shimmer2"></section> + +<section id="bg"> +</section> + +<section id="msg"></section> +<section id="plea"> + please enable javascript +</section> +</body> +<script type="text/javascript">document.getElementById("plea").style.display="none"</script> +<script type="text/javascript"> + serverHost = "{{ SERVER_HOST }}" + serverPort = {{ SERVER_PORT }} +var todayVideoQueue = {{ top_today }} +var todayVideoQueueTitle = "Today" +var yesterdayVideoQueue = {{ top_yesterday }} +var yesterdayVideoQueueTitle = "Yesterday" +var topVideoQueue = {{ top_alltime }} +var topVideoQueueTitle = "All Time" +</script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/jquery-1.5.2.min.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/jquery.md5.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/swfobject.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/soundmanager2.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/debug.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/api.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/auth.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/like.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/chat.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/player.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/vimeo.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/youtube.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/soundcloud.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/audio.js"></script> +<script type="text/javascript" src="{{ STATIC_PREFIX }}js/top.js"></script> +<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> +</html> + |
