diff --git a/docs/plugins/create.rst b/docs/plugins/create.rst index 7ecc627d0a..568c9ece8d 100644 --- a/docs/plugins/create.rst +++ b/docs/plugins/create.rst @@ -31,7 +31,9 @@ Each plugin package contains a configuration file called ``plugin.json``. Here i "description": "Your plugin's description", "url": "Absolute URL to your plugin or a Github repository", "library": "./my-plugin.js", - "staticDir": "/assets", + "staticDirs": { + "images": "public/images" + }, "less": [ "assets/style.less" ], @@ -45,7 +47,9 @@ The ``id`` property is a unique name that identifies the plugin. The ``library`` property is a relative path to the library in your package. It is automatically loaded by NodeBB (if the plugin is activated). -The ``staticDir`` property is a path (relative to your plugin's root) to a directory that NodeBB will expose to the public at the route ``/plugins/{YOUR-PLUGIN-ID}``. +The ``staticDirs`` property is an object hash that maps out paths (relative to your plugin's root) to a directory that NodeBB will expose to the public at the route ``/plugins/{YOUR-PLUGIN-ID}``. + +* e.g. The ``staticDirs`` hash in the sample configuration maps ``/path/to/your/plugin/public/images`` to ``/plugins/my-plugin/images`` The ``less`` property contains an array of paths (relative to your plugin's directory), that will be precompiled into the CSS served by NodeBB. diff --git a/docs/plugins/hooks.rst b/docs/plugins/hooks.rst index f560bf6e0a..eb64dd8bca 100644 --- a/docs/plugins/hooks.rst +++ b/docs/plugins/hooks.rst @@ -182,4 +182,12 @@ Executed whenever a post is created or edited, after it is saved into the databa ``action:user.set`` ^^^^^^^^^^^^^^^^^^^^^ -Useful for things like awarding badges or achievements after a user has reached some value (ex. 100 posts) \ No newline at end of file +Parameters: field (str), value, type ('set', 'increment', or 'decrement') +Useful for things like awarding badges or achievements after a user has reached some value (ex. 100 posts) + +``action:settings.set`` +^^^^^^^^^^^^^^^^^^^^^ +Parameters: hash (str), object (obj) +Useful if your plugins want to cache settings instead of pulling from DB everytime a method is called. Listen to this and refresh accordingly. + + diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 53a06b1f5a..638f37e5f5 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 727cee9f62..851e1e0f7e 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "ملف", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "دردشة", "notify_me": "تنبه من ردود جديدة في هذا الموضوع", "quote": "اقتبس", diff --git a/public/language/cs/global.json b/public/language/cs/global.json index 7fa9cddb38..eb9a0f0a8c 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index 88d70bd7f3..4220fc9499 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Sledovat toto téma", "quote": "Citovat", diff --git a/public/language/de/global.json b/public/language/de/global.json index af37df4287..b4a3c84b07 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -45,16 +45,16 @@ "views": "Aufrufe", "reputation": "Reputation", "read_more": "weiterlesen", - "posted_ago_by_guest": "Gespostet %1 von Gast", + "posted_ago_by_guest": "%1 verfasst von einem Gast", "posted_ago_by": "Geposted %1 von %2", - "posted_ago": "posted %1", - "posted_in_ago_by_guest": "posted in %1 %2 by Guest", - "posted_in_ago_by": "Geposted in %1 %2 von %3", - "posted_in_ago": "Geposted in %1", + "posted_ago": "schrieb %1", + "posted_in_ago_by_guest": "verfasst in %1 %2 von einem Gast", + "posted_in_ago_by": "Verfasst in %1 %2 von %3", + "posted_in_ago": "posted in %1 %2", "replied_ago": "antwortete %1", "user_posted_ago": "1% schrieb %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by_ago": "zuletzt editirt von %1 %2", + "guest_posted_ago": "Gast schrieb %1", + "last_edited_by_ago": "zuletzt editiert von %1 %2", "norecentposts": "Keine aktuellen Beiträge", "norecenttopics": "Keine aktuellen Themen", "recentposts": "Aktuelle Beiträge", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index e31c136723..28dc42c156 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -4,9 +4,10 @@ "topic_id_placeholder": "Topic ID eingeben", "no_topics_found": "Keine passende Themen gefunden.", "no_posts_found": "Keine Beiträge gefunden!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "Dieser Beitrag wurde gelöscht!", "profile": "Profil", - "posted_by": "Posted by %1", + "posted_by": "Geschrieben von %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Werde bei neues Antworten auf dieses Thema benachrichtigt.", "quote": "zitieren", @@ -40,7 +41,7 @@ "thread_tools.lock": "Thema schließen", "thread_tools.unlock": "Thema öffnen", "thread_tools.move": "Thema verschieben", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "Alle verschieben", "thread_tools.fork": "Thema aufspalten", "thread_tools.delete": "Thema löschen", "thread_tools.delete_confirm": "Sind Sie sicher, dass Sie dieses Thema löschen möchten?", @@ -87,7 +88,7 @@ "composer.thumb_remove": "Felder leeren", "composer.drag_and_drop_images": "Bilder hier reinziehen", "composer.upload_instructions": "Zum Hochladen Bilder hier reinziehen.", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)" + "more_users_and_guests": "%1 weitere(r) Nutzer und %2 Gäste", + "more_users": "%1 weitere(r) Nutzer", + "more_guests": "%1 weitere Gäste" } \ No newline at end of file diff --git a/public/language/en@pirate/global.json b/public/language/en@pirate/global.json index 4688fcff8b..b6765d066e 100644 --- a/public/language/en@pirate/global.json +++ b/public/language/en@pirate/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/en@pirate/topic.json b/public/language/en@pirate/topic.json index 7339a2bb3b..e5c97c09f1 100644 --- a/public/language/en@pirate/topic.json +++ b/public/language/en@pirate/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profile", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Be notified of new replies in this topic", "quote": "Quote", diff --git a/public/language/en_US/global.json b/public/language/en_US/global.json index cc0d7e11dd..9673ee4afb 100644 --- a/public/language/en_US/global.json +++ b/public/language/en_US/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/en_US/notifications.json b/public/language/en_US/notifications.json index facec04e90..ee16612305 100644 --- a/public/language/en_US/notifications.json +++ b/public/language/en_US/notifications.json @@ -12,7 +12,7 @@ "user_made_post": "%1 made a new post", "new_message_from": "New message from %1", "upvoted_your_post": "%1 has upvoted your post.", - "favourited_your_post": "%1 has favourited your post.", + "favourited_your_post": "%1 has favorited your post.", "user_flagged_post": "%1 flagged a post.", "user_posted_to": "%1 has posted a reply to: %2" } \ No newline at end of file diff --git a/public/language/en_US/topic.json b/public/language/en_US/topic.json index ec70f8b365..ad4747ae31 100644 --- a/public/language/en_US/topic.json +++ b/public/language/en_US/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profile", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Be notified of new replies in this topic", "quote": "Quote", diff --git a/public/language/es/global.json b/public/language/es/global.json index f678180d6e..a70dfc51a0 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index a1e82b600c..8d3b12a377 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -9,7 +9,7 @@ "user.following": "Gente que sigue %1 ", "user.followers": "Seguidores de %1", "user.posts": "Posteos de %1", - "user.topics": "Topics created by %1", + "user.topics": "Temas creados por %1", "user.favourites": "Publicaciones favoritas de %1 ", "user.settings": "Preferencias del Usuario" } \ No newline at end of file diff --git a/public/language/es/reset_password.json b/public/language/es/reset_password.json index 7fdd6ab7bd..a9f2114972 100644 --- a/public/language/es/reset_password.json +++ b/public/language/es/reset_password.json @@ -3,12 +3,12 @@ "update_password": "Actualizar contraseña", "password_changed.title": "Contraseña editada", "password_changed.message": "

La contraseña fue modificada con éxito, por favor inicia sesión de nuevo.", - "wrong_reset_code.title": "Código de reinicio Incorrecto", + "wrong_reset_code.title": "Código de reinicio incorrecto", "wrong_reset_code.message": "El código de reinicio ingresado no es correcto. Por favor inténtalo de nuevo o pide un nuevo código.", "new_password": "Nueva Contraseña", "repeat_password": "Confirmar Contraseña", "enter_email": "Por favor ingresa tu correo electrónico y te enviaremos un correo con indicaciones para inicializar tu cuenta.", - "enter_email_address": "Enter Email Address", + "enter_email_address": "Introduce tu correo electrónico", "password_reset_sent": "Reinicio de contraseña enviado", "invalid_email": "Correo Electrónico no válido o inexistente!" } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 0c6fc174d9..3c3f9f753e 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Perfil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Serás notificado cuando haya nuevas respuestas en este tema", "quote": "Citar", diff --git a/public/language/et/global.json b/public/language/et/global.json index 333b6152a7..27f3cefd89 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -45,16 +45,16 @@ "views": "Vaatamised", "reputation": "Reputatsioon", "read_more": "loe veel", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in_ago_by_guest": "posted in %1 %2 by Guest", - "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", - "replied_ago": "replied %1", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by_ago": "last edited by %1 %2", + "posted_ago_by_guest": "postitatud %1 tagasi külalise poolt", + "posted_ago_by": "postitatud %1 tagasi kasutaja %2 poolt", + "posted_ago": "postitatud %1 tagasi", + "posted_in_ago_by_guest": "postitatud kategooriasse %1 %2 tagasi külalise poolt", + "posted_in_ago_by": "postitatud kategooriasse %1 %2 aega tagasi kasutaja %3 poolt", + "posted_in_ago": "postitatud kategooriasse %1 %2 tagasi", + "replied_ago": "vastas %1 tagasi", + "user_posted_ago": "kasutaja %1 postitas %2 tagasi", + "guest_posted_ago": "Külaline postitas %1", + "last_edited_by_ago": "viimati muudetud kasutaja %1 poolt %2 tagasi", "norecentposts": "Hiljutisi postitusi ei ole", "norecenttopics": "Hiljutisi teemasid ei ole", "recentposts": "Hiljutised postitused", @@ -65,6 +65,6 @@ "offline": "Väljas", "email": "Emaili aadress", "language": "Keel", - "guest": "Guest", - "guests": "Guests" + "guest": "Külaline", + "guests": "Külalised" } \ No newline at end of file diff --git a/public/language/et/topic.json b/public/language/et/topic.json index dce9918788..05c614a960 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -4,9 +4,10 @@ "topic_id_placeholder": "Sisesta teema ID", "no_topics_found": "Teemasid ei leitud!", "no_posts_found": "Postitusi ei leitud!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "See postitus on kustutatud!", "profile": "Profiil", - "posted_by": "Posted by %1", + "posted_by": "Postitatud %1 poolt", + "posted_by_guest": "Posted by Guest", "chat": "Vestlus", "notify_me": "Saa teateid uutest postitustest selles teemas", "quote": "Tsiteeri", @@ -40,7 +41,7 @@ "thread_tools.lock": "Lukusta teema", "thread_tools.unlock": "Eemalda märgistatud teema", "thread_tools.move": "Liiguta teema", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "Liiguta kõik", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Kustuta teema", "thread_tools.delete_confirm": "Oled kindel, et soovid kustutada antud teema?", @@ -87,7 +88,7 @@ "composer.thumb_remove": "Puhasta väljad", "composer.drag_and_drop_images": "Lohista pildid siia", "composer.upload_instructions": "Lae üles pilte lohistades need siia.", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)" + "more_users_and_guests": "%1 kasutaja(t) ja %2 külalist", + "more_users": "veel %1 kasutaja(t)", + "more_guests": "veel %1 külalist" } \ No newline at end of file diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 27d4615244..8d75610b52 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -19,7 +19,7 @@ "no-post": "چنین دیدگاهی نداریم", "no-group": "چنین گروهی نداریم", "no-user": "چنین کاربری نداریم", - "no-teaser": "Teaser doesn't exist", + "no-teaser": "چکیدهٔ دیدگاه نیست", "no-privileges": "شما پروانه‌های کافی برای این کار را ندارید.", "category-disabled": "دسته از کار افتاد.", "topic-locked": "جستار بسته شده", diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json index 5ecee56f31..75f5bc20fb 100644 --- a/public/language/fa_IR/global.json +++ b/public/language/fa_IR/global.json @@ -39,18 +39,18 @@ "alert.unfollow": "شما دیگر %1 را دنبال نمی‌کنید!", "alert.follow": "اکنون %1 را دنبال می‌کنید.", "online": "حاضر", - "users": "Users", - "topics": "Topics", + "users": "کاربران", + "topics": "جُستارها", "posts": "دیدگاه‌ها", "views": "بازدیدها", - "reputation": "Reputation", + "reputation": "اعتبار", "read_more": "read more", "posted_ago_by_guest": "posted %1 by Guest", "posted_ago_by": "posted %1 by %2", "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", @@ -65,6 +65,6 @@ "offline": "غایب", "email": "رایانامه", "language": "زبان", - "guest": "Guest", - "guests": "Guests" + "guest": "مهمان", + "guests": "مهمان‌ها" } \ No newline at end of file diff --git a/public/language/fa_IR/success.json b/public/language/fa_IR/success.json index af124e91ac..bfebde56e2 100644 --- a/public/language/fa_IR/success.json +++ b/public/language/fa_IR/success.json @@ -1,5 +1,5 @@ { - "success": "Success", + "success": "موفقیت", "topic-post": "دیدگاه شما باموفقیت فرستاده شد.", "authentication-successful": "اعتبارسنجی موفق", "settings-saved": "تنظیمات اندوخته شد." diff --git a/public/language/fa_IR/topic.json b/public/language/fa_IR/topic.json index d885628f10..4ffe102720 100644 --- a/public/language/fa_IR/topic.json +++ b/public/language/fa_IR/topic.json @@ -4,9 +4,10 @@ "topic_id_placeholder": "ID جستار را بنویسید", "no_topics_found": "هیچ جستاری یافت نشد!", "no_posts_found": "دیدگاهی یافت نشد!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "این دیدگاه پاک شده!", "profile": "نمایه", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "گفتگو", "notify_me": "از پاسخ‌های تازه در جستار آگاه شوید", "quote": "نقل قول", @@ -40,7 +41,7 @@ "thread_tools.lock": "قفل کردن جستار", "thread_tools.unlock": "باز کردن جستار", "thread_tools.move": "جابجا کردن جستار", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "جابجایی همه", "thread_tools.fork": "شاخه ساختن از جستار", "thread_tools.delete": "پاک کردن جستار", "thread_tools.delete_confirm": "آیا از پاک کردن این جستار اطمینان دارید؟", diff --git a/public/language/fi/global.json b/public/language/fi/global.json index 72ce704376..aa12108f0d 100644 --- a/public/language/fi/global.json +++ b/public/language/fi/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index acba808b23..0848103601 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profiili", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Keskustele", "notify_me": "Ilmoita, kun tähän keskusteluun tulee uusia viestejä", "quote": "Lainaa", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index d536c24a73..43ba8ec4f0 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -1,49 +1,49 @@ { - "invalid-data": "Invalid Data", - "not-logged-in": "You don't seem to be logged in.", - "invalid-cid": "Invalid Category ID", - "invalid-tid": "Invalid Topic ID", - "invalid-pid": "Invalid Post ID", - "invalid-uid": "Invalid User ID", - "invalid-username": "Invalid Username", - "invalid-email": "Invalid Email", - "invalid-title": "Invalid title", - "invalid-user-data": "Invalid User Data", - "invalid-password": "Invalid Password", - "invalid-pagination-value": "Invalid pagination value", - "username-taken": "Username taken", - "email-taken": "Email taken", - "user-banned": "User banned", - "no-category": "Category doesn't exist", - "no-topic": "Topic doesn't exist", - "no-post": "Post doesn't exist", - "no-group": "Group doesn't exist", - "no-user": "User doesn't exist", - "no-teaser": "Teaser doesn't exist", - "no-privileges": "You don't have enough privileges for this action.", - "category-disabled": "Category disabled", - "topic-locked": "Topic Locked", - "still-uploading": "Please wait for uploads to complete.", - "content-too-short": "Please enter a longer post. At least %1 characters.", - "title-too-short": "Please enter a longer title. At least %1 characters.", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", - "too-many-posts": "You can only post every %1 seconds.", - "file-too-big": "Maximum allowed file size is %1 kbs", - "cant-vote-self-post": "You cannot vote for your own post", - "already-favourited": "You already favourited this post", - "already-unfavourited": "You alread unfavourited this post", - "cant-ban-other-admins": "You can't ban other admins!", - "invalid-image-type": "Invalid image type", - "group-name-too-short": "Group name too short", - "group-already-exists": "Group already exists", - "group-name-change-not-allowed": "Group name change not allowed", - "post-already-deleted": "Post already deleted", - "post-already-restored": "Post already restored", - "topic-already-deleted": "Topic already deleted", - "topic-already-restored": "Topic already restored", - "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", - "invalid-file": "Invalid File", - "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Signature can't be longer than %1 characters!", - "cant-chat-with-yourself": "You can't chat with yourself!" + "invalid-data": "Données Invalides", + "not-logged-in": "Vous ne semblez pas être connecté.", + "invalid-cid": "ID de Catégorie Invalide", + "invalid-tid": "ID de Sujet Invalide", + "invalid-pid": "ID de Message Invalide", + "invalid-uid": "ID Utilisateur Invalide", + "invalid-username": "Nom d'utilisateur Invalide", + "invalid-email": "Email Invalide", + "invalid-title": "Titre Invalide", + "invalid-user-data": "Données Utilisateur Invalides", + "invalid-password": "Mot de passe Invalide", + "invalid-pagination-value": "Valeur de pagination invalide", + "username-taken": "Nom d’utilisateur déjà utilisé", + "email-taken": "Email déjà utilisé", + "user-banned": "Utilisateur banni", + "no-category": "Cette catégorie n'existe pas", + "no-topic": "Ce sujet n'existe pas", + "no-post": "Ce message n'existe pas", + "no-group": "Ce groupe n'existe pas", + "no-user": "Cet utilisateur n'existe pas", + "no-teaser": "L’aperçu n'existe pas", + "no-privileges": "Vous n'avez pas les privilèges nécessaires pour effectuer cette action.", + "category-disabled": "Catégorie désactivée", + "topic-locked": "Sujet Verrouillé", + "still-uploading": "Veuillez patienter pendant le téléchargement.", + "content-too-short": "Veuillez entrer un message plus long. %1 caractères minimum.", + "title-too-short": "Veuillez entrer un titre plus long. %1 caractères minimum.", + "title-too-long": "Veuillez entrer un titre plus court. Les titres ne peuvent excéder %1 caractères.", + "too-many-posts": "Vous ne pouvez poster que toutes les %1 secondes.", + "file-too-big": "La taille maximum des fichiers est de %1 kbs.", + "cant-vote-self-post": "Vous ne pouvez pas voter pour vos propres messages", + "already-favourited": "Vous avez déjà mis ce message en favoris", + "already-unfavourited": "Vous avez déjà enlevé ce message des favoris", + "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs!", + "invalid-image-type": "Type d’image invalide", + "group-name-too-short": "Nom de groupe trop court", + "group-already-exists": "Ce groupe existe déjà", + "group-name-change-not-allowed": "Modification du nom de groupe non permise", + "post-already-deleted": "Message déjà supprimé", + "post-already-restored": "Message déjà restauré", + "topic-already-deleted": "Sujet déjà supprimé", + "topic-already-restored": "Sujet déjà restauré", + "topic-thumbnails-are-disabled": "Miniatures de sujet désactivés", + "invalid-file": "Fichier Invalide", + "uploads-are-disabled": "Téléchargements désactivés", + "signature-too-long": "La signature ne peut dépasser %1 caractères!", + "cant-chat-with-yourself": "Vous ne pouvez chatter avec vous même!" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index 203b1bb218..945eaaa046 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -45,16 +45,16 @@ "views": "Vues", "reputation": "Réputation", "read_more": "En lire plus", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in_ago_by_guest": "posted in %1 %2 by Guest", - "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", - "replied_ago": "replied %1", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by_ago": "last edited by %1 %2", + "posted_ago_by_guest": "posté %1 par un Invité", + "posted_ago_by": "posté %1 par %2", + "posted_ago": "posté %1", + "posted_in_ago_by_guest": "posté dans %1 %2 par un Invité", + "posted_in_ago_by": "posté dans %1 %2 par %3", + "posted_in_ago": "posté dans %1 %2", + "replied_ago": "répondu %1", + "user_posted_ago": "%1 a posté %2", + "guest_posted_ago": "Un Invité a posté %1", + "last_edited_by_ago": "dernière édition par %1 %2", "norecentposts": "Aucun Message Récent", "norecenttopics": "Aucun Sujet Récent", "recentposts": "Messages Récents", @@ -65,6 +65,6 @@ "offline": "Hors ligne", "email": "Email", "language": "Langue", - "guest": "Guest", - "guests": "Guests" + "guest": "Invité", + "guests": "Invités" } \ No newline at end of file diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index d562c39d0b..ea7cd36d88 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -9,7 +9,7 @@ "user.following": "Personnes que %1 suit", "user.followers": "Personnes qui suivent %1", "user.posts": "Message écrit par %1", - "user.topics": "Topics created by %1", + "user.topics": "Sujets créés par %1", "user.favourites": "Messages favoris de %1", "user.settings": "Préférences Utilisateur" } \ No newline at end of file diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 4ae56fe557..235603073a 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -4,9 +4,10 @@ "topic_id_placeholder": "Entrer l'ID du Sujet", "no_topics_found": "Aucun sujet trouvé !", "no_posts_found": "Aucun message trouvé!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "Ce message a été supprimé!", "profile": "Profil", - "posted_by": "Posted by %1", + "posted_by": "Posté par %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Être notifié des réponses dans ce sujet", "quote": "Citer", @@ -40,7 +41,7 @@ "thread_tools.lock": "Verrouiller le sujet", "thread_tools.unlock": "Déverouiller le sujet", "thread_tools.move": "Déplacer le sujet", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "Déplacer tout", "thread_tools.fork": "Scinder le sujet", "thread_tools.delete": "Supprimer le sujet", "thread_tools.delete_confirm": "Êtes vous sûr de vouloir supprimer ce sujet?", @@ -87,7 +88,7 @@ "composer.thumb_remove": "Effacer les champs", "composer.drag_and_drop_images": "Glisser-déposer ici les images", "composer.upload_instructions": "Uploader des images par glisser-déposer.", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)" + "more_users_and_guests": "%1 autre(s) utilisateur(s) et %2 invité(s)", + "more_users": "%1 autre(s) utilisateur(s)", + "more_guests": "%1 autre(s) invité(s)" } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 43d09519e1..f2293424a5 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -49,7 +49,7 @@ "digest_daily": "Quotidien", "digest_weekly": "Hebdomadaire", "digest_monthly": "Mensuel", - "has_no_follower": "Cet utilisateur n'a aucun suiveur :(", + "has_no_follower": "Cet utilisateur n'est suivi par personnne :(", "follows_no_one": "Cet utilisateur ne suit personne :(", "has_no_posts": "Ce membre n'a rien posté pour le moment", "has_no_topics": "L'utilsateur n'a encore créé aucun sujet.", diff --git a/public/language/he/global.json b/public/language/he/global.json index 7c4b380f43..74eb496719 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 25aef2661b..1ae1536b88 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "פרופיל", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "צ'אט", "notify_me": "קבל התראה כאשר יש תגובות חדשות בנושא זה", "quote": "ציטוט", diff --git a/public/language/hu/global.json b/public/language/hu/global.json index bb7327bb84..dab6719892 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/hu/reset_password.json b/public/language/hu/reset_password.json index 78f260cc8b..eb3df1f2ec 100644 --- a/public/language/hu/reset_password.json +++ b/public/language/hu/reset_password.json @@ -11,4 +11,4 @@ "enter_email_address": "Email cím megadása", "password_reset_sent": "Jelszó-visszaállítás elküldve", "invalid_email": "Helytelen E-mail cím / Nem létező E-mail cím!" -} +} \ No newline at end of file diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 37e9575140..141fdf8898 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Értesítést kérek az új hozzászólásokról ebben a topikban", "quote": "Idéz", diff --git a/public/language/it/global.json b/public/language/it/global.json index 4dcf3f3656..c408572d8f 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index 5cbafadae5..ecad017444 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profilo", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Ricevi notifiche di nuove risposte in questa discussione", "quote": "Citazione", diff --git a/public/language/ja/category.json b/public/language/ja/category.json index 0a4892d07f..43bc8f22d5 100644 --- a/public/language/ja/category.json +++ b/public/language/ja/category.json @@ -4,4 +4,4 @@ "browsing": "閲覧中", "no_replies": "返事はまだありません", "share_this_category": "この板を共有" -} +} \ No newline at end of file diff --git a/public/language/ja/error.json b/public/language/ja/error.json index facf88fcf5..a5a3c70da5 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -46,4 +46,4 @@ "uploads-are-disabled": "アップロードが無効された", "signature-too-long": "署名は最大%1文字までです!", "cant-chat-with-yourself": "自分にチャットすることはできません!" -} +} \ No newline at end of file diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 35269d5d82..1d2504bab7 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -50,7 +50,7 @@ "posted_ago": "%1に投稿された", "posted_in_ago_by_guest": "%1に %2 ゲストが投稿", "posted_in_ago_by": "%1 %2に %3 が投稿", - "posted_in_ago": "%1 に投稿", + "posted_in_ago": "posted in %1 %2", "replied_ago": "%1 に返答", "user_posted_ago": "%1 が%2に投稿", "guest_posted_ago": "ゲストが%1に投稿", @@ -67,4 +67,4 @@ "language": "言語", "guest": "ゲスト", "guests": "ゲスト" -} +} \ No newline at end of file diff --git a/public/language/ja/language.json b/public/language/ja/language.json index 19a14e500a..ecd635ee30 100644 --- a/public/language/ja/language.json +++ b/public/language/ja/language.json @@ -2,4 +2,4 @@ "name": "日本語", "code": "ja", "dir": "ltr" -} +} \ No newline at end of file diff --git a/public/language/ja/login.json b/public/language/ja/login.json index a16f10ddf2..4c1876670a 100644 --- a/public/language/ja/login.json +++ b/public/language/ja/login.json @@ -5,4 +5,4 @@ "alternative_logins": "ほかのログイン方法", "failed_login_attempt": "ログインに失敗しました.ユーザー名やパスワードをご確認ください。", "login_successful": "ログインしました!" -} +} \ No newline at end of file diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 7a01eeca56..507012d7a6 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -4,4 +4,4 @@ "chat.send": "送信", "chat.no_active": "チャットはありません。", "chat.user_typing": "%1 は入力中 ..." -} +} \ No newline at end of file diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index de907f0fcc..8706177779 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -15,4 +15,4 @@ "favourited_your_post": "%1はあなたのポストをお気に入りにしました。", "user_flagged_post": "%1 ポストを報告しました。", "user_posted_to": "%1%2 への返事を作成しました。" -} +} \ No newline at end of file diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index 8387697fe1..e9494c8d3f 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -12,4 +12,4 @@ "user.topics": "%1が作成したスレッド", "user.favourites": "%1のお気に入りポスト", "user.settings": "ユーザー設定" -} +} \ No newline at end of file diff --git a/public/language/ja/recent.json b/public/language/ja/recent.json index 88125f8432..e9595739f7 100644 --- a/public/language/ja/recent.json +++ b/public/language/ja/recent.json @@ -4,4 +4,4 @@ "week": "最近 1 週", "month": "最近 1 ヶ月", "no_recent_topics": "最近のスレッドはありません。" -} +} \ No newline at end of file diff --git a/public/language/ja/register.json b/public/language/ja/register.json index b1ce4c0794..7617407aa2 100644 --- a/public/language/ja/register.json +++ b/public/language/ja/register.json @@ -15,4 +15,4 @@ "alternative_registration": "ほかの登録方法", "terms_of_use": "利用規約", "agree_to_terms_of_use": "利用規約に同意する" -} +} \ No newline at end of file diff --git a/public/language/ja/reset_password.json b/public/language/ja/reset_password.json index 4c2d9e6858..c732e9e159 100644 --- a/public/language/ja/reset_password.json +++ b/public/language/ja/reset_password.json @@ -11,4 +11,4 @@ "enter_email_address": "メールアドレスを入力してください", "password_reset_sent": "パスワードリセットのメールを送信しました", "invalid_email": "このメールアドレスは存在しません" -} +} \ No newline at end of file diff --git a/public/language/ja/success.json b/public/language/ja/success.json index b8ea2c4056..cad5ecb03f 100644 --- a/public/language/ja/success.json +++ b/public/language/ja/success.json @@ -3,4 +3,4 @@ "topic-post": "成功に投稿しました。", "authentication-successful": "認証が成功しました", "settings-saved": "設定を保存しました。" -} +} \ No newline at end of file diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index d446179ca8..13fdba2593 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "このポストが削除されます!", "profile": "プロフィール", "posted_by": "%1 のポスト", + "posted_by_guest": "Posted by Guest", "chat": "チャット", "notify_me": "このスレッドに新しいポストが投稿された際に通知する", "quote": "引用", @@ -90,4 +91,4 @@ "more_users_and_guests": "%1 more user(s) and %2 guest(s)", "more_users": "%1 more user(s)", "more_guests": "%1 more guest(s)" -} +} \ No newline at end of file diff --git a/public/language/ja/unread.json b/public/language/ja/unread.json index a6027a54b3..8b67da2a31 100644 --- a/public/language/ja/unread.json +++ b/public/language/ja/unread.json @@ -6,4 +6,4 @@ "selected": "選択済み", "all": "すべて", "topics_marked_as_read.success": "すべてのスレッドを既読にしました。" -} +} \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 25ce70a83e..68b6d79bc6 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -59,4 +59,4 @@ "topics_per_page": "ページ毎のスレッド数", "posts_per_page": "ページ毎のポスト数", "notification_sounds": "通知が来たとき音を流す" -} +} \ No newline at end of file diff --git a/public/language/ja/users.json b/public/language/ja/users.json index fa9b441a9a..654a14494f 100644 --- a/public/language/ja/users.json +++ b/public/language/ja/users.json @@ -5,4 +5,4 @@ "search": "検索", "enter_username": "検索するユーザー名を入力してください", "load_more": "もっと表示" -} +} \ No newline at end of file diff --git a/public/language/lt/error.json b/public/language/lt/error.json index d536c24a73..840ef5b7c4 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -1,49 +1,49 @@ { - "invalid-data": "Invalid Data", - "not-logged-in": "You don't seem to be logged in.", - "invalid-cid": "Invalid Category ID", - "invalid-tid": "Invalid Topic ID", - "invalid-pid": "Invalid Post ID", - "invalid-uid": "Invalid User ID", - "invalid-username": "Invalid Username", - "invalid-email": "Invalid Email", - "invalid-title": "Invalid title", - "invalid-user-data": "Invalid User Data", - "invalid-password": "Invalid Password", - "invalid-pagination-value": "Invalid pagination value", - "username-taken": "Username taken", - "email-taken": "Email taken", - "user-banned": "User banned", - "no-category": "Category doesn't exist", - "no-topic": "Topic doesn't exist", - "no-post": "Post doesn't exist", - "no-group": "Group doesn't exist", - "no-user": "User doesn't exist", - "no-teaser": "Teaser doesn't exist", - "no-privileges": "You don't have enough privileges for this action.", - "category-disabled": "Category disabled", - "topic-locked": "Topic Locked", - "still-uploading": "Please wait for uploads to complete.", - "content-too-short": "Please enter a longer post. At least %1 characters.", - "title-too-short": "Please enter a longer title. At least %1 characters.", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", - "too-many-posts": "You can only post every %1 seconds.", - "file-too-big": "Maximum allowed file size is %1 kbs", - "cant-vote-self-post": "You cannot vote for your own post", - "already-favourited": "You already favourited this post", - "already-unfavourited": "You alread unfavourited this post", - "cant-ban-other-admins": "You can't ban other admins!", - "invalid-image-type": "Invalid image type", - "group-name-too-short": "Group name too short", - "group-already-exists": "Group already exists", - "group-name-change-not-allowed": "Group name change not allowed", - "post-already-deleted": "Post already deleted", - "post-already-restored": "Post already restored", - "topic-already-deleted": "Topic already deleted", - "topic-already-restored": "Topic already restored", - "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", - "invalid-file": "Invalid File", - "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Signature can't be longer than %1 characters!", - "cant-chat-with-yourself": "You can't chat with yourself!" + "invalid-data": "Klaidingi duomenys", + "not-logged-in": "Atrodo, kad jūs neesate prisijungęs.", + "invalid-cid": "Klaidingas kategorijos ID", + "invalid-tid": "Klaidingas temos ID", + "invalid-pid": "Klaidingas pranešimo ID", + "invalid-uid": "Klaidingas vartotojo ID", + "invalid-username": "Klaidingas vartotojo vardas", + "invalid-email": "Klaidingas el. pašto adresas", + "invalid-title": "Klaidingas pavadinimas", + "invalid-user-data": "Klaidingi vartotojo duomenys", + "invalid-password": "Klaidingas slaptažodis", + "invalid-pagination-value": "Klaidinga puslapiavimo reikšmė", + "username-taken": "Vartotojo vardas jau užimtas", + "email-taken": "El. pašto adresas jau užimtas", + "user-banned": "Vartotojas užblokuotas", + "no-category": "Kategorija neegzistuoja", + "no-topic": "Tema neegzistuoja", + "no-post": "Pranešimas neegzistuoja", + "no-group": "Grupė neegzistuoja", + "no-user": "Vartotojas neegzistuoja", + "no-teaser": "Trumpas skelbimas neegzistuoja!", + "no-privileges": "Jūs neturite teisės atlikti šį veiksmą.", + "category-disabled": "Kategorija išjungta", + "topic-locked": "Tema užrakinta", + "still-uploading": "Prašome palaukti kol bus baigti visi kėlimai į serverį", + "content-too-short": "Jūsų pranešimas turėtų būti ilgesnis, mažiausiai %1 simbolių.", + "title-too-short": "Pavadinimas turėtų būtų ilgesnis, mažiausiai %1 simbolių.", + "title-too-long": "Pavadinimas turėtų būti trumpesnis. Maksimalus leistinas ilgis- %1 simbolių.", + "too-many-posts": "Rašyti pranešimus galite kas %1 sekundžių.", + "file-too-big": "Maksimalus leistinas failo dydis %1 kb", + "cant-vote-self-post": "Jūs negalite balsuoti už savo pranešimą", + "already-favourited": "Jūs jau esate pamėgę šį pranešimą", + "already-unfavourited": "Jūs jau esate pašalinę šį pranešimą iš mėgiamų sąrašo", + "cant-ban-other-admins": "Jūs negalite užblokuoti kitų administratorių!", + "invalid-image-type": "Klaidingas paveikslėlio tipas", + "group-name-too-short": "Grupės pavadinimas per trumpas", + "group-already-exists": "Tokia grupė jau egzistuoja", + "group-name-change-not-allowed": "Grupės pavadinimas keitimas neleidžiamas", + "post-already-deleted": "Pranešimas jau yra anksčiau ištrintas", + "post-already-restored": "Pranešimas jau anksčiau atkurtas", + "topic-already-deleted": "Tema jau anksčiau buvo ištrinta", + "topic-already-restored": "Tema jau anksčiau buvo atkurta", + "topic-thumbnails-are-disabled": "Temos paveikslėliai neleidžiami.", + "invalid-file": "Klaidingas failas", + "uploads-are-disabled": "Įkėlimai neleidžiami", + "signature-too-long": "Parašas negali būti ilgesnis negu %1 simboliai!", + "cant-chat-with-yourself": "Jūs negalite susirašinėti su savimi!" } \ No newline at end of file diff --git a/public/language/lt/global.json b/public/language/lt/global.json index 64f8df18ef..54f12be8f1 100644 --- a/public/language/lt/global.json +++ b/public/language/lt/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index bc3806cfa9..26efd59b6c 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profilis", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Susirašinėti", "notify_me": "Gauti pranešimus apie naujus atsakymus šioje temoje", "quote": "Cituoti", diff --git a/public/language/ms/global.json b/public/language/ms/global.json index 769244044f..c2b5744009 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index 1c8680a8e3..cb1eaf42e9 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Sembang", "notify_me": "Kekal dimaklumkan berkenaan respon dalam topik ini", "quote": "Petikan", diff --git a/public/language/nb/global.json b/public/language/nb/global.json index 174caf3f87..c4f58883e2 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index fca974aa4f..5ecd38e2fc 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Bli varslet om nye svar i dette emnet", "quote": "Siter", diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 322239efe4..f5800b1abe 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index fcd6b36e70..ff6a0d125d 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profiel", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Krijg notificaties van nieuwe reacties op dit onderwerp", "quote": "Citeren", diff --git a/public/language/pl/global.json b/public/language/pl/global.json index 7f00359608..f44cf2e0e0 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", @@ -63,8 +63,8 @@ "dnd": "Nie przeszkadzać", "invisible": "Niewidoczny", "offline": "Niedostępny", - "email": "Email", - "language": "Language", + "email": "Adres e-mail", + "language": "Język", "guest": "Guest", "guests": "Guests" } \ No newline at end of file diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index 3f86ea8757..5b586de5ec 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -3,5 +3,5 @@ "chat.placeholder": "napisz wiadomość tutaj i naciśnij enter", "chat.send": "Wyślij", "chat.no_active": "Nie prowadzisz obecnie żadnych rozmów.", - "chat.user_typing": "%1 is typing ..." + "chat.user_typing": "%1 pisze..." } \ No newline at end of file diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index aacda0e7f4..8ff62f566d 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -7,12 +7,12 @@ "outgoing_link_message": "Opuszczasz", "continue_to": "Kontynuuj do", "return_to": "Wróć do", - "new_notification": "New Notification", - "you_have_unread_notifications": "You have unread notifications.", - "user_made_post": "%1 made a new post", - "new_message_from": "New message from %1", + "new_notification": "Nowe powiadomienie", + "you_have_unread_notifications": "Masz nieprzeczytane powiadomienia.", + "user_made_post": "%1 napisał nowy post", + "new_message_from": "Nowa wiadomość od %1", "upvoted_your_post": "%1 has upvoted your post.", "favourited_your_post": "%1 has favourited your post.", "user_flagged_post": "%1 flagged a post.", - "user_posted_to": "%1 has posted a reply to: %2" + "user_posted_to": "%1 dodał odpowiedź do %2" } \ No newline at end of file diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index c18c45e0c5..155c4619a1 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -9,7 +9,7 @@ "user.following": "Obserwowani przez %1", "user.followers": "Obserwujący %1", "user.posts": "Posty napisane przez %1", - "user.topics": "Topics created by %1", + "user.topics": "Wątki stworzone przez %1", "user.favourites": "Ulubione posty %1", "user.settings": "Ustawienia użytkownika" } \ No newline at end of file diff --git a/public/language/pl/reset_password.json b/public/language/pl/reset_password.json index a7a71f04fd..fa0affeab6 100644 --- a/public/language/pl/reset_password.json +++ b/public/language/pl/reset_password.json @@ -8,7 +8,7 @@ "new_password": "Nowe hasło", "repeat_password": "Powtórz hasło", "enter_email": "Podaj swój adres e-mail i wyślemy ci wiadomość z instrukcjami jak zresetować hasło.", - "enter_email_address": "Enter Email Address", + "enter_email_address": "Wpisz swój adres e-mail", "password_reset_sent": "Instrukcje zostały wysłane", "invalid_email": "Niepoprawny adres e-mail." } \ No newline at end of file diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 4250eaf41f..18c68678cd 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -6,7 +6,8 @@ "no_posts_found": "Nie znaleziono żadnych postów.", "post_is_deleted": "This post is deleted!", "profile": "Profil", - "posted_by": "Posted by %1", + "posted_by": "Napisane przez %1", + "posted_by_guest": "Posted by Guest", "chat": "Czat", "notify_me": "Powiadamiaj mnie o nowych odpowiedziach w tym wątku", "quote": "Cytuj", @@ -77,7 +78,7 @@ "composer.help": "Pomoc", "composer.discard": "Odrzuć", "composer.submit": "Wyślij", - "composer.replying_to": "Replying to %1", + "composer.replying_to": "Odpowiadanie na %1", "composer.new_topic": "Nowy wątek", "composer.uploading": "wysyłanie...", "composer.thumb_url_label": "Wklej adres miniaturki wątku", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index f28930d4cc..c0f56a6199 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -21,7 +21,7 @@ "chat": "Rozmawiaj", "follow": "Śledź", "unfollow": "Przestań śledzić", - "profile_update_success": "Profile has been updated successfully!", + "profile_update_success": "Profil został zaktualizowany pomyślnie!", "change_picture": "Zmień zdjęcie", "edit": "Edytuj", "uploaded_picture": "Przesłane zdjęcie", @@ -32,7 +32,7 @@ "change_password_error_wrong_current": "Twoje aktualne hasło nie jest poprawne!", "change_password_error_length": "Hasło jest za krótkie!", "change_password_error_match": "Hasła muszą pasować!", - "change_password_error_privileges": "You do not have the rights to change this password.", + "change_password_error_privileges": "Nie masz uprawnień do zmiany tego hasła.", "change_password_success": "Twoje hasło jest zaktualizowane!", "confirm_password": "Potwierdź hasło", "password": "Hasło", @@ -45,10 +45,10 @@ "show_email": "Wyświetlaj mój adres e-mail", "digest_label": "Subscribe to Digest", "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", - "digest_off": "Off", - "digest_daily": "Daily", - "digest_weekly": "Weekly", - "digest_monthly": "Monthly", + "digest_off": "Wyłączone", + "digest_daily": "Codziennie", + "digest_weekly": "Co tydzień", + "digest_monthly": "Co miesiąc", "has_no_follower": "Ten użytkownik nie ma jeszcze żadnych obserwujących", "follows_no_one": "Użytkownik jeszcze nikogo nie obsweruje.", "has_no_posts": "Użytkownik nie napisał jeszcze żadnych postów.", diff --git a/public/language/pt_BR/global.json b/public/language/pt_BR/global.json index 5503fb7125..bab2e65d8c 100644 --- a/public/language/pt_BR/global.json +++ b/public/language/pt_BR/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/pt_BR/topic.json b/public/language/pt_BR/topic.json index 36f737db2a..daf029be0b 100644 --- a/public/language/pt_BR/topic.json +++ b/public/language/pt_BR/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Perfil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Bate Papo", "notify_me": "Ser notificado a cada nova resposta", "quote": "Citar", diff --git a/public/language/ru/global.json b/public/language/ru/global.json index e5fa7d5d88..ba38a0cf7e 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 40b9b7cd67..fd97b8372e 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Профиль", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Чат", "notify_me": "Сообщать мне об ответах в этой теме", "quote": "Цитировать", diff --git a/public/language/sc/global.json b/public/language/sc/global.json index b9be532788..30c5548c40 100644 --- a/public/language/sc/global.json +++ b/public/language/sc/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index a70cb7db8e..d164ab8480 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Perfilu", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Tzarra", "notify_me": "Imbia·mi notìficas pro is rispostas noas a custa arresonada", "quote": "Mèntova", diff --git a/public/language/sk/global.json b/public/language/sk/global.json index df50a41ae5..f0c7f6af18 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/sk/reset_password.json b/public/language/sk/reset_password.json index b4123f8818..bceaea8148 100644 --- a/public/language/sk/reset_password.json +++ b/public/language/sk/reset_password.json @@ -8,7 +8,7 @@ "new_password": "Nové heslo", "repeat_password": "Potvrdenie hesla", "enter_email": "Zadajte svoju emailovú adresu a my Vám pošleme informácie, ako môžete obnoviť svoje heslo.", - "enter_email_address": "Enter Email Address", + "enter_email_address": "Zadajte e-mail", "password_reset_sent": "Obnova hesla odoslaná", "invalid_email": "Zlý email / Email neexistuje!" } \ No newline at end of file diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 04f2f94db1..f2d55ce1c2 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Sledovať túto tému", "quote": "Citovať", diff --git a/public/language/sv/global.json b/public/language/sv/global.json index 097b9c31f5..441a1aabad 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index eae47cbf5b..66ca248587 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "Profil", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "Chatt", "notify_me": "Få notiser om nya svar i detta ämne", "quote": "Citera", diff --git a/public/language/th/global.json b/public/language/th/global.json index f6cab50f35..ea02312ad6 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/th/language.json b/public/language/th/language.json index 60f5f2303c..c04cfd15be 100644 --- a/public/language/th/language.json +++ b/public/language/th/language.json @@ -1,5 +1,5 @@ { "name": "ภาษาอังกฤษ (สหราชอาณาจักร / แคนาดา)", - "code": "th", + "code": "en_GB", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/th/topic.json b/public/language/th/topic.json index 5650cc6681..187b74b496 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "รายละเอียด", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "แชท", "notify_me": "แจ้งเตือนเมื่อการตอบใหม่ในกระทู้นี้", "quote": "คำอ้างอิง", diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 9f5484160f..1dd370bfe8 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -45,16 +45,16 @@ "views": "Görüntülemeler", "reputation": "Saygınlık", "read_more": "daha fazla oku", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in_ago_by_guest": "posted in %1 %2 by Guest", - "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", - "replied_ago": "replied %1", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by_ago": "last edited by %1 %2", + "posted_ago_by_guest": "Ziyaretçi tarafından %1 yayımlandı", + "posted_ago_by": "%2 tarafından %1 yayımlandı", + "posted_ago": "%1 yayımlandı", + "posted_in_ago_by_guest": "%1 içinde Ziyaretçi tarafından %2 yayımlandı", + "posted_in_ago_by": "%1 içinde %3 tarafından %2 yayımlandı", + "posted_in_ago": "%1 içinde %2 yayımlandı", + "replied_ago": "%1 yanıtlandı", + "user_posted_ago": "%1 %2 yayımladı", + "guest_posted_ago": "Ziyaretçi %1 yayımladı", + "last_edited_by_ago": "en son %1 tarafından %2 düzenlendi", "norecentposts": "Güncel İletiler Yok", "norecenttopics": "Güncel Başlıklar Yok", "recentposts": "Güncel İletiler", @@ -65,6 +65,6 @@ "offline": "Çevrimdışı", "email": "E-posta", "language": "Dil", - "guest": "Guest", - "guests": "Guests" + "guest": "Ziyaretçi", + "guests": "Ziyaretçiler" } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index 47398c3dee..7a0758a998 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -4,9 +4,10 @@ "topic_id_placeholder": "Başlık ID gir", "no_topics_found": "Hiç konu bulunamadı!", "no_posts_found": "Hiç bir ileti bulunamadı!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "Bu ileti silinmiş!", "profile": "Profil", - "posted_by": "Posted by %1", + "posted_by": "%1 tarafından gönderildi", + "posted_by_guest": "Posted by Guest", "chat": "Sohbet", "notify_me": "Bu konudaki cevaplardan haberdar ol", "quote": "Alıntı", @@ -40,7 +41,7 @@ "thread_tools.lock": "Başlığı Kitle", "thread_tools.unlock": "Başlığı Aç", "thread_tools.move": "Başlığı Taşı", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "Hepsini Taşı", "thread_tools.fork": "Başlığı Ayır", "thread_tools.delete": "Başlığı Sil", "thread_tools.delete_confirm": "Bu başlığı gerçekten silmek istiyor musun?", @@ -87,7 +88,7 @@ "composer.thumb_remove": "Alanları temizle", "composer.drag_and_drop_images": "Resimleri buraya taşıyıp bırakabilirsiniz", "composer.upload_instructions": "Resimleri taşıyıp bırakarak yükleyebilirsiniz.", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)" + "more_users_and_guests": "%1 tane daha kullanıcı ve %2 ziyaretçi", + "more_users": "%1 tane daha kullanıcı", + "more_guests": "%1 tane daha ziyaretçi" } \ No newline at end of file diff --git a/public/language/vi/global.json b/public/language/vi/global.json index 433101d4cd..92ccbe6b3d 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -50,7 +50,7 @@ "posted_ago": "Đã viết %1", "posted_in_ago_by_guest": "Đã viết trong %1 %2 bởi Khách", "posted_in_ago_by": "Đã viết trong %1 %2 bởi %3", - "posted_in_ago": "Đã viết trong %1", + "posted_in_ago": "được đăng trong %1 %2", "replied_ago": "Đã trả lời %1", "user_posted_ago": "%1 đã viết %2", "guest_posted_ago": "Khách đã viết %1", diff --git a/public/language/vi/language.json b/public/language/vi/language.json index f0787f748a..798d02e33b 100644 --- a/public/language/vi/language.json +++ b/public/language/vi/language.json @@ -1,5 +1,5 @@ { - "name": "Tiếng Việt", - "code": "vi", + "name": "Tiếng Anh (Vương Quốc Anh/Canada)", + "code": "en_GB", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 3cae01a414..1847f66d39 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "Bài gửi này đã bị xóa!", "profile": "Hồ sơ", "posted_by": "Được viết bởi %1", + "posted_by_guest": "Posted by Guest", "chat": "Chat", "notify_me": "Được thông báo khi có trả lời mới trong chủ đề này", "quote": "Trích dẫn", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index d536c24a73..dddbcdfc88 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -1,14 +1,14 @@ { - "invalid-data": "Invalid Data", - "not-logged-in": "You don't seem to be logged in.", - "invalid-cid": "Invalid Category ID", - "invalid-tid": "Invalid Topic ID", - "invalid-pid": "Invalid Post ID", - "invalid-uid": "Invalid User ID", - "invalid-username": "Invalid Username", - "invalid-email": "Invalid Email", - "invalid-title": "Invalid title", - "invalid-user-data": "Invalid User Data", + "invalid-data": "无效数据", + "not-logged-in": "你看起来还没有登陆", + "invalid-cid": "无效的板块ID", + "invalid-tid": "无效的话题ID", + "invalid-pid": "无效的帖子ID", + "invalid-uid": "无效的用户ID", + "invalid-username": "无效用户名", + "invalid-email": "无效电邮", + "invalid-title": "无效标题", + "invalid-user-data": "无效用户数据", "invalid-password": "Invalid Password", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", diff --git a/public/language/zh_CN/global.json b/public/language/zh_CN/global.json index 866f659c48..d0012c0233 100644 --- a/public/language/zh_CN/global.json +++ b/public/language/zh_CN/global.json @@ -50,7 +50,7 @@ "posted_ago": "发布于 %1", "posted_in_ago_by_guest": "游客发布于 %1 %2", "posted_in_ago_by": "%3 在 %1 发布于 %2", - "posted_in_ago": "发布在 %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "%1 回复", "user_posted_ago": "%1 于 %2 发布", "guest_posted_ago": "游客发布于 %1", diff --git a/public/language/zh_CN/reset_password.json b/public/language/zh_CN/reset_password.json index ffd0ff528d..2c593f4900 100644 --- a/public/language/zh_CN/reset_password.json +++ b/public/language/zh_CN/reset_password.json @@ -8,7 +8,7 @@ "new_password": "新的密码", "repeat_password": "确认密码", "enter_email": "请输入您的Email地址,我们会发送邮件告诉您如何重置密码。", - "enter_email_address": "Enter Email Address", + "enter_email_address": "输入邮箱地址", "password_reset_sent": "密码重置邮件已发送。", "invalid_email": "非法的邮箱地址/邮箱不存在!" } \ No newline at end of file diff --git a/public/language/zh_CN/topic.json b/public/language/zh_CN/topic.json index b710e82ff4..d678314f6f 100644 --- a/public/language/zh_CN/topic.json +++ b/public/language/zh_CN/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "This post is deleted!", "profile": "资料", "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", "chat": "聊天", "notify_me": "该主题有新回复时通知我", "quote": "引用", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index d71a32feff..383952d163 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -43,8 +43,8 @@ "max": "最大.", "settings": "设置", "show_email": "显示我的邮箱", - "digest_label": "Subscribe to Digest", - "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", + "digest_label": "订阅摘要", + "digest_description": "按照计划订阅邮件提醒( 新通知和话题 )", "digest_off": "关闭", "digest_daily": "今天", "digest_weekly": "本周", diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json index 69262ee6ad..3222f72a1e 100644 --- a/public/language/zh_TW/global.json +++ b/public/language/zh_TW/global.json @@ -50,7 +50,7 @@ "posted_ago": "posted %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest", "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1", + "posted_in_ago": "posted in %1 %2", "replied_ago": "replied %1", "user_posted_ago": "%1 posted %2", "guest_posted_ago": "Guest posted %1", diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index e4e90365fb..f403487fc0 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -7,6 +7,7 @@ "post_is_deleted": "帖子已被刪除!", "profile": "資料", "posted_by": "由 %1 發布", + "posted_by_guest": "Posted by Guest", "chat": "聊天", "notify_me": "該主題有新回覆時通知我", "quote": "引用", diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index c3fb2cb6b4..59807fa7a0 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -83,13 +83,13 @@ var ajaxify = ajaxify || {}; app.processPage(); - ajaxify.widgets.render(tpl_url, url, function(err) { - $('#content, #footer').stop(true, true).removeClass('ajaxifying'); - ajaxify.initialLoad = false; + ajaxify.widgets.render(tpl_url, url); - app.refreshTitle(url); - $(window).trigger('action:ajaxify.end', {url: url}); - }); + $('#content, #footer').stop(true, true).removeClass('ajaxifying'); + ajaxify.initialLoad = false; + + app.refreshTitle(url); + $(window).trigger('action:ajaxify.end', {url: url}); }, url); return true; diff --git a/public/src/app.js b/public/src/app.js index 79dce1df9a..6f768c2596 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -117,7 +117,7 @@ var socket, }); socket.on('reconnecting', function (data, attempt) { - if(attempt === config.maxReconnectionAttempts) { + if(attempt === parseInt(config.maxReconnectionAttempts, 10)) { socket.socket.reconnectionAttempts = 0; socket.socket.reconnectionDelay = config.reconnectionDelay; return; diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index bae43ba3c1..d6fd2a697c 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -255,6 +255,9 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools', } else if(!user.length && data.online) { user = createUserIcon(data.uid, data.picture, data.userslug, data.username); activeEl.append(user); + activeEl.find('a[data-uid] img').tooltip({ + placement: 'top' + }); } } diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index e7a9ea371a..21588fbe4b 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -88,10 +88,12 @@ define(['taskbar', 'string', 'sounds'], function(taskbar, S, sounds) { socket.on('event:chats.userStartTyping', function(withUid) { var modal = module.getModal(withUid); var chatContent = modal.find('#chat-content'); - modal.find('.user-typing') - .removeClass('hide') - .appendTo(chatContent); - scrollToBottom(chatContent); + var atBottom = chatContent[0].scrollHeight - chatContent.scrollTop() === chatContent.innerHeight(); + + modal.find('.user-typing').removeClass('hide').appendTo(chatContent); + if (atBottom) { + scrollToBottom(chatContent); + } }); socket.on('event:chats.userStopTyping', function(withUid) { @@ -164,6 +166,20 @@ define(['taskbar', 'string', 'sounds'], function(taskbar, S, sounds) { handle: '.modal-header' }); + chatModal.find('.modal-content').resizable({ + minHeight: 250, + minWidth: 400 + }); + + chatModal.find('.modal-content').on('resize', function(event, ui) { + var totalHeight = chatModal.find('.modal-content').outerHeight() - chatModal.find('.modal-header').outerHeight(); + var padding = parseInt(chatModal.find('.modal-body').css('padding-top'), 10) + parseInt(chatModal.find('.modal-body').css('padding-bottom'), 10); + var contentMargin = parseInt(chatModal.find('#chat-content').css('margin-top'), 10) + parseInt(chatModal.find('#chat-content').css('margin-bottom'), 10); + var inputGroupHeight = chatModal.find('.input-group').outerHeight(); + + chatModal.find('#chat-content').css('height', totalHeight - padding - contentMargin - inputGroupHeight); + }); + chatModal.find('#chat-with-name').html(username); chatModal.find('#chat-close-btn').on('click', function() { @@ -181,7 +197,7 @@ define(['taskbar', 'string', 'sounds'], function(taskbar, S, sounds) { }); translator.translate('[[modules:chat.user_typing, ' + username + ']]', function(translated) { - chatModal.find('.user-typing').text(translated); + chatModal.find('.user-typing .text').text(translated); }); @@ -286,7 +302,7 @@ define(['taskbar', 'string', 'sounds'], function(taskbar, S, sounds) { var time = ' '; - if (data.fromuid !== chatContent.children().last().attr('data-uid')) { + if (data.fromuid !== chatContent.children('.chat-message').last().attr('data-uid')) { var userPicture = $(''); var userName = $(' '+ data.fromUser.username + ''); userName.toggleClass('chat-user-you', isYou); diff --git a/public/src/modules/settings.js b/public/src/modules/settings.js index 272060d537..177a685137 100644 --- a/public/src/modules/settings.js +++ b/public/src/modules/settings.js @@ -1,68 +1,592 @@ -"use strict"; -/* global define, socket, app */ +define(function () { -/* - settings.js 2.0, because version 1: - - saved everything in "config" hash - - was hand-rolled (mm, salmon hand roll) - - Relied on app.config (!!) - This module should: - - Allow you to save to any specified hash - - Rely on jQuery - - Use sockets - - Be more awesome -*/ + const DEFAULT_PLUGINS = [ + 'settings/checkbox', + 'settings/textarea', + 'settings/select', + 'settings/array', + 'settings/key' + ]; -define(function() { - var Settings = {}; + var Settings, + onReady = [], + waitingJobs = 0, + helper; - Settings.load = function(hash, formEl, callback) { - socket.emit('admin.settings.get', { - hash: hash - }, function(err, values) { - if (!err) { - $(formEl).deserialize(values); - if (typeof callback === 'function') { - callback(); + /* + * Attributes of HTML-tags that get used by default plugins: + * + data-key: the key to save/load the value within configuration-object + * + data-type: highest priority type-definition to determine what kind of element it is or which plugin to hook + * + type: normal priority type-definition + * + data-empty: if 'false' or '0' then values that are assumed as empty turn into null. data-empty of arrays affect + * their child-elements + * + data-trim: if not 'false' or '0' then values will get trimmed as defined by the elements type + * + data-split: if set and the element doesn't belong to any plugin, it's value will get split and joined by its + * value into the input-field + * array-elements: + * + data-split: separator (HTML allowed) between the elements, defaults to ', ' + * + data-new: value to insert into new created elements + * + data-attributes: an object to set the attributes of the child HTML-elements. tagName as special key will set + * the tag-name of the child HTML-elements + * key-fields: + * + data-trim: if 'false' or '0' then the value will get saved as string else as object providing following + * properties: ctrl, alt, shift, meta, code, char + * + data-split: separator between different modifiers and the key-code of the value that gets saved + * (only takes effect if trimming) + * + data-short: if not 'false' or '0' then modifier-keys get saved as first uppercase character + * (only takes effect if trimming) + * select: + * + data-options: an array of {"text":"Displayed Text","value":"some_value"}-like objects + * + * The name of the HTML-tag is lowest priority type-definition + * + * Examples-HTML: + No! +
+ Yes! +
+ An array of checkboxes that are selected by default: +


+ A simple input-field of any common type: +
+ A simple textarea: +
+ Array of textareas: +

+ 2D-Array of numbers that persist even when empty (but not empty rows): +

+ Same with persisting empty rows, but not empty numbers, if no row is given null will get saved: +

+ Array of Key-shortcuts (new: Ctrl+Shift+7): +

+ Array of numbers (new: 42, step: 21): +

+ Select with dynamic options: +
+ Select that loads faster: + + * + * Matching configuration: + { + cfg1: false, + cfg2: true, + cfg3: [false, false, true], + cfg4: 'hello world', + cfg5: 'some\nlong\ntext', + cfg6: ['some\nlong\ntexts', 'and another one'], + cfg7: [[]], + cfg8: [[]], + cfg9: [], + cfg10: [], + cfg11: 3, + cfg12: 2 + } + */ + + /** + Returns the hook of given name that matches the given type or element. + @param type The type of the element to get the matching hook for, or the element itself. + @param name The name of the hook. + */ + function getHook(type, name) { + var hook, plugin; + if (typeof type !== 'string') { + type = $(type); + type = type.data('type') || type.attr('type') || type.prop('tagName'); + } + plugin = Settings.plugins[type.toLowerCase()]; + if (plugin == null) { + return void 0; + } + hook = plugin[name]; + if (typeof hook === 'function') { + return hook; + } else { + return null; + } + } + + helper = { + /** + @returns Object A deep clone of the given object. + */ + deepClone: function (obj) { + if (typeof obj === 'object') { + return JSON.parse(JSON.stringify(obj)); + } else { + return obj; + } + }, + /** + Creates a new Element with given data. + @param tagName The tag-name of the element to create. + @param data The attributes to set. + @param text The text to add into the element. + @returns HTMLElement The created element. + */ + createElement: function (tagName, data, text) { + var element = document.createElement(tagName); + for (var k in data) { + element.setAttribute(k, data[k]); + } + if (text) { + element.appendChild(document.createTextNode(text)); + } + return element; + }, + /** + Calls the init-hook of the given element. + @param element The element to initialize. + */ + initElement: function (element) { + var hook = getHook(element, 'init'); + if (hook != null) { + hook.call(Settings, $(element)); + } + }, + /** + Calls the destruct-hook of the given element. + @param element The element to destruct. + */ + destructElement: function (element) { + var hook = getHook(element, 'destruct'); + if (hook != null) { + hook.call(Settings, $(element)); + } + }, + /** + Creates and initializes a new element. + @param type The type of the new element. + @param tagName The tag-name of the new element. + @param data The data to forward to create-hook or use as attributes. + @returns JQuery The created element. + */ + createElementOfType: function (type, tagName, data) { + var element, hook = getHook(type, 'create'); + if (hook != null) { + element = $(hook.call(Settings, type, tagName, data)); + } else { + if (data == null) { + data = {}; + } + if (type != null) { + data.type = type; + } + element = $(helper.createElement(tagName || 'input', data)) + } + element.data('type', type); + helper.initElement(element); + return element; + }, + /** + Creates a new Array that contains values of given Array depending on trim and empty. + @param array The array to clean. + @param trim Whether to trim each value if it has a trim-function. + @param empty Whether empty values should get added. + @returns Array The filtered and/or modified Array. + */ + cleanArray: function (array, trim, empty) { + var cleaned = []; + if (!trim && empty) { + return array; + } + for (var i = 0; i < array.length; i++) { + var value = array[i]; + if (trim) { + value = value === true ? 1 : value === false ? 0 : typeof value.trim === 'function' ? value.trim() : value; + } + if (empty || (value != null ? value.length : void 0)) { + cleaned.push(value); + } + } + return cleaned; + }, + isTrue: function (value) { + return value === 'true' || +value === 1; + }, + isFalse: function (value) { + return value === 'false' || +value === 0; + }, + /** + Calls the get-hook of the given element and returns its result. + If no hook is specified it gets treated as input-field. + @param element The element of that the value should get read. + @returns Object The value of the element. + */ + readValue: function (element) { + var empty = !helper.isFalse(element.data('empty')), + trim = !helper.isFalse(element.data('trim')), + split = element.data('split'), + hook = getHook(element, 'get'), + value; + if (hook != null) { + return hook.call(Settings, element, trim, empty); + } + if (split != null) { + empty = helper.isTrue(element.data('empty')); // default empty-value is false for arrays + value = element.val(); + var array = (value != null ? value.split(split || ',') : void 0) || []; + return helper.cleanArray(array, trim, empty); + } else { + value = element.val(); + if (trim && value != null && typeof value.trim === 'function') { + value = value.trim(); + } + if (empty || value !== void 0 && (value == null || value.length !== 0)) { + return value; + } else { + return void 0; + } + } + }, + /** + Calls the set-hook of the given element. + If no hook is specified it gets treated as input-field. + @param element The JQuery-Object of the element to fill. + @param value The value to set. + */ + fillField: function (element, value) { + var hook = getHook(element, 'set'), + trim = element.data('trim'); + trim = trim !== 'false' && +trim !== 0; + if (hook != null) { + return hook.call(Settings, element, value, trim); + } + if (value instanceof Array) { + value = value.join(element.data('split') || (trim ? ', ' : ',')); + } + if (trim && value && typeof value.trim === 'function') { + value = value.trim(); + if (typeof value.toString === 'function') { + value = value.toString(); + } + } else if (value != null) { + if (typeof value.toString === 'function') { + value = value.toString(); + } + if (trim) { + value = value.trim(); } } else { - console.log('[settings] Unable to load settings for hash: ', hash); + value = ''; } - }); - }; - - Settings.save = function(hash, formEl, callback) { - formEl = $(formEl); - - if (formEl.length) { - var values = formEl.serializeObject(); - - // "Fix" checkbox values, so that unchecked options are not omitted - formEl.find('input[type="checkbox"]').each(function(idx, inputEl) { - inputEl = $(inputEl); - if (!inputEl.is(':checked')) { - values[inputEl.attr('id')] = 'off'; + if (value !== void 0) { + element.val(value); + } + }, + /** + Calls the init-hook and {@link helper.fillField} on each field within wrapper-object. + @param wrapper The wrapper-element to set settings within. + */ + initFields: function (wrapper) { + $('[data-key]', wrapper).each(function (ignored, field) { + field = $(field); + var hook = getHook(field, 'init'), + keyParts = field.data('key').split('.'), + value = Settings.get(); + if (hook != null) { + hook.call(Settings, field); } + for (var i = 0; i < keyParts.length; i++) { + var part = keyParts[i]; + if (part && value != null) { + value = value[part]; + } + } + helper.fillField(field, value); }); - + }, + /** + Increases the amount of jobs before settings are ready by given amount. + @param amount The amount of jobs to register. + */ + registerReadyJobs: function (amount) { + return waitingJobs += amount; + }, + /** + Decreases the amount of jobs before settings are ready by given amount or 1. + If the amount is less or equal 0 all callbacks registered by {@link helper.whenReady} get called. + @param amount The amount of jobs that finished. + */ + beforeReadyJobsDecreased: function (amount) { + if (amount == null) { + amount = 1; + } + if (waitingJobs > 0) { + waitingJobs -= amount; + if (waitingJobs <= 0) { + for (var i = 0; i < onReady.length; i++) { + onReady[i](); + } + onReady = []; + } + } + }, + /** + Calls the given callback when the settings are ready. + @param callback The callback. + */ + whenReady: function (callback) { + if (waitingJobs <= 0) { + callback(); + } else { + onReady.push(callback); + } + }, + /** + Persists the given settings with given hash. + @param hash The hash to use as settings-id. + @param settings The settings-object to persist. + @param notify Whether to send notification when settings got saved. + @param callback The callback to call when done. + */ + persistSettings: function (hash, settings, notify, callback) { + if (settings != null && settings._settings != null && typeof settings._settings !== 'string') { + settings = helper.deepClone(settings); + settings._settings = JSON.stringify(settings._settings); + } socket.emit('admin.settings.set', { hash: hash, - values: values - }, function(err) { - app.alert({ - title: 'Settings Saved', - type: 'success', - timeout: 2500 - }); - + values: settings + }, function (err) { + if (notify) { + if (err) { + app.alert({ + title: 'Settings Not Saved', + type: 'danger', + message: "NodeBB failed to save the settings.", + timeout: 5000 + }); + console.log('[settings] Unable to set settings for hash: ', hash); + } else { + app.alert({ + title: 'Settings Saved', + type: 'success', + timeout: 2500 + }); + } + } if (typeof callback === 'function') { - callback(); + callback(err); } }); - } else { - console.log('[settings] Form not found.'); + }, + /** + Sets the settings to use to given settings. + @param settings The settings to use. + */ + use: function (settings) { + try { + settings._settings = JSON.parse(settings._settings); + } catch (_error) {} + Settings.cfg = settings; } }; + + Settings = { + helper: helper, + plugins: {}, + cfg: {}, + + /** + Returns the saved settings. + @returns Object The settings. + */ + get: function () { + if (Settings.cfg != null && Settings.cfg._settings !== void 0) { + return Settings.cfg._settings; + } + return Settings.cfg; + }, + /** + Registers a new plugin and calls its use-hook. + A plugin is an object containing a types-property to define its default bindings. + A plugin may also provide the following properties of type function with [return-value] (parameters): + use [void] - gets called when the Settings initializes the plugin. + init [void] (element) - gets called on page-load and every time after the create-hook. + ; element: The element to initialize. + create [JQuery-Object] (type, tagName, data) - gets called when a new HTML-instance needs to get created. + ; type: A string that identifies the plugin itself within this Settings-instance if set as data-type. + ; tagName: The tag-name that gets requested. + ; data: Additional data, plugin-dependent meaning. + destruct [void] (element) - gets called after a HTML-instance got removed from DOM + ; element: The element that got removed. + set [void] (element, value, trim) - gets called when the value of the element should be set to the given value. + ; element: The element to set its value. + ; value: The value to set. + ; trim: Whether the value is considered as trimmed. + get [value] (element, trim, empty) - gets called when the value of the given instance is needed. + ; element: The element to get its value. + ; trim: Whether the result should be trimmed. + ; empty: Whether considered as empty values should get saved too. + All passed elements are JQuery-Objects. + @param service The plugin to register. + @param types The types to bind the plugin to. + */ + registerPlugin: function (service, types) { + if (types == null) { + types = service.types; + } else { + service.types = types; + } + if (typeof service.use === 'function') { + service.use.call(Settings); + } + for (var i = 0; i < types.length; i++) { + var type = types[i].toLowerCase(); + if (Settings.plugins[type] == null) { + Settings.plugins[type] = service; + } + } + }, + /** + Sets the settings to given ones, resets the fields within given wrapper and saves the settings server-side. + @param hash The hash to use as settings-id. + @param settings The settings to set. + @param wrapper The wrapper-element to find settings within. + @param callback The callback to call when done. + @param notify Whether to send notification when settings got saved. + */ + set: function (hash, settings, wrapper, callback, notify) { + if (notify == null) { + notify = true; + } + helper.whenReady(function () { + helper.use(settings); + helper.initFields(wrapper || 'form'); + helper.persistSettings(hash, settings, notify, callback); + }); + }, + /** + Fetches the settings from server and calls {@link Settings.helper.initFields} once the settings are ready. + @param hash The hash to use as settings-id. + @param wrapper The wrapper-element to set settings within. + @param callback The callback to call when done. + */ + sync: function (hash, wrapper, callback) { + socket.emit('admin.settings.get', { + hash: hash + }, function (err, values) { + if (err) { + console.log('[settings] Unable to load settings for hash: ', hash); + if (typeof callback === 'function') { + callback(err); + } + } else { + helper.whenReady(function () { + helper.use(values); + helper.initFields(wrapper || 'form'); + if (typeof callback === 'function') { + callback(); + } + }); + } + }); + }, + /** + Reads the settings from fields and saves them server-side. + @param hash The hash to use as settings-id. + @param wrapper The wrapper-element to find settings within. + @param callback The callback to call when done. + @param notify Whether to send notification when settings got saved. + */ + persist: function (hash, wrapper, callback, notify) { + var notSaved = [], + fields = $('[data-key]', wrapper || 'form').toArray(); + if (notify == null) { + notify = true; + } + for (var i = 0; i < fields.length; i++) { + var field = $(fields[i]), + value = helper.readValue(field), + parentCfg = Settings.get(), + keyParts = field.data('key').split('.'), + lastKey = keyParts[keyParts.length - 1]; + if (keyParts.length > 1) { + for (var j = 0; j < keyParts.length - 1; j++) { + var part = keyParts[j]; + if (part && parentCfg != null) { + parentCfg = parentCfg[part]; + } + } + } + if (parentCfg != null) { + if (value != null) { + parentCfg[lastKey] = value; + } else { + delete parentCfg[lastKey]; + } + } else { + notSaved.push(field.data('key')); + } + } + if (notSaved.length) { + app.alert({ + title: 'Attributes Not Saved', + message: "'" + (notSaved.join(', ')) + "' could not be saved. Please contact the plugin-author!", + type: 'danger', + timeout: 5000 + }); + } + helper.persistSettings(hash, Settings.cfg, notify, callback); + }, + load: function (hash, formEl, callback) { + socket.emit('admin.settings.get', { + hash: hash + }, function (err, values) { + if (!err) { + $(formEl).deserialize(values); + if (typeof callback === 'function') { + callback(); + } + } else { + console.log('[settings] Unable to load settings for hash: ', hash); + } + }); + }, + save: function (hash, formEl, callback) { + formEl = $(formEl); + if (formEl.length) { + var values = formEl.serializeObject(); + // "Fix" checkbox values, so that unchecked options are not omitted + formEl.find('input[type="checkbox"]').each(function (idx, inputEl) { + inputEl = $(inputEl); + if (!inputEl.is(':checked')) { + values[inputEl.attr('id')] = 'off'; + } + }); + socket.emit('admin.settings.set', { + hash: hash, + values: values + }, function (err) { + app.alert({ + title: 'Settings Saved', + type: 'success', + timeout: 2500 + }); + if (typeof callback === 'function') { + callback(); + } + }); + } else { + console.log('[settings] Form not found.'); + } + } + }; + + + helper.registerReadyJobs(1); + require(DEFAULT_PLUGINS, function () { + for (var i = 0; i < arguments.length; i++) { + Settings.registerPlugin(arguments[i]); + } + helper.beforeReadyJobsDecreased(); + }); + return Settings; + }); diff --git a/public/src/modules/settings/array.js b/public/src/modules/settings/array.js new file mode 100644 index 0000000000..eb511b9f7a --- /dev/null +++ b/public/src/modules/settings/array.js @@ -0,0 +1,147 @@ +define(function () { + + var Settings = null, + SettingsArray, + helper = null; + + /** + Creates a new button that removes itself and the given elements on click. + Calls {@link Settings.helper.destructElement} for each given field. + @param elements The elements to remove on click. + @returns JQuery The created remove-button. + */ + function createRemoveButton(elements) { + var rm = $(helper.createElement('button', { + "class": 'btn btn-xs btn-primary remove', + title: 'Remove Item' + }, '-')); + rm.click(function (event) { + event.preventDefault(); + elements.remove(); + rm.remove(); + elements.each(function (i, element) { + element = $(element); + if (element.is('[data-key]')) { + helper.destructElement(element); + } + }); + }); + return rm; + } + + /** + Creates a new child-element of given field with given data and calls given callback with elements to add. + @param field Any wrapper that contains all fields of the array. + @param key The key of the array. + @param attributes The attributes to call {@link Settings.helper.createElementOfType} with or to add as + element-attributes. + @param value The value to call {@link Settings.helper.fillField} with. + @param separator The separator to use. + @param insertCb The callback to insert the elements. + */ + function addArrayChildElement(field, key, attributes, value, separator, insertCb) { + attributes = helper.deepClone(attributes); + var type = attributes['data-type'] || attributes.type || 'text', + element = $(helper.createElementOfType(type, attributes.tagName, attributes)); + element.attr('data-parent', '_' + key); + delete attributes['data-type']; + delete attributes['tagName']; + for (var name in attributes) { + var val = attributes[name]; + if (name.search('data-') === 0) { + element.data(name.substring(5), val); + } else if (name.search('prop-') === 0) { + element.prop(name.substring(5), val); + } else { + element.attr(name, val); + } + } + helper.fillField(element, value); + if ($("[data-parent=\"_" + key + "\"]", field).length) { + insertCb(separator); + } + insertCb(element); + insertCb(createRemoveButton(element.add(separator))); + } + + /** + Adds a new button that adds a new child-element to given element on click. + @param element The element to insert the button. + @param key The key to forward to {@link addArrayChildElement}. + @param attributes The attributes to forward to {@link addArrayChildElement}. + @param separator The separator to forward to {@link addArrayChildElement}. + */ + function addAddButton(element, key, attributes, separator) { + var addSpace = $(document.createTextNode(' ')), + newValue = element.data('new') || '', + add = $(helper.createElement('button', { + "class": 'btn btn-sm btn-primary add', + title: 'Expand Array' + }, '+')); + add.click(function (event) { + event.preventDefault(); + addArrayChildElement(element, key, attributes, newValue, separator.clone(), function (el) { + addSpace.before(el); + }); + }); + element.append(addSpace); + element.append(add); + } + + + SettingsArray = { + types: ['array', 'div'], + use: function () { + helper = (Settings = this).helper; + }, + create: function (ignored, tagName) { + return helper.createElement(tagName || 'div'); + }, + set: function (element, value) { + var attributes = element.data('attributes'), + key = element.data('key') || element.data('parent'), + separator = element.data('split') || ', '; + separator = (function () { + try { + return $(separator); + } catch (_error) { + return $(document.createTextNode(separator)); + } + })(); + if (typeof attributes !== 'object') { + attributes = {}; + } + element.empty(); + if (!(value instanceof Array)) { + value = []; + } + for (var i = 0; i < value.length; i++) { + addArrayChildElement(element, key, attributes, value[i], separator.clone(), function (el) { + element.append(el); + }); + } + addAddButton(element, key, attributes, separator); + }, + get: function (element, trim, empty) { + var key = element.data('key') || element.data('parent'), + children = $("[data-parent=\"_" + key + "\"]", element), + values = []; + children.each(function (i, child) { + child = $(child); + var val = helper.readValue(child), + empty = helper.isTrue(child.data('empty')); + if (empty || val !== void 0 && (val == null || val.length !== 0)) { + return values.push(val); + } + }); + if (empty || values.length) { + return values; + } else { + return void 0; + } + } + }; + + return SettingsArray; + +}); diff --git a/public/src/modules/settings/checkbox.js b/public/src/modules/settings/checkbox.js new file mode 100644 index 0000000000..98d8767417 --- /dev/null +++ b/public/src/modules/settings/checkbox.js @@ -0,0 +1,36 @@ +define(function () { + + var Settings = null, + SettingsCheckbox; + + SettingsCheckbox = { + types: ['checkbox'], + use: function () { + Settings = this; + }, + create: function () { + return Settings.helper.createElement('input', { + type: 'checkbox' + }); + }, + set: function (element, value) { + element.prop('checked', value); + }, + get: function (element, trim, empty) { + var value = element.prop('checked'); + if (value == null) { + return void 0; + } + if (empty) { + return value || void 0; + } + if (trim) { + return value ? 1 : 0; + } + return value; + } + }; + + return SettingsCheckbox; + +}); diff --git a/public/src/modules/settings/key.js b/public/src/modules/settings/key.js new file mode 100644 index 0000000000..d405b65cf5 --- /dev/null +++ b/public/src/modules/settings/key.js @@ -0,0 +1,221 @@ +define(function () { + + var Settings = null, + SettingsKey, + helper = null, + lastKey = null, + oldKey = null, + keyMap = Object.freeze({ + 0: '', + 8: 'Backspace', + 9: 'Tab', + 13: 'Enter', + 27: 'Escape', + 32: 'Space', + 37: 'Left', + 38: 'Up', + 39: 'Right', + 40: 'Down', + 45: 'Insert', + 46: 'Delete', + 187: '=', + 189: '-', + 190: '.', + 191: '/', + 219: '[', + 220: '\\', + 221: ']' + }); + + function Key() { + this.c = false; + this.a = false; + this.s = false; + this.m = false; + this.code = 0; + this.char = ''; + } + + /** + Returns either a Key-Object representing the given event or null if only modification-keys got released. + @param event The event to inspect. + @returns Key | null The Key-Object the focused element should be set to. + */ + function getKey(event) { + var anyModChange = event.ctrlKey !== lastKey.c || event.altKey !== lastKey.a || event.shiftKey !== lastKey.s || event.metaKey !== lastKey.m, + modChange = event.ctrlKey + event.altKey + event.shiftKey + event.metaKey - lastKey.c - lastKey.a - lastKey.s - lastKey.m, + key = new Key(); + key.c = event.ctrlKey; + key.a = event.altKey; + key.s = event.shiftKey; + key.m = event.metaKey; + lastKey = key; + if (anyModChange) { + if (modChange < 0) { + return null; + } + key.code = oldKey.code; + key.char = oldKey.char; + } else { + key.code = event.which; + key.char = convertKeyCodeToChar(key.code); + } + return oldKey = key; + } + + /** + Returns the string that represents the given key-code. + @param code The key-code. + @returns String Representation of the given key-code. + */ + function convertKeyCodeToChar(code) { + code = +code; + if (code === 0) { + return ''; + } else if (code >= 48 && code <= 90) { + return String.fromCharCode(code).toUpperCase(); + } else if (code >= 112 && code <= 123) { + return "F" + (code - 111); + } else { + return keyMap[code] || ("#" + code); + } + } + + /** + Returns a string to identify a Key-Object. + @param key The Key-Object that should get identified. + @param human Whether to show 'Enter a key' when key-char is empty. + @param short Whether to shorten modification-names to first character. + @param separator The separator between modification-names and key-char. + @returns String The string to identify the given key-object the given way. + */ + function getKeyString(key, human, short, separator) { + var str = ''; + if (!(key instanceof Key)) { + return str; + } + if (!key.char) { + if (human) { + return 'Enter a key'; + } else { + return ''; + } + } + if (!separator || /CtrlAShifMea#/.test(separator)) { + separator = human ? ' + ' : '+'; + } + if (key.c) { + str += (short ? 'C' : 'Ctrl') + separator; + } + if (key.a) { + str += (short ? 'A' : 'Alt') + separator; + } + if (key.s) { + str += (short ? 'S' : 'Shift') + separator; + } + if (key.m) { + str += (short ? 'M' : 'Meta') + separator; + } + return str + (human ? key.char : key.code ? '#' + key.code : ''); + } + + /** + Parses the given string into a Key-Object. + @param str The string to parse. + @returns Key The Key-Object that got identified by the given string. + */ + function getKeyFromString(str) { + if (str instanceof Key) { + return str; + } + var key = new Key(), + sep = /([^CtrlAShifMea#\d]+)(?:#|\d)/.exec(str), + parts = sep != null ? str.split(sep[1]) : [str]; + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + switch (part) { + case 'C': + case 'Ctrl': + key.c = true; + break; + case 'A': + case 'Alt': + key.a = true; + break; + case 'S': + case 'Shift': + key.s = true; + break; + case 'M': + case 'Meta': + key.m = true; + break; + default: + var num = /\d+/.exec(part); + if (num != null) { + key.code = num[0]; + } + key.char = convertKeyCodeToChar(key.code); + } + } + return key; + } + + function handleEvent(element, event) { + event = event || window.event; + event.which = event.which || event.keyCode || event.key; + var key = getKey(event); + if (key != null) { + SettingsKey.set(element, key); + } + } + + + SettingsKey = { + types: ['key'], + use: function () { + helper = (Settings = this).helper; + }, + init: function (element) { + element.focus(function () { + oldKey = element.data('keyData') || new Key(); + lastKey = new Key(); + }).keydown(function (event) { + event.preventDefault(); + handleEvent(element, event); + }).keyup(function (event) { + handleEvent(element, event); + }); + return element; + }, + set: function (element, value) { + var key = getKeyFromString(value || ''); + element.data('keyData', key); + if (key.code) { + element.removeClass('alert-danger'); + } else { + element.addClass('alert-danger'); + } + element.val(getKeyString(key, true, false, ' + ')); + }, + get: function (element, trim, empty) { + var key = element.data('keyData'), + separator = element.data('split') || element.data('separator') || '+', + short = !helper.isFalse(element.data('short')); + if (trim) { + if (empty || (key != null && key.char)) { + return getKeyString(key, false, short, separator); + } else { + return void 0; + } + } else if (empty || (key != null && key.code)) { + return key; + } else { + return void 0; + } + } + }; + + return SettingsKey; + +}); diff --git a/public/src/modules/settings/select.js b/public/src/modules/settings/select.js new file mode 100644 index 0000000000..9ccff8ccb7 --- /dev/null +++ b/public/src/modules/settings/select.js @@ -0,0 +1,49 @@ +define(function () { + + var Settings = null, + SettingsSelect; + + function addOptions(element, options) { + for (var i = 0; i < options.length; i++) { + var optionData = options[i], + value = optionData.text || optionData.value; + delete optionData.text; + element.append($(Settings.helper.createElement('option', optionData)).text(value)); + } + } + + + SettingsSelect = { + types: ['select'], + use: function () { + Settings = this; + }, + create: function (ignore, ignored, data) { + var element = $(Settings.helper.createElement('select')); + // prevent data-options from being attached to DOM + addOptions(element, data['data-options']); + delete data['data-options']; + return element; + }, + init: function (element) { + var options = element.data('options'); + if (options != null) { + addOptions(element, options); + } + }, + set: function (element, value) { + element.val(value || ''); + }, + get: function (element, ignored, empty) { + var value = element.val(); + if (empty || value) { + return value; + } else { + return void 0; + } + } + }; + + return SettingsSelect; + +}); diff --git a/public/src/modules/settings/textarea.js b/public/src/modules/settings/textarea.js new file mode 100644 index 0000000000..ceeca49f99 --- /dev/null +++ b/public/src/modules/settings/textarea.js @@ -0,0 +1,35 @@ +define(function () { + + var Settings = null, + SettingsArea; + + SettingsArea = { + types: ['textarea'], + use: function () { + Settings = this; + }, + create: function () { + return Settings.helper.createElement('textarea'); + }, + set: function (element, value, trim) { + if (trim && value != null && typeof value.trim === 'function') { + value = value.trim(); + } + element.val(value || ''); + }, + get: function (element, trim, empty) { + var value = element.val(); + if (trim) { + value = value == null ? void 0 : value.trim(); + } + if (empty || value) { + return value; + } else { + return void 0; + } + } + }; + + return SettingsArea; + +}); diff --git a/public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css b/public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css index 649a89920d..1c180dd732 100644 --- a/public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css +++ b/public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css @@ -1,7 +1,7 @@ -/*! jQuery UI - v1.10.4 - 2014-05-01 +/*! jQuery UI - v1.10.4 - 2014-05-02 * http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.autocomplete.css, jquery.ui.datepicker.css, jquery.ui.menu.css, jquery.ui.theme.css +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.autocomplete.css, jquery.ui.datepicker.css, jquery.ui.menu.css, jquery.ui.theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ -.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.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,.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}.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,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.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,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-widget{font-family: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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% 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:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.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}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.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_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.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-on{background-position:-96px -144px}.ui-icon-radio-off{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{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}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.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,.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}.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,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.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,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-widget{font-family: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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% 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:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.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}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.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_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.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-on{background-position:-96px -144px}.ui-icon-radio-off{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{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}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/public/vendor/jquery/js/jquery-ui-1.10.4.custom.js b/public/vendor/jquery/js/jquery-ui-1.10.4.custom.js index 34ae2a6482..60eb942eb2 100644 --- a/public/vendor/jquery/js/jquery-ui-1.10.4.custom.js +++ b/public/vendor/jquery/js/jquery-ui-1.10.4.custom.js @@ -1,7 +1,7 @@ -/*! jQuery UI - v1.10.4 - 2014-05-01 +/*! jQuery UI - v1.10.4 - 2014-05-02 * http://jqueryui.com -* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.sortable.js, jquery.ui.autocomplete.js, jquery.ui.datepicker.js, jquery.ui.menu.js +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.sortable.js, jquery.ui.autocomplete.js, jquery.ui.datepicker.js, jquery.ui.menu.js * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ -(function(e,t){function i(t,i){var s,a,o,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,a=s.name,t.href&&a&&"map"===s.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&n(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,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,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,a=e(this[0]);a.length&&a[0]!==document;){if(n=a.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(a.css("zIndex"),10),!isNaN(s)&&0!==s))return s;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===n?["Left","Right"]:["Top","Bottom"],o=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(o,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(o,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,a=e.ui[t].prototype;for(s in n)a.plugins[s]=a.plugins[s]||[],a.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix||i:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})})(jQuery);(function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("
"),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widths?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(l.horizontal="center"),d>g&&g>r(n+a)&&(l.vertical="middle"),l.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,l)}),c.offset(t.extend(M,{using:h}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-o-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-o-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-o-a,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(t){t.widget("ui.draggable",t.ui.mouse,{version:"1.10.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(t(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){t("
").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(t(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_mouseDrag:function(e,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||t.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1):!1},_mouseUp:function(e){return t("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.element.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,t(document).width()-this.helperProportions.width-this.margins.left,(t(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(e){var i,s,n,a,o=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=e.pageX,h=e.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,l=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s]),"drag"===e&&(this.positionAbs=this._convertPositionTo("absolute")),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i){var s=t(this).data("ui-draggable"),n=s.options,a=t.extend({},i,{item:s.element});s.sortables=[],t(n.connectToSortable).each(function(){var i=t.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",e,a))})},stop:function(e,i){var s=t(this).data("ui-draggable"),n=t.extend({},i,{item:s.element});t.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(e),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",e,n))})},drag:function(e,i){var s=t(this).data("ui-draggable"),n=this;t.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,t.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&t.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=t(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},e.target=this.instance.currentItem[0],this.instance._mouseCapture(e,!0),this.instance._mouseStart(e,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",e),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(e)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",e,this.instance._uiHash(this.instance)),this.instance._mouseStop(e,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",e),s.dropped=!1)})}}),t.ui.plugin.add("draggable","cursor",{start:function(){var e=t("body"),i=t(this).data("ui-draggable").options;e.css("cursor")&&(i._cursor=e.css("cursor")),e.css("cursor",i.cursor)},stop:function(){var e=t(this).data("ui-draggable").options;e._cursor&&t("body").css("cursor",e._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._opacity&&t(i.helper).css("opacity",s._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(){var e=t(this).data("ui-draggable");e.scrollParent[0]!==document&&"HTML"!==e.scrollParent[0].tagName&&(e.overflowOffset=e.scrollParent.offset())},drag:function(e){var i=t(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-e.pageY=0;u--)r=p.snapElements[u].left,l=r+p.snapElements[u].width,h=p.snapElements[u].top,c=h+p.snapElements[u].height,r-f>_||m>l+f||h-f>b||v>c+f||!t.contains(p.snapElements[u].item.ownerDocument,p.snapElements[u].item)?(p.snapElements[u].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=!1):("inner"!==g.snapMode&&(s=f>=Math.abs(h-b),n=f>=Math.abs(c-v),a=f>=Math.abs(r-_),o=f>=Math.abs(l-m),s&&(i.position.top=p._convertPositionTo("relative",{top:h-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c,left:0}).top-p.margins.top),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:l}).left-p.margins.left)),d=s||n||a||o,"outer"!==g.snapMode&&(s=f>=Math.abs(h-v),n=f>=Math.abs(c-b),a=f>=Math.abs(r-m),o=f>=Math.abs(l-_),s&&(i.position.top=p._convertPositionTo("relative",{top:h,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c-p.helperProportions.height,left:0}).top-p.margins.top),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:l-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[u].snapping&&(s||n||a||o||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=s||n||a||o||d)}}),t.ui.plugin.add("draggable","stack",{start:function(){var e,i=this.data("ui-draggable").options,s=t.makeArray(t(i.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});s.length&&(e=parseInt(t(s[0]).css("zIndex"),10)||0,t(s).each(function(i){t(this).css("zIndex",e+i)}),this.css("zIndex",e+s.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._zIndex&&t(i.helper).css("zIndex",s._zIndex)}})})(jQuery);(function(t){function e(t,e,i){return t>e&&e+i>t}t.widget("ui.droppable",{version:"1.10.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],undefined):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},t.ui.ddmanager.droppables[i.scope]=t.ui.ddmanager.droppables[i.scope]||[],t.ui.ddmanager.droppables[i.scope].push(this),i.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var e=0,i=t.ui.ddmanager.droppables[this.options.scope];i.length>e;e++)i[e]===this&&i.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(e,i){"accept"===e&&(this.accept=t.isFunction(i)?i:function(t){return t.is(i)}),t.Widget.prototype._setOption.apply(this,arguments)},_activate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var e=t.data(this,"ui-droppable");return e.options.greedy&&!e.options.disabled&&e.options.scope===s.options.scope&&e.accept.call(e.element[0],s.currentItem||s.element)&&t.ui.intersect(s,t.extend(e,{offset:e.element.offset()}),e.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}}}),t.ui.intersect=function(t,i,s){if(!i.offset)return!1;var n,a,o=(t.positionAbs||t.position.absolute).left,r=(t.positionAbs||t.position.absolute).top,l=o+t.helperProportions.width,h=r+t.helperProportions.height,c=i.offset.left,u=i.offset.top,d=c+i.proportions().width,p=u+i.proportions().height;switch(s){case"fit":return o>=c&&d>=l&&r>=u&&p>=h;case"intersect":return o+t.helperProportions.width/2>c&&d>l-t.helperProportions.width/2&&r+t.helperProportions.height/2>u&&p>h-t.helperProportions.height/2;case"pointer":return n=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,a=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,e(a,u,i.proportions().height)&&e(n,c,i.proportions().width);case"touch":return(r>=u&&p>=r||h>=u&&p>=h||u>r&&h>p)&&(o>=c&&d>=o||l>=c&&d>=l||c>o&&l>d);default:return!1}},t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,a=t.ui.ddmanager.droppables[e.options.scope]||[],o=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||e&&!a[s].accept.call(a[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue t}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&t.ui.intersect(e,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").bind("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=t.ui.intersect(e,this,this.options.tolerance),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return t.data(this,"ui-droppable").options.scope===n}),a.length&&(s=t.data(a[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").unbind("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}}})(jQuery);(function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t(" ",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})})(jQuery);(function(e){e.widget("ui.autocomplete",{version:"1.10.4",defaultElement:"",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,undefined;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:case a.NUMPAD_ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),undefined):(this._searchTimeout(e),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(e),this._change(e),undefined)}}),this._initSource(),this.menu=e("