From ccd47590d53f7acf6f6e7066a4431f9cb9157ef4 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Tue, 7 May 2019 10:58:35 +0200 Subject: [PATCH] added log_filter contrib module --- .../contrib/admin/log_filter/CHANGELOG.txt | 211 + .../contrib/admin/log_filter/COPYRIGHT.txt | 18 + .../contrib/admin/log_filter/LICENSE.txt | 339 ++ .../contrib/admin/log_filter/LogFilter.inc | 1989 +++++++++ .../log_filter/admin/log_filter.admin.css | 12 + .../log_filter/admin/log_filter.admin.inc | 108 + .../admin/log_filter/css/img/log-16-alert.png | Bin 0 -> 807 bytes .../log_filter/css/img/log-16-critical.png | Bin 0 -> 808 bytes .../log_filter/css/img/log-16-emergency.png | Bin 0 -> 803 bytes .../admin/log_filter/css/img/log-16-error.png | Bin 0 -> 519 bytes .../admin/log_filter/css/img/log-16-info.png | Bin 0 -> 733 bytes .../log_filter/css/img/log-16-notice.png | Bin 0 -> 442 bytes .../log_filter/css/img/log-16-warning.png | Bin 0 -> 567 bytes .../log_filter/css/img/message-16-error.png | Bin 0 -> 519 bytes .../log_filter/css/img/message-16-help.png | Bin 0 -> 668 bytes .../log_filter/css/img/message-16-info.png | Bin 0 -> 733 bytes .../log_filter/css/img/message-16-ok.png | Bin 0 -> 639 bytes .../log_filter/css/img/message-16-warning.png | Bin 0 -> 442 bytes .../admin/log_filter/css/log_filter.css | 829 ++++ .../admin/log_filter/css/log_filter.min.css | 1 + .../jquery-ui-i18n.min.js | 5 + .../jquery.ui.datepicker-af.min.js | 5 + .../jquery.ui.datepicker-ar-DZ.min.js | 5 + .../jquery.ui.datepicker-ar.min.js | 5 + .../jquery.ui.datepicker-az.min.js | 5 + .../jquery.ui.datepicker-bg.min.js | 5 + .../jquery.ui.datepicker-bs.min.js | 5 + .../jquery.ui.datepicker-ca.min.js | 5 + .../jquery.ui.datepicker-cs.min.js | 5 + .../jquery.ui.datepicker-cy-GB.min.js | 5 + .../jquery.ui.datepicker-da.min.js | 5 + .../jquery.ui.datepicker-de.min.js | 5 + .../jquery.ui.datepicker-el.min.js | 5 + .../jquery.ui.datepicker-en-AU.min.js | 5 + .../jquery.ui.datepicker-en-GB.min.js | 5 + .../jquery.ui.datepicker-en-NZ.min.js | 5 + .../jquery.ui.datepicker-en.min.js | 5 + .../jquery.ui.datepicker-eo.min.js | 5 + .../jquery.ui.datepicker-es.min.js | 5 + .../jquery.ui.datepicker-et.min.js | 5 + .../jquery.ui.datepicker-eu.min.js | 5 + .../jquery.ui.datepicker-fa.min.js | 5 + .../jquery.ui.datepicker-fi.min.js | 5 + .../jquery.ui.datepicker-fo.min.js | 5 + .../jquery.ui.datepicker-fr-CH.min.js | 5 + .../jquery.ui.datepicker-fr.min.js | 5 + .../jquery.ui.datepicker-gl.min.js | 5 + .../jquery.ui.datepicker-he.min.js | 5 + .../jquery.ui.datepicker-hi.min.js | 5 + .../jquery.ui.datepicker-hr.min.js | 5 + .../jquery.ui.datepicker-hu.min.js | 5 + .../jquery.ui.datepicker-hy.min.js | 5 + .../jquery.ui.datepicker-id.min.js | 5 + .../jquery.ui.datepicker-is.min.js | 5 + .../jquery.ui.datepicker-it.min.js | 5 + .../jquery.ui.datepicker-ja.min.js | 5 + .../jquery.ui.datepicker-ka.min.js | 5 + .../jquery.ui.datepicker-kk.min.js | 5 + .../jquery.ui.datepicker-km.min.js | 5 + .../jquery.ui.datepicker-ko.min.js | 5 + .../jquery.ui.datepicker-lb.min.js | 5 + .../jquery.ui.datepicker-lt.min.js | 5 + .../jquery.ui.datepicker-lv.min.js | 5 + .../jquery.ui.datepicker-mk.min.js | 5 + .../jquery.ui.datepicker-ml.min.js | 5 + .../jquery.ui.datepicker-ms.min.js | 5 + .../jquery.ui.datepicker-nl-BE.min.js | 5 + .../jquery.ui.datepicker-nl.min.js | 5 + .../jquery.ui.datepicker-no.min.js | 5 + .../jquery.ui.datepicker-pl.min.js | 5 + .../jquery.ui.datepicker-pt-BR.min.js | 5 + .../jquery.ui.datepicker-pt.min.js | 5 + .../jquery.ui.datepicker-rm.min.js | 5 + .../jquery.ui.datepicker-ro.min.js | 5 + .../jquery.ui.datepicker-ru.min.js | 5 + .../jquery.ui.datepicker-sk.min.js | 5 + .../jquery.ui.datepicker-sl.min.js | 5 + .../jquery.ui.datepicker-sq.min.js | 5 + .../jquery.ui.datepicker-sr-SR.min.js | 5 + .../jquery.ui.datepicker-sr.min.js | 5 + .../jquery.ui.datepicker-sv.min.js | 5 + .../jquery.ui.datepicker-ta.min.js | 5 + .../jquery.ui.datepicker-th.min.js | 5 + .../jquery.ui.datepicker-tj.min.js | 5 + .../jquery.ui.datepicker-tr.min.js | 5 + .../jquery.ui.datepicker-uk.min.js | 5 + .../jquery.ui.datepicker-vi.min.js | 5 + .../jquery.ui.datepicker-zh-CN.min.js | 5 + .../jquery.ui.datepicker-zh-HK.min.js | 5 + .../jquery.ui.datepicker-zh-TW.min.js | 5 + .../contrib/admin/log_filter/js/log_filter.js | 2932 ++++++++++++++ .../admin/log_filter/js/log_filter.min.js | 1063 +++++ .../contrib/admin/log_filter/log_filter.info | 17 + .../admin/log_filter/log_filter.install | 200 + .../admin/log_filter/log_filter.module | 181 + .../release_notes/release_notes_7.x-1.0.txt | 9 + .../release_notes/release_notes_7.x-y.z.txt | 14 + sites/all/modules/contrib/judy/CHANGELOG.txt | 196 + sites/all/modules/contrib/judy/COPYRIGHT.txt | 18 + sites/all/modules/contrib/judy/LICENSE.txt | 339 ++ sites/all/modules/contrib/judy/judy.css | 68 + sites/all/modules/contrib/judy/judy.info | 13 + sites/all/modules/contrib/judy/judy.js | 3562 +++++++++++++++++ sites/all/modules/contrib/judy/judy.min.css | 1 + sites/all/modules/contrib/judy/judy.min.js | 877 ++++ sites/all/modules/contrib/judy/judy.module | 55 + 106 files changed, 13402 insertions(+) create mode 100644 sites/all/modules/contrib/admin/log_filter/CHANGELOG.txt create mode 100644 sites/all/modules/contrib/admin/log_filter/COPYRIGHT.txt create mode 100644 sites/all/modules/contrib/admin/log_filter/LICENSE.txt create mode 100644 sites/all/modules/contrib/admin/log_filter/LogFilter.inc create mode 100644 sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.css create mode 100644 sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.inc create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-alert.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-critical.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-emergency.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-error.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-info.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-notice.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/log-16-warning.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/message-16-error.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/message-16-help.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/message-16-info.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/message-16-ok.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/img/message-16-warning.png create mode 100644 sites/all/modules/contrib/admin/log_filter/css/log_filter.css create mode 100644 sites/all/modules/contrib/admin/log_filter/css/log_filter.min.css create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery-ui-i18n.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-af.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar-DZ.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-az.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bg.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bs.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ca.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cs.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cy-GB.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-da.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-de.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-el.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-AU.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-GB.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-NZ.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eo.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-es.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-et.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eu.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fa.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fi.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fo.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr-CH.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-gl.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-he.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hi.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hr.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hu.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hy.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-id.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-is.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-it.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ja.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ka.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-kk.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-km.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ko.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lb.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lt.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lv.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-mk.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ml.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ms.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl-BE.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-no.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pl.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt-BR.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-rm.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ro.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ru.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sk.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sl.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sq.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr-SR.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sv.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ta.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-th.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tj.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tr.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-uk.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-vi.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-CN.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-HK.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-TW.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/log_filter.js create mode 100644 sites/all/modules/contrib/admin/log_filter/js/log_filter.min.js create mode 100644 sites/all/modules/contrib/admin/log_filter/log_filter.info create mode 100644 sites/all/modules/contrib/admin/log_filter/log_filter.install create mode 100644 sites/all/modules/contrib/admin/log_filter/log_filter.module create mode 100644 sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-1.0.txt create mode 100644 sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-y.z.txt create mode 100644 sites/all/modules/contrib/judy/CHANGELOG.txt create mode 100644 sites/all/modules/contrib/judy/COPYRIGHT.txt create mode 100755 sites/all/modules/contrib/judy/LICENSE.txt create mode 100644 sites/all/modules/contrib/judy/judy.css create mode 100644 sites/all/modules/contrib/judy/judy.info create mode 100644 sites/all/modules/contrib/judy/judy.js create mode 100644 sites/all/modules/contrib/judy/judy.min.css create mode 100644 sites/all/modules/contrib/judy/judy.min.js create mode 100644 sites/all/modules/contrib/judy/judy.module diff --git a/sites/all/modules/contrib/admin/log_filter/CHANGELOG.txt b/sites/all/modules/contrib/admin/log_filter/CHANGELOG.txt new file mode 100644 index 00000000..f2ee2717 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/CHANGELOG.txt @@ -0,0 +1,211 @@ +log_filter 7.x-1.x, 2014-11-08 +------------------------------ +* Release 7.x-1.4. + +log_filter 7.x-1.x, 2014-11-07 +------------------------------ +* Don't display entries of type 'log_filter delete logs' unless, unless user actually want to see log deletions. +* Fixed that 'log_filter delete logs' actually _were_ deletable, due to wrong removal of that filter deleting. + +log_filter 7.x-1.x, 2014-10-31 +------------------------------ +* Release 7.x-1.3. + +log_filter 7.x-1.x, 2014-07-14 +------------------------------ +* Use Drupal's JS API to attach behaviours. + +log_filter 7.x-1.2, 2014-04-27 +-------------------------------------------------- +* Released. + +log_filter 7.x-1.x, 2014-04-27 +------------------------------ +* Added styling of jQuery UI dialog close button, for later versions of jQuery UI (jquery_update module support). +* Removed meaningless url = url JS expression. +* Fixed that jQuery >=1.9 has no browser property (~ jquery_update module support). + +log_filter 7.x-1.x, 2014-04-24 +------------------------------ +* Fixed that sites using jQuery >v1.4.4 continually get 'form outdated' in the log viewer, due to AJAX http status 403 errors (issue 2073905). + +log_filter 7.x-1.x, 2013-09-01 +------------------------------ +* Increase log_filter's module weight to 10; the module's hook_menu() must be invoked _after_ dblog's ditto. +* Do only add dblog's viewer as menu tab if that module is enabled. + +log_filter 7.x-1.1, 2013-07-21 +-------------------------------------------------- +* Released. + +log_filter 7.x-1.x, 2013-07-21 +------------------------------ +* Now uses Judy.ajaxcomplete instead of own custom ditto. +* Fixed username autocomplete result ordering. + +log_filter 7.x-1.x, 2013-07-20 +------------------------------ +* Removed small viewport (<1136 px wide) css support. +* Removed AJAX callback form_token check, because provides little additional security, and is no good for GET requests. +* Implemented searching by user name. + +log_filter 7.x-1.0, 2013-07-04 +-------------------------------------------------- +* Released. + +log_filter 7.x-1.x, 2013-07-04 +------------------------------ +* Frontend now checks that the Judy library exists and has version 2.0+. + +log_filter 7.x-1.x, 2013-06-29 +------------------------------ +* Prevent deletion of events that log log deletion. +* Fixed defaults of settings variables. +* Moved filter delete button to prevent mix-up with delete logs button. +* Added overlay when user goes from one filter to another. +* Increased max allowed value of time_range to 9999 (from 1000). +* Removed menu option; Log Filter now always takes over dblog's menu item, and adds dblog's view as a tab instead. +* Install now inserts some default filters. + +log_filter 7.x-1.x, 2013-06-28 +------------------------------ +* Don't show filter by event message when validation fails. + +log_filter 7.x-1.x, 2013-06-27 +------------------------------ +* Time date is allowed to be the same for From as well as To, regardless of the time values. +* Implemented set filter condition by event column feature. + +log_filter 7.x-1.x, 2013-06-25 +------------------------------ +* Added support for Inspect output folding/formatting. + +log_filter 7.x-1.x, 2013-06-24 +------------------------------ +* Made sure, for backend db queries, that there's a max when there's an offset. +* Fixed deletion of zero events. +* Fixed pager display for when current offset is out of range of total matched events. +* Frontend translation error. +* Made text in log list table selectable (preventing dialog pop after dragging mouse). +* Made log deletion feed back messages fade. + +log_filter 7.x-1.x, 2013-06-23 +------------------------------ +* Log deletion offset and max now reflects equivalent of current log list. + +log_filter 7.x-1.x, 2013-06-22 +------------------------------ +* Implemented proxy type condition field, to prevent 'Illegal choice' errors for checklist due to dynamic options range. +* Paging done. + +log_filter 7.x-1.x, 2013-06-20 +------------------------------ +* Use admin theme on log view pages (unless that setting is turned off). +* Renamed module css default variable. +* Now removes clear log form from standard dblog log view page. +* Filter name from url now requires non-digit as first character, and at least 2 chars length. +* Now allows for overwriting existing filter; implemented using non-AJAX request. +* Fixed bug in type_some handler; failed to notice change in criteria if unchecking an option. +* The update list buttons are no longer being disabled (no need for that anymore because the list is always AJAXed using current criteria). +* Implemented single event view. + +log_filter 7.x-1.x, 2013-05-25 +------------------------------ +* Implemented log details view. + +log_filter 7.x-1.x, 2013-05-12 +------------------------------ +* Implemented log deletion. + +log_filter 7.x-1.x, 2013-05-01 +------------------------------ +* Get log list. + +log_filter 7.x-1.x, 2013-04-02 +------------------------------ +* Changing a criterion of a stored filter now triggers edit mode, not adhoc mode. + +log_filter 7.x-1.x, 2013-04-01 +------------------------------ +* _listFilters(). + +log_filter 7.x-1.x, 2013-03-28 +------------------------------ +* Saving filters works. +* Implemented standards compliant url GET parameter (filter name) regime. + +log_filter 7.x-1.x, 2013-03-28 +------------------------------ +* Working on saving (creating/updating) filter. + +log_filter 7.x-1.x, 2013-03-26 +------------------------------ +* Now uses singular development branch. +* Implemented use of Judy. + +log_filter 7.x-1.0.x, 2013-03-26 +-------------------------------- +* Removed Inspect module dependency. + +log_filter 7.x-1.0.x, 2013-02-09 +-------------------------------- +* Frontend now strips tags off text fields. + +log_filter 7.x-1.0.x, 2013-02-05 +-------------------------------- +* Finished message box; .showAll() working, and fully documented. + +log_filter 7.x-1.0.x, 2013-02-03 +-------------------------------- +* Frontend now uses inspect.errorHandler(). +* Implemented message box. + +log_filter 7.x-1.0.x, 2013-02-02 +-------------------------------- +* Filter styling done. +* Implemented time fields. + +log_filter 7.x-1.0.x, 2013-01-28 +-------------------------------- +* em-styling to get rid of nauseously complex javascript resizing. + +log_filter 7.x-1.0.x, 2013-01-27 +-------------------------------- +* Filter selector is no longer read-only during create/edit; user is allowed to change filter even in these modes (previous behaviour was too restrictive, instead let the user makes his mistakes and learn). +* Changing filter to default no longer fires a page refresh. +* Implemented 2 update list buttons. +* Lots of visual tweaking. + +log_filter 7.x-1.0.x, 2013-01-27 +-------------------------------- +* Delete logs: don't prompt user for confirmation again if there's a limit, if already prompted for confirmation whilst there was no limit. +* Create filter: names 'default' and 'adhoc' are illegal. +* Worked on setting filter name as url parameter. + +log_filter 7.x-1.0.x, 2013-01-13 +-------------------------------- +* Added role condition. +* Put validation on more condition fields. +* Create filter done. +* Apparantly fixed frontend mode bugs. +* Added delete max. field. +* Log deletion only allowed upon fresh log list update; the log list must reflect the filter. +* Made the first steps toward log deletion - establishing current criteria and setting up confirm()s. + +log_filter 7.x-1.0.x, 2013-01-06 +-------------------------------- +* Removed create mode from viewer form, because that mode is handled solely via AJAX. +* Frontend almost ready, except mode and name get wrong when alternating between create, edit, cancel etc. + +log_filter 7.x-1.0.x, 2013-01-05 +-------------------------------- +* Declared menu items now optionally hide default dblog viewer/remover page. +* Frontend modes seem fully resolved. + +log_filter 7.x-1.0.x, 2013-01-04 +-------------------------------- +* Fronted now use elements directly for DOM and event modifications, instead of css selectors (the selectors only used initially for getting the elements). + +log_filter 7.x-1.0.x, 2012-12-16 +--------------------------- +* Project started. \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/COPYRIGHT.txt b/sites/all/modules/contrib/admin/log_filter/COPYRIGHT.txt new file mode 100644 index 00000000..1b0739ac --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/COPYRIGHT.txt @@ -0,0 +1,18 @@ + +All code of the Drupal module Log Filter (log_filter) is Copyright 2012-2014 Jacob Friis Mathiasen. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program as the file LICENSE.txt; if not, please see +http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +Drupal is a registered trademark of Dries Buytaert. \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/LICENSE.txt b/sites/all/modules/contrib/admin/log_filter/LICENSE.txt new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/contrib/admin/log_filter/LogFilter.inc b/sites/all/modules/contrib/admin/log_filter/LogFilter.inc new file mode 100644 index 00000000..32697f6b --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/LogFilter.inc @@ -0,0 +1,1989 @@ + 1, + // Programmatic errors and wrong use of program. + 'algo' => 100, + 'use' => 101, + // Missing permission. + 'perm_general' => 200, + 'form_expired' => 201, + 'perm_filter_crud' => 202, + 'perm_filter_restricted' => 203, + // Database. + 'db_general' => 500, + // Misc. + 'filter_name_composition' => 1001, + 'filter_name_nonunique' => 1002, + 'filter_doesnt_exist' => 1003, + 'bad_filter_condition' => 1010, + ); + + /** + * Traces and logs via Inspect tracer, or watchdog (no trace). + * + * @param Exception $xc + * @param integer $severity + * - default: WATCHDOG_ERROR + * @return void + */ + protected static function _errorHandler($xc, $severity = WATCHDOG_ERROR) { + if (module_exists('inspect')) { + inspect_trace($xc, array('category' => 'log_filter', 'severity' => $severity)); + } + else { + watchdog( + 'log_filter', + '(' . (int)$xc->getCode() . ') ' . check_plain($xc->getMessage()), + NULL, + $severity + ); + } + } + + /** + * @type array + */ + protected static $_fields = array( + 'settings' => array( + 'only_own', + 'delete_logs_max', + 'translate', + 'pager_range', + ), + 'filter' => array( + 'name', // Hidden. + 'origin', + 'name_suggest', + 'description', + 'require_admin', + ), + 'conditions' => array( + 'time_range', + 'time_from', + 'time_from_proxy', // Skip in actual conditions. + 'time_to', + 'time_to_proxy', // Skip in actual conditions. + 'severity', + 'type_wildcard', // Skip in actual conditions. + 'type', + 'role', // Default in database: -1. + 'uid', // Default in database: -1. + 'hostname', + 'location', + 'referer', + ), + 'order_by' => array( + 'orderby_', + 'descending_', + ), + ); + + /** + * Defines log viewer form and GUI. + * + * @param array $form + * @param array &$form_state + * @return array + */ + public static function viewerForm($form, &$form_state) { + $path = drupal_get_path('module', 'log_filter'); + // Get Judy. + drupal_add_library('judy', 'judy'); + // Get jQuery UI dialog. + drupal_add_library('system', 'ui.dialog'); + // Get jQuery UI datepicker. + drupal_add_library('system', 'ui.datepicker'); + // Get jQuery UI autocomplete for username. + drupal_add_library('system', 'ui.autocomplete'); + // Have to include own datepicker localisation, because it doesnt seem to exist in neither core nor the Date Popup module. + drupal_add_js( + $path . '/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-' . $GLOBALS['language']->language . '.min.js', + array('type' => 'file', 'group' => JS_DEFAULT, 'preprocess' => FALSE, 'every_page' => FALSE) + ); + + // Use the module's default css. + if (($use_module_css = variable_get('log_filter_cssdefault', TRUE))) { + drupal_add_css( + $path . '/css/log_filter' . '.min' . '.css', + array('type' => 'file', 'group' => CSS_DEFAULT, 'preprocess' => FALSE, 'every_page' => FALSE) + ); + } + // Add table header script. + drupal_add_js('misc/tableheader.js'); + + drupal_add_js( + $path . '/js/log_filter' . '.min' . '.js', + array('type' => 'file', 'group' => JS_DEFAULT, 'preprocess' => FALSE, 'every_page' => FALSE) + ); + + try { + $allow_filter_edit = user_access('log_filter edit filters'); + + // Get submitted vars from session, and remove them (for later form build and submission). + $formSubmitted = $session = $settings = $submitted = $messages = NULL; + if (module_exists('state')) { + if (($session = State::sessionGet('module', 'log_filter')) && array_key_exists('submitted', $session)) { + State::sessionRemove('module', 'log_filter', 'submitted'); + State::sessionRemove('module', 'log_filter', 'messages'); + } + } + else { + drupal_session_start(); + if (!empty($_SESSION['module']) && !empty($_SESSION['module']['log_filter'])) { + $session = $_SESSION['module']['log_filter']; + unset($_SESSION['module']['log_filter']['submitted']); + unset($_SESSION['module']['log_filter']['messages']); + } + } + if ($session) { + if (array_key_exists('settings', $session)) { + $settings =& $session['settings']; + } + if (array_key_exists('submitted', $session)) { + $formSubmitted = TRUE; + $submitted =& $session['submitted']; + } + if (array_key_exists('messages', $session)) { + $messages =& $session['messages']; + } + } + + // Get current filter name from url, if any. + $filter_name = $submitted ? $submitted['filter']['name'] : + (($le = strlen($v = arg(self::FILTER_NAME_ARG))) // Deliberately not drupal_...(). + && $le <= 32 + && $v != 'log_filter' && $v != 'default' && $v != 'adhoc' + && preg_match('/^[a-z_][a-z\d_]+$/', $v) ? $v : ''); + + $require_admin = $submitted ? $submitted['filter']['require_admin'] : FALSE; + $user_admin_permission = user_access('log_filter administer'); + + // Get mode: default | adhoc | stored (create|edit|delete_filter aren't allowed at form build). + $mode = $submitted ? $submitted['mode'] : ($filter_name ? 'stored' : 'default'); + + // Stored mode may degrade to default. + if ($mode == 'stored') { + $success = TRUE; + if (!$filter_name) { + throw new Exception('Filter name[' . $filter_name . '] cannot be empty in mode[stored].'); + } + if (!($stored_filter = self::_readFilter($filter_name))) { + $success = FALSE; + if (!$formSubmitted) { // Don't put these errors twice. + if ($stored_filter === FALSE) { + drupal_set_message( + t('The filter \'!name\' doesn\'t exist.', array('!name' => $filter_name)), + 'warning' + ); + } + else { + drupal_set_message( + t('You\'re not allowed to use the filter named \'!name\'.', array('!name' => $filter_name)), + 'warning' + ); + } + } + $mode = 'default'; + } + if ($success) { + $filter = array( + 'origin' => '', + 'description' => $stored_filter['description'], + 'require_admin' => $require_admin = $stored_filter['require_admin'], + ); + $fields_conditions =& self::$_fields['conditions']; + $conditions = array(); + foreach ($fields_conditions as $name) { + switch ($name) { + case 'time_range': + case 'time_from': + case 'time_to': + case 'role': + $conditions[$name] = ($v = $stored_filter[$name]) > 0 ? $v : ''; + case 'uid': + $conditions[$name] = ($v = $stored_filter[$name]) > 0 || $v === '0' || $v === 0 ? $v : ''; + break; + case 'severity': + if (!strlen($v = $stored_filter['severity'])) { // Deliberately not drupal_...(). + $v = array('-1'); + } + else { + $v = str_replace(',0,', ',zero,', ',' . $v . ','); + $v = explode(',', substr($v, 1, strlen($v) - 1)); // Deliberately not drupal_...(). + } + $conditions['severity'] = $v; + break; + case 'type_wildcard': + $conditions['type_wildcard'] = !$stored_filter['type'] ? TRUE : FALSE; + break; + case 'type': + $conditions['type'] = ($v = $stored_filter['type']) ? explode(',', $v) : array(); + break; + case 'time_from_proxy': + case 'time_to_proxy': + // Set by frontend, if non-empty time_from/time_to + $conditions[$name] = ''; + break; + default: + $conditions[$name] = $stored_filter[$name]; + } + } + unset($fields_conditions); + $order_by = array(); + if (($v = $stored_filter['order_by'])) { + $le = count($arr = explode(',', $v)); + for ($i = 0; $i < $le; $i++) { + $v = explode(':', $arr[$i]); + $order_by[] = array( + $v[0], + $v[1] == 'DESC' // ~ To boolean. + ); + } + } + $title = $filter_name . (($v = $filter['description']) ? (' - ' . $v . '') : ''); + } + else { + $mode = 'default'; + $filter_name = 'default'; + } + unset($stored_filter); + } + // Do other modes. + switch ($mode) { + case 'default': + $filter = array( + 'origin' => '', + 'description' => '', + 'require_admin' => FALSE, + ); + $fields_conditions =& self::$_fields['conditions']; + $conditions = array(); + foreach ($fields_conditions as $name) { + switch ($name) { + case 'severity': + $conditions[$name] = array('-1'); + break; + case 'type_wildcard': + $conditions[$name] = TRUE; + break; + case 'type': + $conditions[$name] = array(); + break; + default: + $conditions[$name] = ''; + } + } + unset($fields_conditions); + $order_by = array( + array('time', TRUE), + ); + $title = t('Default'); + break; + case 'adhoc': + $filter =& $submitted['filter']; + $conditions =& $submitted['conditions']; + if (!$conditions['severity']) { + $conditions['severity'] = array('-1'); + } + $order_by =& $submitted['order_by']; + $title = t('Ad hoc') . (($v = $filter['origin']) ? (' - ' . t('based on !origin', array('!origin' => $v)) . '') : ''); + break; + case 'stored': + // Done earlier. + break; + case 'create': + case 'edit': + case 'delete_filter': + throw new Exception('Mode[' . $mode . '] not allowed at form build.', self::$_errorCodes['algo']); + break; + default: + throw new Exception('Unsupported mode[' . $mode . '].', self::$_errorCodes['algo']); + } + + // Prepare some fields. + // Type (frontend: type_some). + if (($options_type = db_select('watchdog') + ->fields('watchdog', array('type')) + ->distinct() + ->execute()->fetchCol())) { + sort($options_type); + foreach ($options_type as &$v) { + $v = str_replace(array("\r", "\n", ','), ' ', $v); + } + unset($v); // Clear reference. + $options_type = array_combine($options_type, $options_type); + // The filter may contain types that do not exist currently. + $prepend_types = array(); + if ($conditions['type']) { + foreach ($conditions['type'] as $v) { + if ($v) { + if (isset($options_type[$v])) { + unset($options_type[$v]); + } + $prepend_types[$v] = $v; + } + } + if ($prepend_types) { + $options_type = array_merge($prepend_types, $options_type); + } + } + } + elseif ($conditions['type']) { + $options_type = $conditions['type']; + } + else { // Make sure that there's always at least a single option. + $options_type = array('php' => 'php'); + } + // Severity. + $options_severity = array( + '-1' => t('Any'), + 'zero' => t('emergency'), + '1' => t('alert'), + '2' => t('critical'), + '3' => t('error'), + '4' => t('warning'), + '5' => t('notice'), + '6' => t('info'), + '7' => t('debug'), + ); + // Role. + $options_role = user_roles(); + foreach ($options_role as &$v) { + $v = t($v); + } + unset($v); // Clear reference. + $options_role = array('' => t('Any')) + $options_role; // Union operator (+) doesnt re-index numerical keys like array_merge() does. + // Order by. + $options_order_by = array( + '' => '', + 'time' => t('Time'), + 'severity' => t('Severity'), + 'type' => t('Type'), + 'role' => t('User role'), + 'uid' => t('User ID'), + 'hostname' => t('Visitor\'s hostname'), + 'location' => t('Location'), + 'referer' => t('Referrer'), + ); + $length_order_by = count($order_by); + + + // Only own filters. + $value_only_own = $settings && array_key_exists('only_own', $settings) ? $settings['only_own'] : FALSE; + + // Filter selector. + $uid = $GLOBALS['user']->uid; + if ( ($options_filters = self::_listFilters(!$value_only_own ? NULL : array($uid), array('name'), array(array('name')), $uid) ) ) { + $js_filters = '["' . join('","', $options_filters) . '"]'; + $options_filters = array_merge( + array('' => t('Default')), + array_combine($options_filters, $options_filters) + ); + } + else { + $js_filters = '[]'; + $options_filters = array('' => t('Default')); + } + + // Get current theme. + $theme = $GLOBALS['theme']; + + // Build form. + $form['#attributes'] = array('autocomplete' => 'off'); + $form['log_filter_filter_edit'] = array( + '#type' => 'fieldset', + '#title' => t('Filter') . ': ' . $title . '', + '#collapsible' => TRUE, + '#collapsed' => FALSE, + 'frontend_init' => array( + '#type' => 'markup', + '#markup' => '', + ), + // Control vars. + 'log_filter_mode' => array( + '#type' => 'hidden', + '#default_value' => $mode, + ), + 'log_filter_name' => array( + '#type' => 'hidden', + '#default_value' => $filter_name, + ), + 'log_filter_origin' => array( + '#type' => 'hidden', + '#default_value' => $filter['origin'], + ), + // Conditions. + // Time. + 'log_filter_time_range' => array( // (3 open) + '#type' => 'textfield', + '#title' => t('Preceding hours'), + '#default_value' => $conditions['time_range'] ? $conditions['time_range'] : '', + '#size' => 2, + '#prefix' => '
' + . '', + ), + 'log_filter_time_from_proxy' => array( + '#type' => 'textfield', + '#title' => t('From') . '?', + '#default_value' => '', // Frontend sets it, if non-empty time_from. + '#size' => 10, + '#prefix' => '
' . t('or') . '
', + ), + 'log_filter_time_from' => array( + '#type' => 'hidden', + '#default_value' => $conditions['time_from'], + ), + 'log_filter_time_to_proxy' => array( + '#type' => 'textfield', + '#title' => t('To'), + '#default_value' => '', // Frontend sets it, if non-empty time_to. + '#size' => 10, + ), + 'log_filter_time_to' => array( // End: log-filter-time (2 open). + '#type' => 'hidden', + '#default_value' => $conditions['time_to'], + '#suffix' => '
', + ), + // Severity. + 'log_filter_severity' => array( + '#type' => 'checkboxes', + '#title' => t('Severity'), + '#multiple' => TRUE, + '#options' => $options_severity, + '#default_value' => $conditions['severity'], + ), + // Type. + 'log_filter_type_wildcard' => array( // (3 open). + '#type' => 'checkbox', + '#title' => t('Any'), + '#default_value' => $conditions['type_wildcard'], + '#prefix' => '
' + . '', + ), + 'log_filter_type_proxy' => array( + '#type' => 'checkboxes', + '#options' => $options_type, + '#default_value' => array(), + '#prefix' => '
', + ), + 'log_filter_type' => array( // End: log-filter-type (2 open). + '#type' => 'textarea', + '#default_value' => join("\n", $conditions['type']), + '#resizable' => FALSE, + '#suffix' => '
', + ), + // Various. + 'log_filter_role' => array( // (4 open). + '#type' => 'select', + '#title' => t('User role'), + '#options' => $options_role, + '#default_value' => $conditions['role'], + '#prefix' => '
', + ), + 'log_filter_uid' => array( + '#type' => 'textfield', + '#title' => t('ID'), + '#default_value' => $conditions['uid'], + '#size' => 11, + ), + 'log_filter_username' => array( // End: log-filter-user (3 open). + '#type' => 'textfield', + '#title' => t('Name'), + '#default_value' => $conditions['uid'], + '#size' => 20, + // Can't use Drupal Form API autocomplete, because we need to pass value to the uid field upon selection. + '#attributes' => array( + 'class' => array('form-autocomplete'), + ), + '#suffix' => '
', + ), + 'log_filter_hostname' => array( + '#type' => 'textfield', + '#title' => t('Visitor\'s hostname') . '?', + '#default_value' => $conditions['hostname'], + '#size' => 64, + ), + 'log_filter_location' => array( + '#type' => 'textfield', + '#title' => t('Location') . '?', + '#default_value' => $conditions['location'], + '#size' => 64, + ), + 'log_filter_referer' => array( // End: filter-conditions, (1 open). + '#type' => 'textfield', + '#title' => t('Referrer') . '?', + '#default_value' => $conditions['referer'], + '#size' => 64, + '#suffix' => '
', + ), + // Order by. + 'log_filter_orderby_1' => array( // (2 open) + '#type' => 'select', + '#options' => $options_order_by, + '#default_value' => $length_order_by ? array($order_by[0][0]) : array(), + '#prefix' => '
', + ), + 'log_filter_descending_1' => array( + '#type' => 'checkbox', + '#default_value' => $length_order_by ? $order_by[0][1] : FALSE, + '#attributes' => array( + 'title' => t('Descending'), + ), + ), + 'log_filter_orderby_2' => array( + '#type' => 'select', + '#options' => $options_order_by, + '#default_value' => $length_order_by > 1 ? array($order_by[1][0]) : array(), + ), + 'log_filter_descending_2' => array( + '#type' => 'checkbox', + '#default_value' => $length_order_by > 1 ? $order_by[1][1] : FALSE, + '#attributes' => array( + 'title' => t('Descending'), + ), + ), + 'log_filter_orderby_3' => array( + '#type' => 'select', + '#options' => $options_order_by, + '#default_value' => $length_order_by > 2 ? array($order_by[2][0]) : array(), + ), + 'log_filter_descending_3' => array( + '#type' => 'checkbox', + '#default_value' => $length_order_by > 2 ? $order_by[2][1] : FALSE, + '#attributes' => array( + 'title' => t('Descending'), + ), + ), + 'log_filter_reset' => array( // End: log-filter-reset, filter-orderby, log_filter_criteria (0 open). + '#type' => 'button', + '#name' => 'log_filter_reset', + '#value' => t('Reset'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit', 'edit-reset'), + ), + '#prefix' => '
', + '#suffix' => '
', + ), + // Filters. + array( + '#type' => 'markup', + '#markup' => '
', + ), + 'log_filter_filter' => array( // (2 open) + '#type' => 'select', + '#title' => t('Filter'), + '#options' => $options_filters, + '#default_value' => $filter_name, + ), + 'log_filter_only_own' => array( + '#access' => $allow_filter_edit, + '#type' => 'checkbox', + '#title' => t('List my filters only'), + '#default_value' => $value_only_own, + ), + array( + '#type' => 'markup', + '#markup' => '
' // End: log_filter_filters_cell_0 + . '
', + ), + 'log_filter_name_suggest' => array( + '#access' => $allow_filter_edit, + '#type' => 'textfield', + '#title' => t('Name'), + '#default_value' => '', // Only used frontend. + '#size' => 32, + '#attributes' => array( + 'maxlength' => 32, + ), + ), + 'log_filter_require_admin' => array( + '#access' => $allow_filter_edit && $user_admin_permission, + '#type' => 'checkbox', + '#title' => t('Restrict access') . '?', + '#default_value' => $require_admin, + '#attributes' => array( + 'title' => $title, + ), + ), + array( // End: log_filter_filters_cell_1 + '#type' => 'markup', + '#markup' => '
', + ), + 'log_filter_description' => array( + '#access' => $allow_filter_edit, + '#type' => 'textarea', + '#title' => t('Description'), + '#default_value' => $filter['description'], + '#rows' => 3, + '#cols' => 32, + '#resizable' => FALSE, // Otherwise styling too complicated, and browsers support it natively. + ), + array( // (3 open) + '#type' => 'markup', + '#markup' => '
', + ), + 'log_filter_edit' => array( + '#access' => $allow_filter_edit, + '#type' => 'button', + '#name' => 'log_filter_edit', + '#value' => t('Edit'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit'), + 'style' => 'display:none;', + ), + ), + 'log_filter_create' => array( // (2 open) + '#access' => $allow_filter_edit, + '#type' => 'button', + '#name' => 'log_filter_create', + '#value' => t('Save as...'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit'), + 'style' => 'display:none;', + ), + ), + array( + '#type' => 'markup', + '#markup' => '
' // End. log-filter-edit-create + . '
', + ), + 'log_filter_cancel' => array( // (3 open) + '#access' => $allow_filter_edit, + '#type' => 'button', + '#name' => 'log_filter_cancel', + '#value' => t('Cancel'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit', 'edit-cancel'), + 'style' => 'display:none;', + ), + ), + 'log_filter_save' => array( + '#access' => $allow_filter_edit, + '#type' => 'button', + '#name' => 'log_filter_save', + '#value' => t('Save'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit'), + 'style' => 'display:none;', + ), + ), + array( + '#type' => 'markup', + '#markup' => '
' // End: log-filter-cancel-save + . '
', + ), + 'log_filter_delete' => array( + '#access' => $allow_filter_edit, + '#type' => 'button', + '#name' => 'log_filter_delete', + '#value' => t('Delete filter'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit', 'edit-delete'), + 'style' => 'display:none;', + ), + ), + array( + '#type' => 'markup', + '#markup' => '
' // End: log-filter-delete + . '
', // End: log_filter_box_filter + ), + array( + '#access' => ($allow_delete_logs = user_access('log_filter remove logs')), + '#type' => 'markup', + '#markup' => '
', + ), + array( + '#access' => !$allow_delete_logs, + '#type' => 'markup', + '#markup' => '
 ', + ), + array( // (2 open) + '#access' => $allow_delete_logs, + '#type' => 'button', + '#name' => 'log_filter_delete_logs_button', + '#value' => t('Delete logs'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'type' => 'button', // Doesnt work; still type:submit. + 'class' => array('form-submit', 'edit-delete'), + 'style' => 'display:none;', + ), + ), + array( + '#access' => $allow_delete_logs, + '#type' => 'textfield', + '#name' => 'log_filter_delete_logs_max', + '#title' => t('Max.'), + '#default_value' => $settings && array_key_exists('delete_logs_max', $settings) ? $settings['delete_logs_max'] : '', + '#attributes' => array( + 'maxlength' => 11, + ), + ), + array( + '#type' => 'markup', + '#markup' => '
' // End: log_filter_box_delete_logs + . '
', // End: log_filter_filters + ), + ); + + $form['log_filter_list_controls'] = array( + 'frontend_setup' => array( + '#type' => 'markup', + '#markup' => ' +', + ), + 'log_filter_update_list' => array( + '#type' => 'button', + '#name' => 'log_filter_update_list', + '#value' => t('Update list'), + '#button_type' => 'button', // Doesnt work; still type:submit. + '#attributes' => array( + 'class' => array('form-submit'), + 'title' => t('[CTR + U / CMD + U]'), + ), + '#prefix' => '
', + '#suffix' => '
', + ), + 'log_filter_pager_controls' => array( + '#type' => 'markup', + '#markup' => '
' + . '
◄◄
' + . '
' + . '
 
' + . '
' . t('Loading...') . '
' + . '
' + . '
►►
' + . '
', + ), + 'log_filter_pager_range' => array( + '#type' => 'textfield', + '#title' => t('Logs per page'), + '#default_value' => $settings && array_key_exists('pager_range', $settings) && $settings['pager_range'] > 0 ? + $settings['pager_range'] : variable_get('log_filter_pgrng', self::PAGE_RANGE_DEFAULT), + '#size' => 4, + ), + 'log_filter_translate' => array( + '#type' => 'checkbox', + '#title' => t('Translate messages') . '?', + '#default_value' => $settings && array_key_exists('translate', $settings) ? $settings['translate'] : variable_get('log_filter_trnslt', 0), + '#attributes' => array( + 'title' => $title, + ), + ), + 'actions' => array( + '#type' => 'actions', + 'submit' => array( + '#type' => 'submit', + '#value' => t('Update list'), + '#attributes' => array('style' => 'display:none;'), + ), + ), + '#prefix' => '
', + '#suffix' => '
', + ); + + $logList = ''; + for ($i = 97; $i < 97 + 26; $i++) { + //$logList .= '
' . str_repeat(chr($i), 3) . '
'; + } + + + $form['log_filter_log_list'] = array( + '#type' => 'markup', + '#markup' => '
' . $logList . '
', + ); + + // Add our submit form; + $form['#submit'][] = '_log_filter_form_submit'; + return $form; + } + catch (Exception $xc) { + self::_errorHandler($xc); + drupal_set_message($xc->getMessage(), 'error'); + return array(); + } + } + + /** + * Called when log viewer form submits. + * + * @param array $form + * @param array &$form_state + * @return void + */ + public static function viewerFormSubmit($form, &$form_state) { + try { + $values =& $form_state['values']; + $prefix = 'log_filter_'; + + $messages = array(); + + $settings = array( + 'only_own' => !array_key_exists($prefix . 'only_own', $values) ? FALSE : $values[$prefix . 'only_own'], + 'delete_logs_max' => !array_key_exists($prefix . 'delete_logs_max', $values) ? '' : $values[$prefix . 'delete_logs_max'], + 'translate' => $values[$prefix . 'translate'], + 'only_own' => !array_key_exists($prefix . 'only_own', $values) ? FALSE : $values[$prefix . 'only_own'], + 'pager_range' => ($v = (int)$values[$prefix . 'pager_range']) > -1 ? ($v > self::PAGE_RANGE_MAX ? self::PAGE_RANGE_MAX : $v) : + variable_get('log_filter_pgrng', self::PAGE_RANGE_DEFAULT), + ); + + $submitted = array( + 'mode' => $values[$prefix . 'mode'], + 'filter' => array( + 'name' => '', + 'origin' => '', + 'name_suggest' => '', + 'description' => '', + 'require_admin' => !array_key_exists($prefix . 'require_admin', $values) ? FALSE : $values[$prefix . 'require_admin'], + ), + ); + + $use_form_values = $save = FALSE; + switch (($mode = $submitted['mode'])) { + case 'default': + // Use default values. + break; + case 'adhoc': + // Get specs from form. + $use_form_values = TRUE; + $submitted['filter']['origin'] = $values[$prefix . 'origin']; // ~ Hidden field. + break; + case 'stored': // Saved filter. + // Just get filter name; in stored mode we do absolutely nothing at submission but establishing the filter's name. + // Whether the filter require_admin and user has that permission will be checked at form build - no reason to check twice. + if (!($submitted['filter']['name'] = $filter_name = $values[$prefix . 'name'])) { + throw new Exception('Mode[' . $mode . '], empty name[' . $filter_name . '].', self::$_errorCodes['filter_name_composition']); + } + break; + case 'create': // Always AJAX-handled. + throw new Exception('Mode[' . $mode . '] not allowed at form submission.', self::$_errorCodes['algo']); + break; + case 'edit': + case 'delete_filter': + // Get name. + if (!($submitted['filter']['name'] = $filter_name = $values[$prefix . 'name'])) { + throw new Exception('Mode[' . $mode . '], empty name[' . $filter_name . '].', self::$_errorCodes['filter_name_composition']); + } + $success = TRUE; + // Check CRUD permission. + if (!user_access('log_filter edit filters')) { + $success = FALSE; + // Horrible; have to make almost exactly same message, because of shortcomings of the localization regime. + switch ($mode) { + case 'edit': + watchdog( + 'log_filter', + 'Won\'t edit the filter \'!name\' because user !user doesn\'t have \'log_filter edit filters\' permission.', + array('!name' => $filter_name, '!user' => $GLOBALS['user']->name), + WATCHDOG_WARNING + ); + drupal_set_message( + t('Cannot edit the filter \'!name\', because you don\'t have permission to edit log filters.', array('!name' => $filter_name)), + 'warning' + ); + break; + default: // delete + watchdog( + 'log_filter', + 'Won\'t delete the filter \'!name\' because user !user doesn\'t have \'log_filter edit filters\' permission.', + array('!name' => $filter_name, '!user' => $GLOBALS['user']->name), + WATCHDOG_WARNING + ); + drupal_set_message( + t('Cannot delete the filter \'!name\', because you don\'t have permission to edit log filters.', array('!name' => $filter_name)), + 'warning' + ); + } + } + // Check if exists, and get require_admin field. + elseif (!($require_admin = db_select('log_filter') + ->fields('log_filter', array('require_admin')) + ->condition('name', $filter_name, '=') + ->execute()->fetchField()) + ) { + if ($require_admin === FALSE) { // Doesn't exist. + $success = FALSE; + /* drupal_set_message( + t('The filter \'!name\' doesn\'t exist.', array('!name' => $filter_name)), + 'warning' + ); */ + $messages[] = array( + t('The filter \'!name\' doesn\'t exist.', array('!name' => $filter_name)), + 'warning' + ); + } + // else... the filter doesnt require admin permission. + } + elseif (!user_access('log_filter administer')) { + $success = FALSE; + } + if ($success) { + switch ($mode) { + case 'edit': + // Get specs from form, and save to database. + $use_form_values = TRUE; + $save = TRUE; + $submitted['filter']['description'] = $values[$prefix . 'description']; + // Change mode. + $submitted['mode'] = $mode = 'stored'; + break; + default: // delete + global $user; + db_delete('log_filter')->condition('name', $filter_name, '=')->execute(); + watchdog( + 'log_filter', + 'User (%uid) %name deleted the log filter \'!filter\'.', + array('%uid' => $user->uid, '%name' => $user->name, '!filter' => $filter_name), + WATCHDOG_INFO + ); + $messages[] = array( + t('Deleted the filter \'!name\'.', array('!name' => $filter_name)) + ); + // Change mode. + $submitted['mode'] = $mode = 'default'; + } + } + else { + $use_form_values = $save = FALSE; + // Change mode. + $submitted['mode'] = $mode = 'default'; + } + break; + default: + throw new Exception('Unsupported mode[' . $mode . '].', self::$_errorCodes['algo']); + } + + // Load values from form. + if ($use_form_values) { + $fields_conditions =& self::$_fields['conditions']; + $conditions = array(); + foreach ($fields_conditions as $name) { + switch ($name) { + case 'time_range': + $conditions[$name] = ($v = trim($values[$prefix . $name])) ? $v : ''; + break; + case 'role': + $conditions[$name] = ($v = trim($values[$prefix . $name])) > 0 ? $v : -1; + break; + case 'uid': // Accepts zero. + $conditions[$name] = ($v = trim($values[$prefix . $name])) > 0 || $v === '0' || $v === 0 ? $v : -1; + break; + case 'time_from': + $conditions[$name] = $conditions['time_range'] ? '' : (($v = trim($values[$prefix . $name])) ? $v : ''); + break; + case 'time_from_proxy': + if (!$save) { // Because save doesnt use the proxy field. + $conditions[$name] = !$conditions['time_from'] ? '' : $values[$prefix . $name]; + } + break; + case 'time_to': + $conditions[$name] = $conditions['time_range'] ? '' : (($v = trim($values[$prefix . $name])) ? $v : ''); + break; + case 'time_to_proxy': + if (!$save) { // Because save doesnt use the proxy field.y + $conditions[$name] = !$conditions['time_to'] ? '' : $values[$prefix . $name]; + } + break; + case 'severity': + $arr = $values[$prefix . $name]; + $vals = array(); + foreach ($arr as $k => $v) { + if ($v) { + if ('' . $k == '-1') { + $vals = array(); + break; + } + else { + $vals[] = $k; + } + } + } + $conditions[$name] = $vals; + break; + case 'type_wildcard': + $conditions[$name] = $values[$prefix . $name] ? TRUE : FALSE; + break; + case 'type': + // Dont remember type list (may be very long), if wildcard on. + $conditions[$name] = $conditions['type_wildcard'] ? array() : + array_combine($a = explode("\n", str_replace("\r", '', $values[$prefix . $name])), $a); + if ($save) { + unset($conditions['type_wildcard']); + } + break; + default: + $conditions[$name] = trim($values[$prefix . $name]); + } + } + unset($fields_conditions); + $submitted['conditions'] =& $conditions; + + $fields_order_by =& self::$_fields['order_by']; + $order_by = array(); + for ($i = 1; $i < 10; $i++) { + if (array_key_exists($key = $prefix . $fields_order_by[0] . $i, $values)) { + if (($key = $values[ $key ])) { + if (!$save) { + $order_by[] = array($key, $values[ $prefix . $fields_order_by[1] . $i ]); + } + else { + $order_by[] = array($key, $values[ $prefix . $fields_order_by[1] . $i ] ? 'DESC' : 'ASC'); + } + } + } + else { + break; + } + } + $submitted['order_by'] =& $order_by; + unset($order_by, $fields_order_by); + } + if ($save) { // edit mode. + $success = TRUE; + try { + self::_saveFilter($filter_name, $submitted); + } + catch (Exception $xc) { + self::_errorHandler($xc); + $success = FALSE; + $messages[] = array( + t('Failed to update filter \'!name\'.', array('!name' => $filter_name)), + 'warning' + ); + } + // Change mode. + if ($success) { + $submitted['mode'] = $mode = 'stored'; + } + else { + $submitted['mode'] = $mode = 'default'; + } + } + + // Clear conditions and order_by from vars to be passed to session, unless adhoc filter. + if ($mode != 'adhoc') { + unset( $submitted['conditions'], $submitted['order_by'] ); + } + + // Pass to session. + $session = array('settings' => $settings, 'submitted' => $submitted); + if ($messages) { + $session['messages'] = $messages; + } + if (module_exists('state')) { + State::sessionSet('module', 'log_filter', $session); + } + else { + drupal_session_start(); + if (!isset($_SESSION['module'])) { + $_SESSION['module'] = array( + 'log_filter' => $session, + ); + } + else { + $_SESSION['module']['log_filter'] = $session; + } + } + } + catch (Exception $xc) { + self::_errorHandler($xc); + drupal_set_message($xc->getMessage(), 'error'); + } + } + + /** + * Filters off restricted filters if current user isnt allowed to administer filters. + * + * @throws PDOException + * @param integer|string|array|NULL $creatorIds + * - default: NULL (~ any user) + * - integer|string: list only filters created by that user + * - array: list only filters created by those users + * @param array|NULL $fields + * - default: all fields + * @param arrayNULL $orderBy + * - default: unordered + * - array: multi-dimensional; every bucket being an array listing field name and 'ASC'|'DESC' + * @param integer|string|NULL $latestAtTop + * - default: not + * - user id: place lastest changed of that user at the very top of the list (requires that $fields is falsy or has 'name' bucket) + * @return array + */ + protected static function _listFilters($creatorIds = NULL, $fields = NULL, $orderBy = NULL, $latestAtTop = NULL) { + $uid = $GLOBALS['user']->uid; + + if ( ($creatorIds && !is_array($creatorIds)) || (!$creatorIds && $creatorIds !== NULL)) { + $creatorIds = array($creatorIds); + } + + $list = db_select('log_filter') + ->fields('log_filter', $fields ? $fields : array('*')); + + if ($creatorIds) { + $list->condition('creator', $creatorIds, 'IN'); + } + if (!user_access('log_filter administer')) { + $list->condition('require_admin', 0); + } + if ($orderBy) { + foreach ($orderBy as $subArr) { + $list->orderBy($subArr[0], !empty($subArr[1]) ? $subArr[1] : 'ASC'); + } + } + $list = ($singleColumned = ($fields && count($fields) == 1)) ? $list->execute()->fetchCol() : $list->execute()->fetchAll(); + + if ($list && $latestAtTop !== NULL + && (!$creatorIds || in_array($latestAtTop, $creatorIds)) + && (!$fields || in_array('name', $fields)) + ) { + if (($listLatest = db_select('log_filter') + ->fields('log_filter', array('name', 'changed')) + ->condition('editor', $latestAtTop, '=') + ->execute() + ->fetchAll() + )) { + $latestChange = $latestName = 0; + foreach ($listLatest as $subObj) { + if ($subObj->changed > $latestChange) { + $latestChange = $subObj->changed; + $latestName = $subObj->name; + } + } + if ($latestName) { + if ($singleColumned) { + if (($index = array_search($latestName, $list))) { // No need to check !== FALSE, because if zero there's nothing to be done. + array_splice($list, $index, 1); + array_unshift($list, $latestName); + } + } + else { + $index = 0; + foreach ($list as $k => $subObj) { + if ($subObj->name == $latestName) { + $index = $k; + break; + } + } + if ($index) { + $latest = array_splice($list, $index, 1); + array_unshift($list, $latest); + } + } + } + } + } + return $list; + } + + /** + * Checks if the filter requires log_filter administrative permission and whether the user has that permission. + * + * @throws PDOException + * @param string $name + * @return array|boolean|NULL + * - FALSE: the filter doesnt exist + * - NULL: user not allowed to use that filter + */ + protected static function _readFilter($name) { + return !( + $filter = db_select('log_filter') + ->fields('log_filter') + ->condition('name', $name, '=') + ->execute()->fetchAssoc() + ) ? FALSE : $filter['require_admin'] && !user_access('log_filter administer') ? NULL : $filter; + } + + /** + * Insert/update filter in database. + * + * @throws Exception + * @param string $name + * @param array $values + * @param boolean $create + * - default: FALSE + * @return void + * - throws error on failure + */ + protected static function _saveFilter($name, $values, $create = FALSE) { + $uid = $GLOBALS['user']->uid; + + if (!user_access('log_filter edit filters')) { + throw new Exception( + 'You\'re not allowed to edit filters.', + self::$_errorCodes['perm_filter_crud'] + ); + } + + // Filter metadata and last updated by. + $fields = array( + 'editor' => $uid, + 'changed' => REQUEST_TIME, + 'require_admin' => !empty($values['filter']['require_admin']) ? 1 : 0, + 'description' => $values['filter']['description'], + ); + if ($create) { + $fields['creator'] = $uid; + $fields['created'] = REQUEST_TIME; + } + + // Conditions. + $names =& self::$_fields['conditions']; + $conditions =& $values['conditions']; + foreach ($names as $key) { + switch ($key) { + case 'severity': + if (!empty($conditions[$key])) { + if (!is_array($v = $conditions[$key])) { + throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', + self::$_errorCodes['bad_filter_condition']); + } + // Use array values, but convert 'zero' to zero. + // And make sure it's all integers. + $fields[$key] = preg_replace('/[^\d,]/', '', str_replace('zero', '0', join(',', $v))); + } + else { + $fields[$key] = ''; + } + break; + case 'type': + if (!empty($conditions[$key])) { + if (!is_array($v = $conditions[$key])) { + throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', + self::$_errorCodes['bad_filter_condition']); + } + // Use array values, because key is simply numeric index. + $fields[$key] = check_plain(join(',', $v)); + } + else { + $fields[$key] = ''; + } + break; + case 'time_range': + $fields[$key] = !empty($conditions[$key]) && ($v = (int)$conditions[$key]) > 0 && $v < 10000 ? $v : 0; + break; + case 'time_from': + case 'time_to': + $fields[$key] = !empty($conditions[$key]) && ($v = (int)$conditions[$key]) > 0 && $v <= PHP_INT_MAX ? $v : 0; + break; + case 'role': + case 'uid': + $fields[$key] = array_key_exists($key, $conditions) ? (int)$conditions[$key] : -1; + break; + case 'hostname': + case 'location': + case 'referer': + $fields[$key] = !empty($conditions[$key]) ? check_plain($conditions[$key]) : ''; + break; + default: + // Ignore. + } + } + + // Order by. + $order_by = ''; + if (!empty($values['order_by'])) { + $order_by = array(); + foreach ($values['order_by'] as $k => $v) { + if (preg_match('/^[a-z\d_]{2,32}$/', $k) && ($v === 'DESC' || $v === 'ASC')) { + $order_by[] = $k . ':' . $v; + } + } + $fields['order_by'] = join(',', $order_by); + } + else { + $fields['order_by'] = ''; + } + + // Use unique key on name column for testing uniqueness. + if ($create) { + $fields['name'] = $name; + try { + db_insert('log_filter') + ->fields($fields) + ->execute(); + } + catch (PDOException $xc) { + if ((int)$xc->getCode() == 23000) { // Fair chance that it's a duplicate key error, though 23000 may also (MySQL) mean null error. + throw new Exception('Filter name[' . $name . '] already exists.', self::$_errorCodes['filter_name_nonunique']); + } + else { + throw $xc; + } + } + } + elseif (!($filter = self::_readFilter($name))) { + if ($filter === FALSE) { + throw new Exception('Filter name[' . $name . '] doesnt exist.', self::$_errorCodes['filter_doesnt_exist']); + } + throw new Exception('User (' . $uid . ') ' . $GLOBALS['user']->name . ' is not allowed to use filter[' . $name . '].', + self::$_errorCodes['perm_filter_restricted']); + } + elseif ( + !db_update('log_filter') + ->fields($fields) + ->condition('name', $name) + ->execute() + ) { + throw new Exception('Failed to update filter[' . $name . '].', self::$_errorCodes['unknown']); + } + } + + /** + * @param array &$conditions + * - empty or invalid conditions will be removed from the array + * @param array $order_by + * @param integer $offset + * - default: zero + * - ignored until MySQL supports LIMIT for sub queries + * @param integer $max + * - default: zero + * - ignored until MySQL supports LIMIT for sub queries + * @param array|NULL|boolean $log_columns + * - default: NULL (~ all watchdog columns) + * - FALSE: count only + * @param array|boolean $user_columns + * - default: FALSE (~ no user columns) + * @param boolean $deletion + * - default: FALSE (~ not for deleting logs) + * @return SelectQuery|SelectQueryInterface + * @throws Exception + * - PDOException + */ + protected static function _logListQuery(&$conditions, $order_by, $offset = 0, $max = 0, $log_columns = NULL, $user_columns = FALSE, $deletion = FALSE) { + $query = db_select('watchdog', 'w'); + if ($user_columns) { + $query->leftJoin('users', 'u', 'w.uid = u.uid'); + } + if (!$log_columns) { + if ($log_columns !== FALSE) { + $query->fields('w'); // Wildcard columns. + //->fields('w', array('wid', 'uid', 'type', 'message', 'variables', 'severity', 'link', 'location', 'referer', 'hostname', 'timestamp')) + } + } + else { + $query->fields('w', $log_columns); + } + if ($user_columns) { + $le = count($user_columns); + for ($i = 0; $i < $le; $i++) { + $query->addField('u', $user_columns[$i]); + } + } + // Conditions. + if ($deletion || $conditions) { + // The wid (log id) condition is not part of the overall used conditions, so we have to handle it differently. + // @todo: Explain just how, the code is certainly not self-explanatory in this sense. + $wid = 0; + if (isset($conditions['wid'])) { + if (($v = (int)$conditions['wid']) && $v > -1 && $v <= PHP_INT_MAX) { + $wid = $v; + $query->condition('w.' . 'wid', $v, '='); + // Remove all other conditions. + array_splice($conditions, 0); + $conditions['wid'] = $wid; + } + else { + unset($conditions['wid']); + } + } + if (!$wid) { + $names =& self::$_fields['conditions']; + + // Use user id instead of role (anonymous user role doesnt really exists - only as a lack of any roles)? + $is_anonymous = $not_anonymous = FALSE; + if (isset($conditions['role'])) { + switch ($conditions['role']) { + case DRUPAL_ANONYMOUS_RID: + $is_anonymous = TRUE; + $conditions['uid'] = 0; + break; + case DRUPAL_AUTHENTICATED_RID: + $not_anonymous = TRUE; + $conditions['uid'] = 0; + break; + } + } + + // Deleting events that log deletion of events is illegal. + if ($deletion) { + if (!empty($conditions['type']) && ($index = array_search('log_filter delete logs', $conditions['type'], TRUE)) !== FALSE) { + if (count($conditions['type']) == 1) { + unset($conditions['type']); + } + else { + array_splice($conditions['type'], $index, 1); + } + } + $query->condition('w.' . 'type', 'log_filter delete logs', '!='); + } + + foreach ($names as $key) { + if (isset($conditions[$key])) { + if (!($v = $conditions[$key]) && $key != 'uid') { + unset($conditions[$key]); + } + else { + switch ($key) { + case 'severity': + if (!is_array($v)) { + throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', + self::$_errorCodes['bad_filter_condition']); + } + // Convert 'zero' to zero. + $query->condition('w.' . $key, explode(',', str_replace('zero', '0', join(',', $v))), 'IN'); + break; + case 'type': + if (!is_array($v)) { + throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', + self::$_errorCodes['bad_filter_condition']); + } + $query->condition('w.' . $key, explode(',', check_plain(join(',', $v))), 'IN'); + break; + case 'time_range': + if (($v = (int)$v) > 0 && $v < 10000) { + $query->condition('w.' . 'timestamp', REQUEST_TIME - ($v * 60 * 60), '>='); + } + else { + unset($conditions[$key]); + } + break; + case 'time_from': + if (($v = (int)$v) > 0 && $v <= PHP_INT_MAX) { + $query->condition('w.' . 'timestamp', $v, '>='); + } + else { + unset($conditions[$key]); + } + break; + case 'time_to': + if (($v = (int)$v) > 0 && $v <= PHP_INT_MAX) { + $query->condition('w.' . 'timestamp', $v, '<='); + } + else { + unset($conditions[$key]); + } + break; + case 'role': + if (($v = (int)$v) > 0 && $v <= PHP_INT_MAX) { + if (!$is_anonymous && !$not_anonymous) { + $query->join('users_roles', 'ur', 'w.uid = ur.uid AND ur.rid = :rid', array(':rid' => $v)); + } + } + else { + unset($conditions[$key]); + } + break; + case 'uid': + if (($v = (int)$v) > -1 && $v <= PHP_INT_MAX) { + $query->condition('w.' . $key, $v, !$not_anonymous ? '=' : '!='); + } + else { + unset($conditions[$key]); + } + break; + case 'hostname': + case 'location': + if (($v = trim(check_plain($v))) && $v !== '*') { + $query->condition('w.' . $key, $v, '='); + } + else { + unset($conditions[$key]); + } + break; + case 'referer': // Support strictly empty value 'none' + if (($v = trim(check_plain($v))) && $v !== '*') { + if ($v != 'none') { + $query->condition('w.' . $key, $v, '='); + } + else { + $query->condition(db_or()->condition('w.' . $key, '', '=')->isNull('w.' . $key)); + } + } + else { + unset($conditions[$key]); + } + break; + default: + // Ignore. + } + } + } + } + // Remove uid again, if only used as surrogate for role. + if ($is_anonymous || $not_anonymous) { + unset($conditions['uid']); + } + } + } + + // Simple log listing defaults to hide previous log deletions, unless user actually want to list log deletions. + if (!$deletion + && (empty($conditions['type']) || array_search('log_filter delete logs', $conditions['type'], TRUE) === FALSE) + && !variable_get('log_filter_showdeletions', FALSE) + ) { + $query->condition('w.' . 'type', 'log_filter delete logs', '!='); + } + + if ($log_columns === FALSE) { + return $query->countQuery(); + } + + // Order by. + // Will always be qualified extra by log id order, to secure correct (sub) order. + if (!empty($order_by)) { + $timeAscending = FALSE; + foreach($order_by as &$orderBy) { + if (preg_match('/^[a-z\d_]{2,32}$/', $k = $orderBy[0]) && (($v = $orderBy[1]) === 'DESC' || $v === 'ASC')) { + if ($k == 'time' || $k == 'timestamp') { + $query->orderBy('w.timestamp', $v); + if ($v == 'ASC') { + $timeAscending = TRUE; + } + } + else { + $query->orderBy('w.' . $k, $v); + } + } + } + unset($orderBy); + $query->orderBy('w.wid', !$timeAscending ? 'DESC' : 'ASC'); + } + else { + $query->orderBy('timestamp', 'DESC')->orderBy('w.wid', 'DESC'); + } + if (($offset || $max) && self::DB_SUBQUERY_LIMIT) { + // A range must have a max length, otherwise it's ignored. + if (!$max) { + $max = PHP_INT_MAX - $offset; + } + $query->range($offset, $max); + } + return $query; + } + + /** + * @param array &$conditions + * @param array $order_by + * @param integer $offset + * - minus one: list $max number of items from end of total matching items + * @param integer $max + * @param boolean $translate + * - default: FALSE + * @return array + */ + protected static function _listLogs(&$conditions, $order_by, $offset, $max, $translate = FALSE) { + // Find total matching items. + $total = (int)self::_logListQuery($conditions, $order_by, 0, 0, FALSE)->execute()->fetchField(); + + // Max number of items from end of total matching items? + if ($offset < 0) { + $offset = $max ? $total - $max : 0; + } + + $query = self::_logListQuery($conditions, $order_by, $offset, $max, NULL, array('name')); + + if (($offset || $max) && !self::DB_SUBQUERY_LIMIT) { + // A range must have a max length, otherwise it's ignored. + if (!$max) { + $max = PHP_INT_MAX - $offset; + } + $query->range($offset, $max); + } + // Work on event buckets. + if (($rows = $query->execute()->fetchAll())) { + foreach($rows as &$event) { + // Translate? + if (($vars = $event->variables) === 'N;') { + $event->variables = ''; + } + elseif (!$translate) { // Do variables replacement frontend. + $event->variables = unserialize($vars); + } + else { // Do translate if any variables + $event->message = t($event->message, unserialize($vars)); + $event->variables = ''; + } + // Filter link. + if ($event->link) { + $event->link = filter_xss($event->link); + } + } + unset($event); // Clear reference. + } + // Tell which conditions were used, but not what their values where - except for the wid (log id) condition. + $responseConditions = array_fill_keys(array_keys($conditions), true); + if (!empty($conditions['wid'])) { + $responseConditions['wid'] = $conditions['wid']; + } + return array( + $rows, + $responseConditions, + $offset, + $total, + ); + } + + /** + * Using a LIMIT for delete queryies is kind of hard since db_delete doesnt support LIMIT (because PostgresSQL doesnt support that), + * and MySQL doesnt support LIMIT for sub queries. + * + * And MySQL doesnt support using the same table in a sub query and in an outer CRUD query. + * + * So we have to do a separate select getting the relevant ids, and then do a delete using that - potentially too long - list of ids. + * Does it in chunks of 40000 items; that should work even when db query max length is only half a megabyte. + * + * @param array $conditions + * @param array $order_by + * @param integer $offset + * @param integer $max + * @return integer + */ + protected static function _deleteLogs($conditions, $order_by, $offset, $max) { + global $user; + + // Deleting all logs unconditionally is not an option, because deleting logs of type 'log_filter delete logs' is illegal. + //if (!$conditions && !$offset && !$max) { + // $deleted = db_delete('watchdog') + // ->execute(); + //} + //else { + $query = self::_logListQuery($conditions, $order_by, $offset, $max, array('wid'), FALSE, TRUE); + if (($offset || $max) && !self::DB_SUBQUERY_LIMIT) { + // A range must have a max length, otherwise it's ignored. + if (!$max) { + $max = PHP_INT_MAX - $offset; + } + $query->range($offset, $max); + } + $ids = $query->execute()->fetchCol(); + + if (!($le = count($ids))) { + return 0; + } + // This may fail because the list of ids may exceed query limit (query max length). + if ($le > 40000) { + $le = count($ids = array_chunk($ids, 40000)); + $deleted = 0; + for ($i = 0; $i < $le; $i++) { + $deleted += db_delete('watchdog') + ->condition('wid', $ids[$i], 'IN') + ->execute(); + } + } + else { + $deleted = db_delete('watchdog') + ->condition('wid', $ids, 'IN') + ->execute(); + } + //} + watchdog( + 'log_filter delete logs', + 'User (%uid) %name deleted !deleted log events.', + array('%uid' => $user->uid, '%name' => $user->name, '!deleted' => $deleted), + WATCHDOG_NOTICE + ); + return $deleted; + } + + /** + * Access permission: 'access site reports'. + * + * All actions require the POST var form_token. + * + * Expects (requires) POST vars on actions: + * - filter_create|filter_edit: name, filter, conditions, order_by + * - list_logs: conditions, order_by, offset, max, translate + * - delete_logs: conditions, order_by, offset, max + * + * @see LogFilter::ajaxCallback + * @param string $action + * @return void + * - sends 403 header if the expected POST vars arent set or their sanitized values evaluates to empty + */ + public static function ajaxCallback($action) { + if ( // Require permission. + !user_access('access site reports') + // Require valid composition of the 'action' parameter (presumably a GET var). + || !$action || !($le = strlen($action)) // Deliberately not drupal_...(). + || $le > 32 + ) { + header('HTTP/1.1 403 Forbidden'); + exit; + } + $action = '' . $action; + $oResp = new stdClass(); + $oResp->action = check_plain($action); // Redundant; vs. code review. + $oResp->error = ''; + $oResp->success = TRUE; + $oResp->error_code = 0; + + try { + switch ($action) { + case 'username_autocomplete': + $oResp = array(); + if (isset($_GET['term']) && strlen($needle = trim($_GET['term'])) && drupal_validate_utf8($needle)) { + $maxResult = 9; + //$oResp = array( array('value' => '8', 'label' => 'someuser'), ); + $uids = array(); + $users = db_select('users', 'u') + ->fields('u', array('uid', 'name')) + ->condition('name', db_like($needle) . '%', 'LIKE') + ->orderBy('u.name', 'ASC') + ->range(0, $maxResult) + ->execute() + ->fetchAll(); + if (($le = count($users))) { + for ($i = 0; $i < $le; ++$i) { + $oResp[] = array('value' => $uids[] = $users[$i]->uid, 'label' => $users[$i]->name); + } + } + if ($le < $maxResult) { + $users = db_select('users', 'u') + ->fields('u', array('uid', 'name')); + if ($uids) { + $users = $users->condition('uid', $uids, 'NOT IN'); + } + $users = $users->condition('name', '%' . db_like($needle) . '%', 'LIKE') + ->orderBy('u.name', 'ASC') + ->range(0, $maxResult - $le) + ->execute() + ->fetchAll(); + if (($le = count($users))) { + for ($i = 0; $i < $le; ++$i) { + $oResp[] = array('value' => $users[$i]->uid, 'label' => $users[$i]->name); + } + } + } + } + break; + case 'filter_create': + case 'filter_edit': + $conditions = $order_by = NULL; + if ( + !array_key_exists('name', $_POST) || !($le = strlen($name = $_POST['name'])) // Deliberately not drupal_...(). And composition is checked later. + || $le > 32 + || !array_key_exists('filter', $_POST) || !is_array($filter = $_POST['filter']) // It is an array! + || !array_key_exists('require_admin', $filter) || !(($require_admin = (int)$filter['require_admin']) == 0 || $require_admin == 1) + || !array_key_exists('description', $filter) + || ( ($description = $filter['description']) !== '' && (!drupal_validate_utf8($description) || drupal_strlen($description) > 255) ) + // conditions may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _saveFilter() checks/filters conditions buckets vs. xss. + || (array_key_exists('conditions', $_POST) && ($conditions = $_POST['conditions']) && !is_array($conditions)) + // order_by may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _saveFilter() checks/filters order_by buckets vs. xss. + || (array_key_exists('order_by', $_POST) && ($order_by = $_POST['order_by']) && !is_array($order_by)) + ) { + header('HTTP/1.1 403 Forbidden'); + exit; + } + if (!user_access('log_filter edit filters')) { + $oResp->success = FALSE; + $oResp->error_code = self::$_errorCodes['perm_filter_crud']; + } + elseif (!preg_match('/^[a-z_][a-z\d_]+$/', $name) || $name == 'default' || $name == 'adhoc') { // @IDE: var $name is declared. + $oResp->success = FALSE; + $oResp->error_code = self::$_errorCodes['filter_name_composition']; + // $oResp->error = t('Invalid machine name[' . $name . '].'); Frontend creates own message. + $oResp->name = check_plain($name); + } + else { + $oResp->name = $name = check_plain(strtolower($name)); // Deliberately not drupal_...(). + $oResp->description = !$description ? '' : check_plain(trim(str_replace(array("\r", "\n", "\t"), ' ', $description))); + self::_saveFilter( + $name, + array( + 'filter' => array( + 'require_admin' => $require_admin, + 'description' => $description + ), + 'conditions' => $conditions ? $conditions : array(), // _saveFilter() checks/filters conditions buckets vs. xss. + 'order_by' => $order_by ? $order_by : array(), // _saveFilter() checks/filters order_by buckets vs. xss. + ), + $action == 'filter_create' + ); + } + break; + case 'list_logs': + $conditions = $order_by = NULL; + if ( + // conditions may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _logListQuery() checks/filters conditions buckets vs. xss. + (array_key_exists('conditions', $_POST) && ($conditions = $_POST['conditions']) && !is_array($conditions)) + // order_by may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _logListQuery() checks/filters order_by buckets vs. xss. + || (array_key_exists('order_by', $_POST) && ($order_by = $_POST['order_by']) && !is_array($order_by)) + || !array_key_exists('offset', $_POST) || ($offset = (int)$_POST['offset']) < -1 || $offset > PHP_INT_MAX + || !array_key_exists('max', $_POST) || ($max = (int)$_POST['max']) < 0 || $max > PHP_INT_MAX + || !array_key_exists('translate', $_POST) + ) { + header('HTTP/1.1 403 Forbidden'); + exit; + } + if ($max > self::PAGE_RANGE_MAX) { + $max = self::PAGE_RANGE_MAX; + } + if (!$conditions) { + $conditions = array(); + } + $oResp->log_list = self::_listLogs( + $conditions, + $order_by ? $order_by : array(), + $offset, + $max, + $translate = (bool)$_POST['translate'] + ); + // Save pager_range and translate to session. + $session = array( + 'settings' => array( + 'pager_range' => $max > 0 ? $max : variable_get('log_filter_pgrng', self::PAGE_RANGE_DEFAULT), + 'translate' => $translate, + ), + ); + if (module_exists('state')) { + State::sessionSet('module', 'log_filter', $session); + } + else { + drupal_session_start(); + if (!isset($_SESSION['module'])) { + $_SESSION['module'] = array( + 'log_filter' => $session, + ); + } + else { + $_SESSION['module']['log_filter'] = $session; + } + } + break; + case 'delete_logs': + $conditions = $order_by = NULL; + if ( + // conditions may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _logListQuery() checks/filters conditions buckets vs. xss. + (array_key_exists('conditions', $_POST) && ($conditions = $_POST['conditions']) && !is_array($conditions)) + // order_by may not exist, because jQuery.ajax() >v1.4.4 doesn't POST empty object. + // _logListQuery() checks/filters order_by buckets vs. xss. + || (array_key_exists('order_by', $_POST) && ($order_by = $_POST['order_by']) && !is_array($order_by)) + || !array_key_exists('offset', $_POST) || ($offset = (int)$_POST['offset']) < -1 || $offset > PHP_INT_MAX + || !array_key_exists('max', $_POST) || ($max = (int)$_POST['max']) < 0 || $max > PHP_INT_MAX + ) { + header('HTTP/1.1 403 Forbidden'); + exit; + } + $oResp->delete_logs = self::_deleteLogs( + $conditions ? $conditions : array(), + $order_by ? $order_by : array(), + $offset, + $max + ); + break; + default: + $oResp->success = FALSE; + $oResp->error_code = 1; + $oResp->error = 'Unsupported action[' . $action . '].'; + } + } + catch (PDOException $xc) { + self::_errorHandler($xc); + $oResp->success = FALSE; + $oResp->error_code = self::$_errorCodes['db_general']; + } + catch (Exception $xc) { + self::_errorHandler($xc); + $oResp->success = FALSE; + if (($error_code = $xc->getCode()) && in_array($error_code, self::$_errorCodes)) { + $oResp->error_code = $error_code; + } + else { + $oResp->error_code = self::$_errorCodes['unknown']; + } + } + + header('Content-Type: application/json; charset=utf-8'); + header('Cache-Control: private, no-store, no-cache, must-revalidate'); + header('Expires: Thu, 01 Jan 1970 00:00:01 GMT'); + echo drupal_json_encode($oResp); + flush(); + exit; + } +} \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.css b/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.css new file mode 100644 index 00000000..e03e60a4 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.css @@ -0,0 +1,12 @@ + +body.page-admin-config-system-log_filter * { + +} + body.page-admin-config-system-log-filter input#edit-log-filter-trnct { + text-align: right; + } + body.page-admin-config-system-log-filter div.form-item-log-filter-hidedblog label, + body.page-admin-config-system-log-filter div.form-item-log-filter-hidedblog .form-item label.option { + font-weight: bold; + font-size: 1em; + } diff --git a/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.inc b/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.inc new file mode 100644 index 00000000..d4b22e51 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/admin/log_filter.admin.inc @@ -0,0 +1,108 @@ + 'file', 'group' => CSS_DEFAULT, 'preprocess' => FALSE, 'every_page' => FALSE) + ); + } + // Clear menu cache if just submitted. + if (!empty($_SESSION) && !empty($_SESSION['module']) && !empty($_SESSION['module']['log_filter']) + && array_key_exists('admin_form_submitted', $_SESSION['module']['log_filter'])) { + menu_rebuild(); + unset($_SESSION['module']['log_filter']['admin_form_submitted']); + if (empty($_SESSION['module']['log_filter'])) { + unset($_SESSION['module']['log_filter']); + if (empty($_SESSION['module'])) { + unset($_SESSION['module']); + } + } + } + $form['general'] = array( + '#type' => 'fieldset', + '#title' => t('General settings'), + '#collapsible' => FALSE, + '#collapsed' => FALSE, + 'log_filter_admintheme' => array( + '#type' => 'checkbox', + '#title' => t('Do always use the administrative theme on log view pages'), + '#default_value' => variable_get('log_filter_admintheme', TRUE), + '#attributes' => array('autocomplete' => 'off'), + ), + 'log_filter_cssdefault' => array( + '#type' => 'checkbox', + '#title' => t('Link this module\'s default stylesheet'), + '#description' => t('Otherwise, implement styling in the site\'s theme layer.'), + '#default_value' => variable_get('log_filter_cssdefault', TRUE), + '#attributes' => array('autocomplete' => 'off'), + ), + ); + $form['log_list'] = array( + '#type' => 'fieldset', + '#title' => t('Log list settings'), + '#collapsible' => FALSE, + '#collapsed' => FALSE, + 'log_filter_pgrng' => array( + '#type' => 'textfield', + '#title' => t('Default log list page range'), + '#default_value' => variable_get('log_filter_pgrng', LogFilter::PAGE_RANGE_DEFAULT), + '#attributes' => array('autocomplete' => 'off'), + '#size' => 3, + ), + 'log_filter_trnslt' => array( + '#type' => 'checkbox', + '#title' => t('Default to translate log message'), + '#description' => t('Translating log messages is heavy performance-wise'), + '#default_value' => variable_get('log_filter_trnslt', FALSE), + '#attributes' => array('autocomplete' => 'off'), + ), + 'log_filter_showdeletions' => array( + '#type' => 'checkbox', + '#title' => t('List log entries that record that logs have been deleted'), + '#description' => t('Log entries of type \'log_filter delete logs\' defaults to be hidden, unless when that type is selected specifically.'), + '#default_value' => variable_get('log_filter_showdeletions', FALSE), + '#attributes' => array('autocomplete' => 'off'), + ), + ); + + $form['#submit'][] = 'log_filter_admin_form_submit'; + return system_settings_form($form); +} + +/** + * @param array $form + * @param array &$form_state + * @return void + */ +function _log_filter_admin_form_submit($form, &$form_state) { + // Make form clear menu cache upon submission. + if (!isset($_SESSION['module'])) { + $_SESSION['module'] = array( + 'log_filter' => array('admin_form_submitted' => TRUE), + ); + } + elseif (!isset($_SESSION['module']['log_filter'])) { + $_SESSION['module']['log_filter'] = array('admin_form_submitted' => TRUE); + } + else { + $_SESSION['module']['log_filter']['admin_form_submitted'] = TRUE; + } + + $values =& $form_state['values']; + $values['log_filter_pgrng'] = !($val = (int)trim($values['log_filter_pgrng'])) || $val < 0 ? LogFilter::PAGE_RANGE_DEFAULT : + ($val > LogFilter::PAGE_RANGE_MAX ? LogFilter::PAGE_RANGE_MAX : $val); +} \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-alert.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-alert.png new file mode 100644 index 0000000000000000000000000000000000000000..2c25c9c3495be91fd1c5e8894f02097e7bc10ea1 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3-oF?)7E^DVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*9U+7_9?*LR_yfF#P}j|KI1&FYD{C z@$%kMRQ&zo#a&a==Y@sWfj~guO<&)W`1t$w_Ag$%_;TRD0}qdz($at4zrVu7^ej93 zVL-qGPtWUug3q$D?mIa>iH*JQ;PB?no0~~V_iSvQ<>v12_MTl@`uo+Zn>TKJdGls& zMa9>nN1r4lT;t|`l9;%4?b9hZPl%!^7{UrQMX3J)xj*TTAOIJNv3hla?nX{kngDWp?&`XXmrWj$OZY?fLWP z7tfzxHft6zkpCQsjRsPgB|(0{z%Zl>U|3+DCIz(gucwP+NX4z1iO0j390gqOUzT)B zU~t^TD6FOQOy`-5fqKZ9m;d)4m{lfLreD*&uXNYDm9C=uRC9tBdah?*Kfm_uR(H4E zT+!ZAvH!Sy#AbzVD*kLO<^6>v%-ejr?xcw`5BA<@ax*-Twd&v3k2B8qf9LgIzRkRJ z7t8s}?&){-&fwX!-8eSVM1tXQU-7Q<%?ixHeZuj^8cxTyy=|AeDL+wZvVn%v;Z19% zmv36EaWvx40uF|Gc0X+nWb{ut%{H~*|FPAR7fLL?dtjBLV2na}1-s9b$p^e5o*SkH zCT%%s@II5b-Q->1+FPyiU;npX|I+_ddh=_=-tGT3{FVdQ&MBb@0KezO(EtDd literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-critical.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-critical.png new file mode 100644 index 0000000000000000000000000000000000000000..abe177767c6cfdb2dedb4deef62c4f569d4e952a GIT binary patch literal 808 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoL!3-p?Sg6bdQY`6?zK#qG>ra@ocD)2CC~=J_ z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1YQw<5=osJ=;(CRF;s5{t|2}_ySzmvR zm-m*U;_nwPo);G0H8p(_AO9>n`}+0kPhw;5+uOf*@#0BB!WAZ_`%X^Jva%j{dft?l zev+7YT~P30K)~FJieLBd-?Op#^5)IWq@?=}4zo*3w{&+e?e0EbQgTa8ZHKq_vz(kA z6DPiU_3Dwo|K;Z9d$zV;_U^s!?7VgD+Uo)W*SNW_adF+0ll%SZ)rRKgt88q4-oJnI z=FQimN5336aP!8ECrL@K+S?yTMBEAvUO#c-mviUd^z|)IN_v)?`>>+o`@@IdPM?0$ z-~Tiv<(7)dZ7r>v=g&V$NqPSK`F&g47p0|-LP8#ehQ7Oe`GLFp#q;OC?A!PK(xvOy zu00A4{_yD0x0f$pzkdDm?%kEy*)OZA9*2iN3JSU@D|k zK&18IRs~JZtSg1OK?^bpHQ)Jt6#M?Yo}sMhoaDL)@tOJ0=EtP4+Z$bDeJr2y!MVud zqMYuQBb7@Y1c_E2NW(eo5oG0BZFr#eFVc&1UEB8dZtx~ktrK|?9zVC} zy#6<7PM(lYth5K?hN^SVB#&9Os5URyWBWO;rexa2xCgf#y0}%e`VZWgz@D=|!zN%~ zNYLUv@9fWQ>*5OMS@+oK{gRjvi)H&(_;r5~$@;bE|DV=)Mm7d!Tm2*ZbSL)!Lx924 L)z4*}Q$iB}mm|rb literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-emergency.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-emergency.png new file mode 100644 index 0000000000000000000000000000000000000000..40d0609667c5dab5716d87aa52adf05a7fbb2caf GIT binary patch literal 803 zcmeAS@N?(olHy`uVBq!ia0vp^sz5Bj!3-pqeRtCbQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFj@rogt%T|VEF(4|G&?lukrG} ztgpYNsQ9L@@2;uo?-wtg#K&J35V&t|{{qNPNO)dY_~pQXKkwiF`|{na=D4sY+d6&078n{VE@v32d*FMIdym^krqM8uQij@c8lP?c1N_4SBa<5;%ejFaYp}G0{rAy0Z z&AP_T{VX^4zO(ZQ1%*|UCM{1&dK41!?eytauU@Up&VCdee3hO3-Q~--f`cCg1^v2z z|E8=gFod}@{__HsZao7t!$&S#J5lEu?|}iq;OXk; Jvd$@?2>>{x#?Jr% literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-error.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-error.png new file mode 100644 index 0000000000000000000000000000000000000000..486390c9b0ae6870eb81f39ca8206ad93dadd84d GIT binary patch literal 519 zcmV+i0{H!jP) z91bW015o<=q1f%XvDt8AwIVYyA^(JE!#-c~VP*!8^YaZwaAc;YuInMS@bt7uo45-E zu)DN`tlzKEA=MHK3&>1PY9LLOuy8j#jFiWNwQv~OY!;iL5HjQAO#6$AkdjFpY;Pkr zI}7rv*I^J9up#&M;&yNlvde{XGzxVU3I(iEaF0$EMUmA$@_9&Z_qW$<#z!uh0YrlVa!(J}bzdKz5(!jSxmZ-Yq47|r2DoZ% zh0xK#wc+zY6a)?^5@00|(0Hy|T55nxYDQJ-bjOQWj0N8n1^nzSSe~0homUSy zGnsIHdddQCsT3rm5kh-A%E!kXa_DsG06}VrSShjze2vE;b$4^4(AI|X(Gh6Scr86L z!rR!Xg^-$?xv^0#?Q&@bNeB5&>CsX7=P3Ufaz8evdrbd+&R-ne&8M;BN4x+4002ov JPDHLkV1gbZ=O6$8 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-info.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-info.png new file mode 100644 index 0000000000000000000000000000000000000000..f47924fc8ab0c800363774a555ce2da7186cf787 GIT binary patch literal 733 zcmV<30wVp1P)q}E%9LE>b|4@HIP_Kd@deL?+JJ?duw4^~)I^9Kg$tF(c=5*FbV=diWrki;g&MZl& z$iVWJm*u6MGp|$M_$prsHZX{9=N#?C%mW|J?>xWn@56K8d1L_o<4Q^J5^=BDNod+$ zksAM?P%Cu37mmxOeNcBi=V@)|o4oWj$chQ595JYz^Pnn5A=meVE_pGpD)OH_R-n-J z+#>b8dyG8>jV}R%e+l;1&!}jfh9R<_eL#-@V7@)M*02O6$9S<~1xr#}5j4BeU4v z-bS2F;KB0+Xu<@KEV6^RvO!X}8dO3-Q(M|0C`i-64eQ28#X+0s!=)()5 zfU)#n6#nm~Cl2*v7V1V8M&BeH-afc|Q8@Xx#yiKaa|bkWDByGQvO#2&c3zg{nA$yr zbsYJRSP5NV1v9I=`1@ExN#uLDLlPon5qBE*6I1x+EwK zCULEfL$*6{KtlqweID7Co)5BoYvhx{HV3MP1!-rYsE$Kk6-QBvBoJ$PHQ%$de2yP> zBtX<~$gy;e$Zl6fo)NYf-{g1_5*q)8Bq;W8@&ilh*k+)v?D5I&KN-GCTHb+hEQ^qb z6bH8c30k*6I#&)^6(NjoVQTq8%K)6pwf3!1jwMjFYa+CB8Sc=eByfknLRq^C+O>WF zFUmA`tqZf_IcVzmn4vTero?7l66I|i#@QXjk|~j~_z#$Z9F+ANP}XgLDvPF`c8xG; zN7)vba4C)bDTWs??yX}HdX#Y>WebeC0Gv2_nNEh^Oyy>oyOV@z2(*1c98$XYtvgr{ z=J&|7MAq7(qc?=Dr(dRYPInBkg}VBI-n{ac(*>1%lR_Pc&S(LgIhy|iQR%TxC}3F* P00000NkvXXu0mjf#D!dL literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/log-16-notice.png b/sites/all/modules/contrib/admin/log_filter/css/img/log-16-notice.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc43177abdc983dd2d9d46c25cb0ad697e2b3f0 GIT binary patch literal 442 zcmV;r0Y(0aP)T6V)KDIh4d`!h+4+30$p2US1^@RoIPE3LfW8Jxp^ek^ z{{1}8@E?RXP1pR_P;4whv;kdJc1J!Q;rV}l1?T?@D>(jtKEnCGy~5@MQ3f>RYs;;j zto855F^2zME?WP+UA6v$*c+y(|7$4FP#|bPbBX2ok4Lz{PLB%I1!E8!t22^CJxGiW?Kv4+7snPmij4r;oL*jpFlA;^jfUH>c=kE@3 zU?^NaNfC_E#or%b`JWb{^c-%0ubcY6xBJ*J6yn0K_OSf-bX58WH=wP|VM$Sn_C0L4 kFc~{;DYILG5slra@ocD)2CC~=J_ z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6DbsCcr1e_2+Sh!es5D6z!-$-PCCP z^^+8T9AjuHcl~^Xv%kS*?PM)47cFmBt?qKISNjEfD>dF9VEK5M`{NOwH4~Lz?O|Eb zuYP_7=Y}cji#sG1cB*|m!rfkB^L(#JNvd{NmEDRS`AyR`KOJJbu!7_2TE0uG`Ihyl z^ffpYrRaPUUP|MeSukVs_xPrm69a+cLzBZv?<)(%u$@GSDkC@<)qY7X4jCf za&K6i z91bW015o<=q1f%XvDt8AwIVYyA^(JE!#-c~VP*!8^YaZwaAc;YuInMS@bt7uo45-E zu)DN`tlzKEA=MHK3&>1PY9LLOuy8j#jFiWNwQv~OY!;iL5HjQAO#6$AkdjFpY;Pkr zI}7rv*I^J9up#&M;&yNlvde{XGzxVU3I(iEaF0$EMUmA$@_9&Z_qW$<#z!uh0YrlVa!(J}bzdKz5(!jSxmZ-Yq47|r2DoZ% zh0xK#wc+zY6a)?^5@00|(0Hy|T55nxYDQJ-bjOQWj0N8n1^nzSSe~0homUSy zGnsIHdddQCsT3rm5kh-A%E!kXa_DsG06}VrSShjze2vE;b$4^4(AI|X(Gh6Scr86L z!rR!Xg^-$?xv^0#?Q&@bNeB5&>CsX7=P3Ufaz8evdrbd+&R-ne&8M;BN4x+4002ov JPDHLkV1gbZ=O6$8 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/message-16-help.png b/sites/all/modules/contrib/admin/log_filter/css/img/message-16-help.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44326e46b705778b66c9aa27994fb703d7c775 GIT binary patch literal 668 zcmV;N0%QG&P)n1xO0Sy_tRDM3MXe?F<5gw)E3$ggvdSvNSP8^*`aU$FdjRmek-2@rM~MOAl>r3A-o z`&xcib^~3di)@#L^hchVX8;@KmwUto>6JC zw=!BE7*kZ_#Elp{{wVHGEr2n{AQ4#rQO`ov=xj|lNPFbk5w}F^L2hFl(v~+^NUXr= zT|#ctYZ0P*0hz|(29WWmQQlW|ZLFQCe!!C}&md`-17iq+XuM!9Ir;L&VOz52U!Q5` z(s%5)bWc~7nH>YltKq}E%9LE>b|4@HIP_Kd@deL?+JJ?duw4^~)I^9Kg$tF(c=5*FbV=diWrki;g&MZl& z$iVWJm*u6MGp|$M_$prsHZX{9=N#?C%mW|J?>xWn@56K8d1L_o<4Q^J5^=BDNod+$ zksAM?P%Cu37mmxOeNcBi=V@)|o4oWj$chQ595JYz^Pnn5A=meVE_pGpD)OH_R-n-J z+#>b8dyG8>jV}R%e+l;1&!}jfh9R<_eL#-@V7@)M*02O6$9S<~1xr#}5j4BeU4v z-bS2F;KB0+Xu<@KEV6^RvO!X}8dO3-Q(M|0C`i-64eQ28#X+0s!=)()5 zfU)#n6#nm~Cl2*v7V1V8M&BeH-afc|Q8@Xx#yiKaa|bkWDByGQvO#2&c3zg{nA$yr zbsYJRSP5NV1v9I=`1@ExN#uLDLlPon5qBE*6I1x+EwK zCULEfL$*6{KtlqweID7Co)5BoYvhx{HV3MP1!-rYsE$Kk6-QBvBoJ$PHQ%$de2yP> zBtX<~$gy;e$Zl6fo)NYf-{g1_5*q)8Bq;W8@&ilh*k+)v?D5I&KN-GCTHb+hEQ^qb z6bH8c30k*6I#&)^6(NjoVQTq8%K)6pwf3!1jwMjFYa+CB8Sc=eByfknLRq^C+O>WF zFUmA`tqZf_IcVzmn4vTero?7l66I|i#@QXjk|~j~_z#$Z9F+ANP}XgLDvPF`c8xG; zN7)vba4C)bDTWs??yX}HdX#Y>WebeC0Gv2_nNEh^Oyy>oyOV@z2(*1c98$XYtvgr{ z=J&|7MAq7(qc?=Dr(dRYPInBkg}VBI-n{ac(*>1%lR_Pc&S(LgIhy|iQR%TxC}3F* P00000NkvXXu0mjf#D!dL literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/message-16-ok.png b/sites/all/modules/contrib/admin/log_filter/css/img/message-16-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..9edebe6bd22fa0cbc17a3d68507b47142458aa24 GIT binary patch literal 639 zcmV-_0)YLAP){}Ob#JDl_kU8EOjbf>zZU)4i%4_sL?yvHw%5>U~%1E!Tz?d;Y!)bQw&ea_e1q{a+ zR8bYI_ssA`U2x4`1+&V4Ni#Tm*N*&~Z9$NHl@wyis1kjizLTQBz!@S6UIA}v9HmkT zh1c7-K6eS4qy~wHF`;$z z%sBA%+ZXKp*uy|(0J69Ya$XL3Ob#Pw0oR`Eagqg0;x&v{Vu6vzlE(mLK+%znr=?0ZIbnvKY&WkLcm zM+i8xPS`TG>ONdW>XU*Eu#sAgbd>Qixn_Seh*_d0q>n_8yC(;r{!guZd?Yjyr^cuv z=_VnWl0Y&k0pTS;U7?EQTk@5he|@GyJKuLsxRzZPEu7{4U|=xi;2n;_#{y9~tMwNS Z#7|pzf<92IWPbnv002ovPDHLkV1moWD2D(5 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/admin/log_filter/css/img/message-16-warning.png b/sites/all/modules/contrib/admin/log_filter/css/img/message-16-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc43177abdc983dd2d9d46c25cb0ad697e2b3f0 GIT binary patch literal 442 zcmV;r0Y(0aP)T6V)KDIh4d`!h+4+30$p2US1^@RoIPE3LfW8Jxp^ek^ z{{1}8@E?RXP1pR_P;4whv;kdJc1J!Q;rV}l1?T?@D>(jtKEnCGy~5@MQ3f>RYs;;j zto855F^2zME?WP+UA6v$*c+y(|7$4FP#|bPbBX2ok4Lz{PLB%I1!E8!t22^CJxGiW?Kv4+7snPmij4r;oL*jpFlA;^jfUH>c=kE@3 zU?^NaNfC_E#or%b`JWb{^c-%0ubcY6xBJ*J6yn0K_OSf-bX58WH=wP|VM$Sn_C0L4 kFc~{;DYILG5sl div { + position: relative; + display: inline-block; + text-align: left; + width: 40em; max-width: 40em; + } + div#log_filter__message_list { + position: absolute; + top: -1em; + z-index: 901; /* above overlay */ + } + div#log_filter__message_list > div { /* a message */ + display: none; + width: 40em; max-width: 40em; + margin-bottom: 0.2em; + border: 0.1em solid #BBB; + border-radius: 0.4em; + box-shadow: 0.1em 0.15em 0.2em #999; + background-repeat: no-repeat; + background-position: 0.5em 0.5em; + } + div#log_filter__message_list > div:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + div#log_filter__message_list > div > div:first-child { /* message content */ + float: left; + padding: 0.6em 0em 0.6em 3em; + line-height: 1.3em; + width: 34.5em; max-width: 34.5em; + } + div#log_filter__message_list > div > div:first-child span { + } + div#log_filter__message_list > div > div:last-child { /* message close button */ + float: right; + font-family: Verdana,sans-serif; + font-weight: bold; + font-size: 1.1em; + line-height: 1em; + padding: 0.5em 0.7em 0.4em 0.6em; + color: #666; + cursor: pointer; + user-select: none; -moz-user-select: none; -webkit-user-select: none; + } + div#log_filter__message_list > div > div:last-child:hover { + color: #999; + } + div#log_filter__message_list > div.log-filter-message-status { + background-color: #F8FFF0; + background-image: url("img/message-16-ok.png"); + } + div#log_filter__message_list > div.log-filter-message-info, + div#log_filter__message_list > div.log-filter-message-notice { + background-color: #FFFCE5; + background-image: url("img/message-16-info.png"); + } + div#log_filter__message_list > div.log-filter-message-warning { + background-color: #FFFCE5; + background-image: url("img/message-16-warning.png"); + } + div#log_filter__message_list > div.log-filter-message-error { + background-color: #FEF5F1; + background-image: url("img/message-16-error.png"); + } + + + form#log-filter-form fieldset#edit-log-filter-filter-edit .fieldset-legend span span { + text-transform: none; + } + form#log-filter-form div.fieldset-wrapper { + padding-right: 0.5em; + padding-bottom: 0.5em; + } + form#log-filter-form div.fieldset-wrapper:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div.fieldset-wrapper > div { + float: left; + } + + form#log-filter-form div#log_filter_criteria { + margin-top: 0.2em; + padding-right: 1.3em; + } + /* conditions */ + form#log-filter-form div#log_filter_criteria div.filter-conditions { + } + form#log-filter-form div#log_filter_criteria div.filter-conditions:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions > div { + float: left; + padding: 0 1.1em; + border-right: 0.1em dotted #999; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions > div:first-child { + padding-left: 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions > div:last-child { + padding-right: 0; + border-right: none; + } + + form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.log-filter-time { + overflow: hidden; + /* ~ form#log-filter-form div#log_filter_criteria div.filter-orderby > label:first-child */ + padding: 0.8em 1em 0 1.3em; + width: 11em; max-width: 11em; + + height: 17em; max-height: 17em; + background-color: #E2E2E2; + border: 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range { + margin-top: 0.4em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range input { + display: inline-block; + width: 2.8em; + text-align: right; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-time-or { + padding: 0.6em 0 0.5em 0.2em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy { + margin-top: 0.6em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-from-proxy label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child label { + font-size: 0.92em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-from-proxy input, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy input { + width: 5.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item input[name="log_filter_time_from_time"], + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item input[name="log_filter_time_to_time"] { + width: 4em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.form-type-checkbox { + padding: 0 0.1em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child { + margin-top: 0.4em; + margin-bottom: 0.3em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child label { + color: #666; + font-weight: bold; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.form-item-log-filter-severity { + padding: 0.8em 0.5em 0 1.2em; + width: 8em; min-width: 8em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.log-filter-type { + padding: 0.8em 1.2em 0 1.1em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard { + margin-top: 0.4em; + margin-bottom: 0.3em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard label { + color: #666; + font-weight: bold; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container { + overflow: auto; + border: 0.1em dotted #999; + border-width: 0.1em 0; + width: 16em; max-width: 16em; + height: 12.5em; max-height: 12.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container input[type='text'] { + width: 12em; + padding-top: 0; padding-bottom: 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container textarea { + display: none; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user { + padding-top: 0.8em; + padding-bottom: 1.2em; + border-bottom: 0.1em dotted #999; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user > div { + float: left; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user > div > label { + margin-bottom: 0.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user div.form-item-log-filter-role select { + max-width: 10.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-uid, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-username { + padding-left: 0.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-uid input { + text-align: right; + width: 3em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-username input { + width: 8em; + } +ul.ui-autocomplete { + padding: 0; +} + ul.ui-autocomplete a { + font-weight: normal; + color: #000; + cursor: pointer; + } + ul.ui-autocomplete a:hover, + ul.ui-autocomplete a.ui-state-hover, + ul.ui-autocomplete a.ui-state-active { + background: #0072b9; + color: #fff; + margin: 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname { + padding: 0.8em 0 0.2em 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer { + padding: 0.2em 0; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location label, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer label { + font-size: 0.92em; + line-height: 1.5em; + } + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname input, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location input, + form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer input { + width: 23em; + } + + /* orderBy */ + form#log-filter-form div#log_filter_criteria div.filter-orderby { + clear: left; + /* ~ form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs */ + padding-top: 1em; + min-height: 3em; + background-color: #B8B8B8; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > label:first-child { + /* ~ form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.log-filter-time */ + padding-left: 1.3em; + padding-right: 2em; + width: 10em; max-width: 10em; + text-align: right; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > label { + float: left; + margin-top: 0.1em; + color: #FFF; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > div { + float: left; + padding: 0; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > div.form-item.form-type-select { + } + form#log-filter-form div#log_filter_criteria div.filter-orderby select { + max-width: 10em; + background: #F8F8F8; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > div.form-item.form-type-checkbox input { + margin-left: 0.1em; + margin-right: 1em; + } + form#log-filter-form div#log_filter_criteria div.filter-orderby > div.log-filter-reset { + float: right; + margin-right: 2em; + } + + /* filter */ + form#log-filter-form div#log_filter_filters { + margin-top: 0.2em; + /* ~ #log_filter_filters width */ + width: 19.1em; max-width: 19.1em; + height: 21.8em; + background-color: #E2E2E2; + } + form#log-filter-form div#log_filter_filters:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter { + float: left; + padding-top: 0.8em; + /* ~ #log_filter_filters height */ + height: 17em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div, + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_0 { + float: left; + /* ~ #log_filter_filters width */ + width: 16.5em; min-width: 16.5em; + padding-left: 1.3em; + padding-right: 1.3em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_0:after, + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_1:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_0, + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_1 { + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_0 > div.form-item-log-filter-filter label { + padding-bottom: 0.3em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-filter select { + /* ~ #log_filter_filters width */ + width: 15.5em; max-width: 15.5em; + + font-size: 1.05em; font-weight: bold; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-filter option { + font-size: 1.05em; + padding: 0.1em 0; + color: #000; font-weight: normal; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.form-item-log-filter-filter option:selected { + font-size: 1.05em; font-weight: bold; /* doesnt work; setting directly on select work */ + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_0 > div.form-item-log-filter-only-own { + display: none; + margin-top: 0.5em; + margin-bottom: 1em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-only-own label { + font-weight: bold; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_1 { + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_1 > div.form-item-log-filter-name-suggest { + display: none; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-name-suggest label { + margin-top: 1em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-name-suggest input { + /* ~ #log_filter_filters width */ + width: 15.5em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div#log_filter_filters_cell_1 > div.form-item-log-filter-require-admin { + display: none; + margin-top: 1em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div > div.form-item-log-filter-require-admin label { + font-weight: bold; + } + + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-edit-create { + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-edit-create:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-edit-create input { + display: block; + margin-top: 1em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-edit-create input[name="log_filter_edit"] { + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-edit-create input[name="log_filter_create"] { + float: right; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.form-item-log-filter-description { + display: none; + margin-top: 0.5em; + margin-bottom: 1em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.form-item-log-filter-description textarea { + /* ~ #log_filter_filters width */ + width: 15.5em; + max-height: 3em; /* gecko always adds an extra row to textarea */ + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save { + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save > input[name="log_filter_cancel"] { + display: block; + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save > input[name="log_filter_save"] { + display: block; + float: right; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save.log-filter-reversed-button-sequence > input[name="log_filter_cancel"] { + float: right; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-cancel-save.log-filter-reversed-button-sequence > input[name="log_filter_save"] { + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-delete { + margin-top: 1.5em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_filter > div.log-filter-delete input { + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs { + float: right; + background-color: #B8B8B8; + /* ~ #log_filter_filters width */ + width: 16.5em; min-width: 16.5em; + /* ~ form#log-filter-form div#log_filter_criteria div.filter-orderby */ + padding: 1em 1.3em 0 1.3em; + /* ~ #log_filter_filters height */ + min-height: 3em; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs.log-filter-delete-logs-none { + display: none; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs > input[type="button"] { + display: block; + float: right; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs > div.form-item-log-filter-delete-logs-max { + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max label, + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max input { + float: left; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max label { + margin-top: 0.1em; + margin-right: 0.2em; + color: #FFF; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max input[type="text"] { + width: 4em; + background-color: #F8F8F8; + text-align: right; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div input.form-submit:hover { + opacity:0.9; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=90)'; filter:alpha(opacity=90); + background: #FFF; + } + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div input.form-submit:disabled, + form#log-filter-form div#log_filter_filters > div#log_filter_box_delete_logs div input.form-submit:disabled:hover { + opacity:1; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)'; filter:alpha(opacity=100); + background: #D8D8D8; + color: #555; + } + +form#log-filter-form div#log_filter_list_controls { + padding-bottom: 0.5em; +} + form#log-filter-form div#log_filter_list_controls:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_list_controls > div { + float: left; + margin-right: 3em; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-update-list-right { + float: right; + margin: 0; + } + form#log-filter-form div#log_filter_list_controls div#edit-actions { + display: none; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls { + min-width: 27em; + margin-left: 3em; + margin-right: 0; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div { + float: left; + cursor: pointer; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div.log-filter-pager-button { + font-family: 'Verdana,Aria,sans-serif'; + font-size: 1.1em; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div.log-filter-pager-button:hover { + opacity:0.6; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=60)'; filter:alpha(opacity=60); + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div.log-filter-pager-button-disabled { + visibility: hidden; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_first, + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_last { + letter-spacing: -0.3em; + padding-right: 0.3em; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_previous, + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_next { + margin-left: 0.5em; + margin-right: 0.5em; + padding-left: 0.5em; + padding-right: 0.5em; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_current { + text-align: center; + min-width: 10em; + font-weight: bold; + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_current:hover { + opacity:0.6; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=60)'; filter:alpha(opacity=60); + } + form#log-filter-form div#log_filter_list_controls > div.log-filter-pager-controls > div#log_filter_pager_progress { + display: none; + min-width: 7em; + padding-left: 3em; + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-pager-range { + + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-pager-range:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-pager-range label, + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-pager-range input { + display: block; + float: left; + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-pager-range label { + font-weight: normal; + margin-right: 0.5em; + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-cache { + + } + form#log-filter-form div#log_filter_list_controls > div.form-item-log-filter-cache label { + font-weight: bold; + font-size: inherit; + } + +div#log_filter_log_list { + overflow-x: hidden; + border-right: 1px solid #CCC; +} + div#log_filter_log_list > table { + } + div#log_filter_log_list th { + padding-left: 0.7em; + } + div#log_filter_log_list th:first-of-type { + padding: 0; + } + div#log_filter_log_list tr.even:hover, + div#log_filter_log_list tr.odd:hover, + div#log_filter_log_list tr.log-filter-list-displayed { + background-color: #D8E8F7; + } + div#log_filter_log_list td { + white-space: nowrap; + cursor: pointer; + text-align: left; + vertical-align: middle; + line-height: 1.2em; + padding: 0.7em; + } + div#log_filter_log_list td:hover { + background-color: #E8F3FF; + } + div#log_filter_log_list td.log-filter-list-message:hover { + background-color: #D8E8F7; + } + div#log_filter_log_list td.log-filter-list-user { + padding: 0 0.7em; + } + div#log_filter_log_list td.log-filter-list-user a { + display: block; + white-space: nowrap; + cursor: pointer; + text-align: left; + vertical-align: middle; + line-height: 1.2em; + padding: 0.7em 0; + } + div#log_filter_log_list td.log-filter-list-no-match { + font-weight: bold; + } + div#log_filter_log_list td.log-filter-list-event-from-url { + } + div#log_filter_log_list td.log-filter-list-severity { + width: 37px; max-width: 37px; + padding: 0; + background-repeat: no-repeat; background-position: center; + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-info { + background-image: url("img/log-16-info.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-notice { + background-image: url("img/log-16-notice.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-warning { + background-image: url("img/log-16-warning.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-error { + background-image: url("img/log-16-error.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-critical { + background-image: url("img/log-16-critical.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-alert { + background-image: url("img/log-16-alert.png"); + } + div#log_filter_log_list td.log-filter-list-severity.log-filter-list-emergency { + background-image: url("img/log-16-emergency.png"); + } + div#log_filter_log_list td.log-filter-list-time { + white-space: nowrap; + } + div#log_filter_log_list td.log-filter-list-message > div { + white-space: nowrap; + overflow: hidden; + } + +div.log-filter-log-display-dialog { + box-shadow:0px 2px 5px #555; +} + div.log-filter-log-display-dialog a.ui-dialog-titlebar-close, + div.log-filter-log-display-dialog button.ui-dialog-titlebar-close { + width: 33%; + background-color: #C8C9C5; + } + div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:hover, + div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:focus, + div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:hover, + div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:focus { + padding: 1px; + opacity:0.7; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=70)'; filter:alpha(opacity=70); + } + div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:after, + div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:after { + /*clearfix*/clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0; + } + div.log-filter-log-display-dialog a.ui-dialog-titlebar-close > span, + div.log-filter-log-display-dialog button.ui-dialog-titlebar-close > span { + float: right; + } + div.log-filter-log-display { + overflow: auto; + } + div.log-filter-log-display > table.dblog-event { + margin: 0; + } + div.log-filter-log-display > table.dblog-event th { + width: 5em; + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-severity { + display: inline-block; + width: 37px; + margin-left: 1em; + background-repeat: no-repeat; background-position: left; + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-info { + background-image: url("img/log-16-info.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-notice { + background-image: url("img/log-16-notice.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-warning { + background-image: url("img/log-16-warning.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-error { + background-image: url("img/log-16-error.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-critical { + background-image: url("img/log-16-critical.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-alert { + background-image: url("img/log-16-alert.png"); + } + div.log-filter-log-display > table.dblog-event td div.log-filter-log-display-emergency { + background-image: url("img/log-16-emergency.png"); + } \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/css/log_filter.min.css b/sites/all/modules/contrib/admin/log_filter/css/log_filter.min.css new file mode 100644 index 00000000..86b49c02 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/css/log_filter.min.css @@ -0,0 +1 @@ +body.page-admin-reports-dblog #help,body.page-admin-reports-dblog-log-filter #help{display:none}div#admin-menu{margin-left:0;margin-right:0}form#log-filter-form .form-item label{margin:0;padding:0;font-size:1em}form#log-filter-form input[type="checkbox"],form#log-filter-form input[type="submit"],form#log-filter-form input[type="reset"],form#log-filter-form input[type="button"],form#log-filter-form button,form#log-filter-form select{cursor:pointer}form#log-filter-form input:disabled,form#log-filter-form textarea:disabled,form#log-filter-form button:disabled,form#log-filter-form select:disabled{cursor:not-allowed}form#log-filter-form input.form-item-readonly,form#log-filter-form input[type="checkbox"].form-item-readonly,form#log-filter-form textarea.form-item-readonly,form#log-filter-form select.form-item-readonly{cursor:not-allowed;background-color:#e8e8e8}form#log-filter-form input[type="text"].form-item-readonly,form#log-filter-form input[type="password"].form-item-readonly,form#log-filter-form textarea.form-item-readonly{cursor:not-allowed;background-color:#e8e8e8}form#log-filter-form .form-item{padding:0;margin:0}form#log-filter-form input.form-button{margin:0;min-width:5em}form#log-filter-form input.form-button-disabled,form#log-filter-form input.form-button-disabled:hover,form#log-filter-form input.form-button-disabled:active{background-color:#DDD;border-color:#DDD;color:#666}form#log-filter-form input.form-submit:hover{opacity:.8;-ms-filter:'alpha(opacity=80)';filter:alpha(opacity=80)}form#log-filter-form input.form-submit:disabled:hover,form#log-filter-form input.form-submit.form-button-disabled{opacity:1.0;-ms-filter:'alpha(opacity=100)';filter:alpha(opacity=100)}form#log-filter-form input.form-submit{color:#333}form#log-filter-form input.form-submit.form-button-disabled{color:#666}form#log-filter-form input.form-submit.edit-reset,form#log-filter-form input.form-submit.edit-cancel{color:#369}form#log-filter-form input.form-submit.edit-delete{color:#930}form#log-filter-form label span{display:inline-block;cursor:default;vertical-align:top;padding:0 2px;margin:0 2px;border:1px solid #999;border-radius:4px;font-family:Verdana,sans-serif;font-size:.9em;line-height:1em;font-weight:bold;color:#666}form#log-filter-form div#log_filter_filters label span{border-color:#888;background-color:#e8e8e8;color:#555}body.page-admin-reports-dblog #page.theme-seven,body.page-admin-reports-dblog-log-filter #page.theme-seven{margin-left:20px;margin-right:20px;padding:10px 0 10px}#page.theme-seven form#log-filter-form input.form-submit{border-radius:11px;padding:2px 8px 3px}#page.theme-seven form#log-filter-form input.theme-seven.form-button-disabled,#page.theme-seven form#log-filter-form input.theme-seven.form-button-disabled:hover,#page.theme-seven form#log-filter-form input.theme-seven.form-button-disabled:active{background-color:#efefef;border-color:#efefef;color:#666}div#log_filter__message{width:67%;text-align:center;height:0;max-height:0}div#log_filter__message>div{position:relative;display:inline-block;text-align:left;width:40em;max-width:40em}div#log_filter__message_list{position:absolute;top:-1em;z-index:901}div#log_filter__message_list>div{display:none;width:40em;max-width:40em;margin-bottom:.2em;border:.1em solid #BBB;border-radius:.4em;box-shadow:.1em .15em .2em #999;background-repeat:no-repeat;background-position:.5em .5em}div#log_filter__message_list>div:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}div#log_filter__message_list>div>div:first-child{float:left;padding:.6em 0 .6em 3em;line-height:1.3em;width:34.5em;max-width:34.5em}div#log_filter__message_list>div>div:last-child{float:right;font-family:Verdana,sans-serif;font-weight:bold;font-size:1.1em;line-height:1em;padding:.5em .7em .4em .6em;color:#666;cursor:pointer;user-select:none;-moz-user-select:none;-webkit-user-select:none}div#log_filter__message_list>div>div:last-child:hover{color:#999}div#log_filter__message_list>div.log-filter-message-status{background-color:#f8fff0;background-image:url("img/message-16-ok.png")}div#log_filter__message_list>div.log-filter-message-info,div#log_filter__message_list>div.log-filter-message-notice{background-color:#fffce5;background-image:url("img/message-16-info.png")}div#log_filter__message_list>div.log-filter-message-warning{background-color:#fffce5;background-image:url("img/message-16-warning.png")}div#log_filter__message_list>div.log-filter-message-error{background-color:#fef5f1;background-image:url("img/message-16-error.png")}form#log-filter-form fieldset#edit-log-filter-filter-edit .fieldset-legend span span{text-transform:none}form#log-filter-form div.fieldset-wrapper{padding-right:.5em;padding-bottom:.5em}form#log-filter-form div.fieldset-wrapper:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div.fieldset-wrapper>div{float:left}form#log-filter-form div#log_filter_criteria{margin-top:.2em;padding-right:1.3em}form#log-filter-form div#log_filter_criteria div.filter-conditions:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_criteria div.filter-conditions>div{float:left;padding:0 1.1em;border-right:.1em dotted #999}form#log-filter-form div#log_filter_criteria div.filter-conditions>div:first-child{padding-left:0}form#log-filter-form div#log_filter_criteria div.filter-conditions>div:last-child{padding-right:0;border-right:0}form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.log-filter-time{overflow:hidden;padding:.8em 1em 0 1.3em;width:11em;max-width:11em;height:17em;max-height:17em;background-color:#e2e2e2;border:0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range{margin-top:.4em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range input{display:inline-block;width:2.8em;text-align:right}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-time-or{padding:.6em 0 .5em .2em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy{margin-top:.6em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-range label,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-from-proxy label,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy label,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard label,form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child label{font-size:.92em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-from-proxy input,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-time-to-proxy input{width:5.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item input[name="log_filter_time_from_time"],form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item input[name="log_filter_time_to_time"]{width:4em}form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.form-type-checkbox{padding:0 .1em}form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child{margin-top:.4em;margin-bottom:.3em}form#log-filter-form div#log_filter_criteria div.filter-conditions div#edit-log-filter-severity.form-checkboxes div.form-item:first-child label{color:#666;font-weight:bold}form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.form-item-log-filter-severity{padding:.8em .5em 0 1.2em;width:8em;min-width:8em}form#log-filter-form div#log_filter_criteria div.filter-conditions div.form-item.log-filter-type{padding:.8em 1.2em 0 1.1em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard{margin-top:.4em;margin-bottom:.3em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-type-wildcard label{color:#666;font-weight:bold}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container{overflow:auto;border:.1em dotted #999;border-width:.1em 0;width:16em;max-width:16em;height:12.5em;max-height:12.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container input[type='text']{width:12em;padding-top:0;padding-bottom:0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-type-container textarea{display:none}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user{padding-top:.8em;padding-bottom:1.2em;border-bottom:.1em dotted #999}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user>div{float:left}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user>div>label{margin-bottom:.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.log-filter-user div.form-item-log-filter-role select{max-width:10.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-uid,form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-username{padding-left:.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-uid input{text-align:right;width:3em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div div.form-item.form-item-log-filter-username input{width:8em}ul.ui-autocomplete{padding:0}ul.ui-autocomplete a{font-weight:normal;color:#000;cursor:pointer}ul.ui-autocomplete a:hover,ul.ui-autocomplete a.ui-state-hover,ul.ui-autocomplete a.ui-state-active{background:#0072b9;color:#fff;margin:0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname{padding:.8em 0 .2em 0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer{padding:.2em 0}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname label,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location label,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer label{font-size:.92em;line-height:1.5em}form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-hostname input,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-location input,form#log-filter-form div#log_filter_criteria div.filter-conditions div div.form-item.form-item-log-filter-referer input{width:23em}form#log-filter-form div#log_filter_criteria div.filter-orderby{clear:left;padding-top:1em;min-height:3em;background-color:#b8b8b8}form#log-filter-form div#log_filter_criteria div.filter-orderby>label:first-child{padding-left:1.3em;padding-right:2em;width:10em;max-width:10em;text-align:right}form#log-filter-form div#log_filter_criteria div.filter-orderby:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_criteria div.filter-orderby>label{float:left;margin-top:.1em;color:#FFF}form#log-filter-form div#log_filter_criteria div.filter-orderby>div{float:left;padding:0}form#log-filter-form div#log_filter_criteria div.filter-orderby select{max-width:10em;background:#f8f8f8}form#log-filter-form div#log_filter_criteria div.filter-orderby>div.form-item.form-type-checkbox input{margin-left:.1em;margin-right:1em}form#log-filter-form div#log_filter_criteria div.filter-orderby>div.log-filter-reset{float:right;margin-right:2em}form#log-filter-form div#log_filter_filters{margin-top:.2em;width:19.1em;max-width:19.1em;height:21.8em;background-color:#e2e2e2}form#log-filter-form div#log_filter_filters:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter{float:left;padding-top:.8em;height:17em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div,form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_0{float:left;width:16.5em;min-width:16.5em;padding-left:1.3em;padding-right:1.3em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_0:after,form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_1:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_0,form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_1{float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_0>div.form-item-log-filter-filter label{padding-bottom:.3em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-filter select{width:15.5em;max-width:15.5em;font-size:1.05em;font-weight:bold}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-filter option{font-size:1.05em;padding:.1em 0;color:#000;font-weight:normal}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.form-item-log-filter-filter option:selected{font-size:1.05em;font-weight:bold}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_0>div.form-item-log-filter-only-own{display:none;margin-top:.5em;margin-bottom:1em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-only-own label{font-weight:bold}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_1>div.form-item-log-filter-name-suggest{display:none}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-name-suggest label{margin-top:1em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-name-suggest input{width:15.5em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div#log_filter_filters_cell_1>div.form-item-log-filter-require-admin{display:none;margin-top:1em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div>div.form-item-log-filter-require-admin label{font-weight:bold}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-edit-create:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-edit-create input{display:block;margin-top:1em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-edit-create input[name="log_filter_edit"]{float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-edit-create input[name="log_filter_create"]{float:right}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.form-item-log-filter-description{display:none;margin-top:.5em;margin-bottom:1em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.form-item-log-filter-description textarea{width:15.5em;max-height:3em}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-cancel-save:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-cancel-save>input[name="log_filter_cancel"]{display:block;float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-cancel-save>input[name="log_filter_save"]{display:block;float:right}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-cancel-save.log-filter-reversed-button-sequence>input[name="log_filter_cancel"]{float:right}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-cancel-save.log-filter-reversed-button-sequence>input[name="log_filter_save"]{float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_filter>div.log-filter-delete{margin-top:1.5em}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs{float:right;background-color:#b8b8b8;width:16.5em;min-width:16.5em;padding:1em 1.3em 0 1.3em;min-height:3em}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs.log-filter-delete-logs-none{display:none}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs>input[type="button"]{display:block;float:right}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs>div.form-item-log-filter-delete-logs-max{float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max label,form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max input{float:left}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max label{margin-top:.1em;margin-right:.2em;color:#FFF}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div.form-item-log-filter-delete-logs-max input[type="text"]{width:4em;background-color:#f8f8f8;text-align:right}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div input.form-submit:hover{opacity:.9;-ms-filter:'alpha(opacity=90)';filter:alpha(opacity=90);background:#FFF}form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div input.form-submit:disabled,form#log-filter-form div#log_filter_filters>div#log_filter_box_delete_logs div input.form-submit:disabled:hover{opacity:1;-ms-filter:'alpha(opacity=100)';filter:alpha(opacity=100);background:#d8d8d8;color:#555}form#log-filter-form div#log_filter_list_controls{padding-bottom:.5em}form#log-filter-form div#log_filter_list_controls:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_list_controls>div{float:left;margin-right:3em}form#log-filter-form div#log_filter_list_controls>div.log-filter-update-list-right{float:right;margin:0}form#log-filter-form div#log_filter_list_controls div#edit-actions{display:none}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls{min-width:27em;margin-left:3em;margin-right:0}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div{float:left;cursor:pointer}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div.log-filter-pager-button{font-family:'Verdana,Aria,sans-serif';font-size:1.1em}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div.log-filter-pager-button:hover{opacity:.6;-ms-filter:'alpha(opacity=60)';filter:alpha(opacity=60)}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div.log-filter-pager-button-disabled{visibility:hidden}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_first,form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_last{letter-spacing:-0.3em;padding-right:.3em}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_previous,form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_next{margin-left:.5em;margin-right:.5em;padding-left:.5em;padding-right:.5em}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_current{text-align:center;min-width:10em;font-weight:bold}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_current:hover{opacity:.6;-ms-filter:'alpha(opacity=60)';filter:alpha(opacity=60)}form#log-filter-form div#log_filter_list_controls>div.log-filter-pager-controls>div#log_filter_pager_progress{display:none;min-width:7em;padding-left:3em}form#log-filter-form div#log_filter_list_controls>div.form-item-log-filter-pager-range:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}form#log-filter-form div#log_filter_list_controls>div.form-item-log-filter-pager-range label,form#log-filter-form div#log_filter_list_controls>div.form-item-log-filter-pager-range input{display:block;float:left}form#log-filter-form div#log_filter_list_controls>div.form-item-log-filter-pager-range label{font-weight:normal;margin-right:.5em}form#log-filter-form div#log_filter_list_controls>div.form-item-log-filter-cache label{font-weight:bold;font-size:inherit}div#log_filter_log_list{overflow-x:hidden;border-right:1px solid #CCC}div#log_filter_log_list th{padding-left:.7em}div#log_filter_log_list th:first-of-type{padding:0}div#log_filter_log_list tr.even:hover,div#log_filter_log_list tr.odd:hover,div#log_filter_log_list tr.log-filter-list-displayed{background-color:#d8e8f7}div#log_filter_log_list td{white-space:nowrap;cursor:pointer;text-align:left;vertical-align:middle;line-height:1.2em;padding:.7em}div#log_filter_log_list td:hover{background-color:#e8f3ff}div#log_filter_log_list td.log-filter-list-message:hover{background-color:#d8e8f7}div#log_filter_log_list td.log-filter-list-user{padding:0 .7em}div#log_filter_log_list td.log-filter-list-user a{display:block;white-space:nowrap;cursor:pointer;text-align:left;vertical-align:middle;line-height:1.2em;padding:.7em 0}div#log_filter_log_list td.log-filter-list-no-match{font-weight:bold}div#log_filter_log_list td.log-filter-list-severity{width:37px;max-width:37px;padding:0;background-repeat:no-repeat;background-position:center}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-info{background-image:url("img/log-16-info.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-notice{background-image:url("img/log-16-notice.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-warning{background-image:url("img/log-16-warning.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-error{background-image:url("img/log-16-error.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-critical{background-image:url("img/log-16-critical.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-alert{background-image:url("img/log-16-alert.png")}div#log_filter_log_list td.log-filter-list-severity.log-filter-list-emergency{background-image:url("img/log-16-emergency.png")}div#log_filter_log_list td.log-filter-list-time{white-space:nowrap}div#log_filter_log_list td.log-filter-list-message>div{white-space:nowrap;overflow:hidden}div.log-filter-log-display-dialog{box-shadow:0 2px 5px #555}div.log-filter-log-display-dialog a.ui-dialog-titlebar-close,div.log-filter-log-display-dialog button.ui-dialog-titlebar-close{width:33%;background-color:#c8c9c5}div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:hover,div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:focus,div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:hover,div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:focus{padding:1px;opacity:.7;-ms-filter:'alpha(opacity=70)';filter:alpha(opacity=70)}div.log-filter-log-display-dialog a.ui-dialog-titlebar-close:after,div.log-filter-log-display-dialog button.ui-dialog-titlebar-close:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0}div.log-filter-log-display-dialog a.ui-dialog-titlebar-close>span,div.log-filter-log-display-dialog button.ui-dialog-titlebar-close>span{float:right}div.log-filter-log-display{overflow:auto}div.log-filter-log-display>table.dblog-event{margin:0}div.log-filter-log-display>table.dblog-event th{width:5em}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-severity{display:inline-block;width:37px;margin-left:1em;background-repeat:no-repeat;background-position:left}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-info{background-image:url("img/log-16-info.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-notice{background-image:url("img/log-16-notice.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-warning{background-image:url("img/log-16-warning.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-error{background-image:url("img/log-16-error.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-critical{background-image:url("img/log-16-critical.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-alert{background-image:url("img/log-16-alert.png")}div.log-filter-log-display>table.dblog-event td div.log-filter-log-display-emergency{background-image:url("img/log-16-emergency.png")} \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery-ui-i18n.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery-ui-i18n.min.js new file mode 100644 index 00000000..8a7f2896 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery-ui-i18n.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}),jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}),jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}),jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"<Geri",nextText:"İrəli>",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}),jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}),jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}),jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}),jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}),jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}),jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}),jQuery(function(e){e.datepicker.regional.de={closeText:"schließen",prevText:"<zurück",nextText:"Vor>",currentText:"heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}),jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}),jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}),jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}),jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}),jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"<Anta",nextText:"Sekv>",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}),jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}),jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}),jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"<Aur",nextText:"Hur>",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}),jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}),jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}),jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"<Fyrra",nextText:"Næsta>",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}),jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}),jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}),jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"<Ant",nextText:"Seg>",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}),jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}),jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}),jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}),jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}),jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"<Նախ.",nextText:"Հաջ.>",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}),jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}),jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}),jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}),jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}),jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"< წინა",nextText:"შემდეგი >",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}),jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"<Алдыңғы",nextText:"Келесі>",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}),jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើ​រួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃ​នេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}),jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}),jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}),jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}),jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}),jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}),jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍"],monthNamesShort:["ജനു","ഫെബ്","മാര്‍","ഏപ്രി","മേയ്","ജൂണ്‍","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}),jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"<Sebelum",nextText:"Selepas>",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}),jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}),jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}),jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}),jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}),jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}),jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"<Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}),jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"<Suandant",nextText:"Precedent>",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}),jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}),jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}),jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}),jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}),jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"<mbrapa",nextText:"Përpara>",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}),jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}),jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}),jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}),jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}),jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}),jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"<Қафо",nextText:"Пеш>",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}),jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}),jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}),jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}),jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}),jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}),jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-af.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-af.min.js new file mode 100644 index 00000000..e53ef962 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-af.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-af.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar-DZ.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar-DZ.min.js new file mode 100644 index 00000000..bea9cad9 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar-DZ.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ar-DZ.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar.min.js new file mode 100644 index 00000000..6a29f466 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ar.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ar.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-az.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-az.min.js new file mode 100644 index 00000000..1ddebbe1 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-az.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-az.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"<Geri",nextText:"İrəli>",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bg.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bg.min.js new file mode 100644 index 00000000..2c3c4160 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bg.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-bg.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bs.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bs.min.js new file mode 100644 index 00000000..dfd3d80a --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-bs.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-bs.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ca.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ca.min.js new file mode 100644 index 00000000..e1fab4d9 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ca.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ca.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cs.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cs.min.js new file mode 100644 index 00000000..c5c62901 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cs.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-cs.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cy-GB.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cy-GB.min.js new file mode 100644 index 00000000..6d9c18c8 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-cy-GB.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-cy-GB.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-da.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-da.min.js new file mode 100644 index 00000000..c6e599be --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-da.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-da.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-de.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-de.min.js new file mode 100644 index 00000000..4cb97adb --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-de.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-de.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.de={closeText:"schließen",prevText:"<zurück",nextText:"Vor>",currentText:"heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-el.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-el.min.js new file mode 100644 index 00000000..9ef457ef --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-el.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-el.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-AU.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-AU.min.js new file mode 100644 index 00000000..725cedf2 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-AU.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-en-AU.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-GB.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-GB.min.js new file mode 100644 index 00000000..7c81caea --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-GB.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-en-GB.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-NZ.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-NZ.min.js new file mode 100644 index 00000000..651309b3 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en-NZ.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-en-NZ.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en.min.js new file mode 100644 index 00000000..7c81caea --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-en.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-en-GB.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eo.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eo.min.js new file mode 100644 index 00000000..9f63c2d7 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eo.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-eo.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"<Anta",nextText:"Sekv>",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-es.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-es.min.js new file mode 100644 index 00000000..371d26d8 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-es.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-es.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-et.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-et.min.js new file mode 100644 index 00000000..f7c50659 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-et.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-et.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eu.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eu.min.js new file mode 100644 index 00000000..5f2db546 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-eu.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-eu.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"<Aur",nextText:"Hur>",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fa.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fa.min.js new file mode 100644 index 00000000..5a48e72c --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fa.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-fa.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fi.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fi.min.js new file mode 100644 index 00000000..12f2cf76 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fi.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-fi.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fo.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fo.min.js new file mode 100644 index 00000000..73b17ff9 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fo.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-fo.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"<Fyrra",nextText:"Næsta>",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr-CH.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr-CH.min.js new file mode 100644 index 00000000..ff889ca1 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr-CH.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-fr-CH.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr.min.js new file mode 100644 index 00000000..d7f095aa --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-fr.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-fr.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-gl.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-gl.min.js new file mode 100644 index 00000000..5a451f7b --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-gl.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-gl.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"<Ant",nextText:"Seg>",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-he.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-he.min.js new file mode 100644 index 00000000..10fec85a --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-he.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-he.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hi.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hi.min.js new file mode 100644 index 00000000..7e1fd4e6 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hi.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-hi.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hr.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hr.min.js new file mode 100644 index 00000000..43bef7d2 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hr.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-hr.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hu.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hu.min.js new file mode 100644 index 00000000..88b535ff --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hu.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-hu.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hy.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hy.min.js new file mode 100644 index 00000000..69d7d1cc --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-hy.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-hy.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"<Նախ.",nextText:"Հաջ.>",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-id.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-id.min.js new file mode 100644 index 00000000..d3545351 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-id.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-id.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-is.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-is.min.js new file mode 100644 index 00000000..c1ac7d26 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-is.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-is.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-it.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-it.min.js new file mode 100644 index 00000000..e7950029 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-it.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-it.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ja.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ja.min.js new file mode 100644 index 00000000..120ce4c5 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ja.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ja.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ka.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ka.min.js new file mode 100644 index 00000000..3a0430f3 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ka.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ka.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"< წინა",nextText:"შემდეგი >",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-kk.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-kk.min.js new file mode 100644 index 00000000..b3dbb8dd --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-kk.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-kk.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"<Алдыңғы",nextText:"Келесі>",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-km.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-km.min.js new file mode 100644 index 00000000..f7a5e7f3 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-km.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-km.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើ​រួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃ​នេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ko.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ko.min.js new file mode 100644 index 00000000..7f39884c --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ko.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ko.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lb.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lb.min.js new file mode 100644 index 00000000..d12d022d --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lb.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-lb.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lt.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lt.min.js new file mode 100644 index 00000000..0e22f0eb --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lt.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-lt.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lv.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lv.min.js new file mode 100644 index 00000000..5d0866b5 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-lv.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-lv.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-mk.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-mk.min.js new file mode 100644 index 00000000..8287ccbf --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-mk.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-mk.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ml.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ml.min.js new file mode 100644 index 00000000..b5bf34d5 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ml.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ml.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍"],monthNamesShort:["ജനു","ഫെബ്","മാര്‍","ഏപ്രി","മേയ്","ജൂണ്‍","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ms.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ms.min.js new file mode 100644 index 00000000..9ef51a14 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ms.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ms.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"<Sebelum",nextText:"Selepas>",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl-BE.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl-BE.min.js new file mode 100644 index 00000000..56757397 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl-BE.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-nl-BE.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl.min.js new file mode 100644 index 00000000..c5e5d9b2 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-nl.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-nl.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-no.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-no.min.js new file mode 100644 index 00000000..8eae5484 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-no.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-no.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pl.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pl.min.js new file mode 100644 index 00000000..0e1cc8c1 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pl.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-pl.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt-BR.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt-BR.min.js new file mode 100644 index 00000000..2253494e --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt-BR.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-pt-BR.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt.min.js new file mode 100644 index 00000000..2b80fb56 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-pt.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-pt.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"<Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-rm.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-rm.min.js new file mode 100644 index 00000000..ce2d0f9d --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-rm.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-rm.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"<Suandant",nextText:"Precedent>",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ro.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ro.min.js new file mode 100644 index 00000000..75864279 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ro.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ro.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ru.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ru.min.js new file mode 100644 index 00000000..2017a8a1 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ru.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ru.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sk.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sk.min.js new file mode 100644 index 00000000..056557b9 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sk.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sk.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sl.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sl.min.js new file mode 100644 index 00000000..6f437b38 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sl.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sl.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sq.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sq.min.js new file mode 100644 index 00000000..fa79e9e5 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sq.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sq.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"<mbrapa",nextText:"Përpara>",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr-SR.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr-SR.min.js new file mode 100644 index 00000000..91e18b24 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr-SR.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sr-SR.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr.min.js new file mode 100644 index 00000000..0691423d --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sr.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sr.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sv.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sv.min.js new file mode 100644 index 00000000..3901dd9a --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-sv.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-sv.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ta.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ta.min.js new file mode 100644 index 00000000..d6e51c3f --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-ta.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-ta.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-th.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-th.min.js new file mode 100644 index 00000000..855d0462 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-th.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-th.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tj.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tj.min.js new file mode 100644 index 00000000..d3b2c624 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tj.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-tj.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"<Қафо",nextText:"Пеш>",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tr.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tr.min.js new file mode 100644 index 00000000..3c20468c --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-tr.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-tr.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-uk.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-uk.min.js new file mode 100644 index 00000000..0de50a0c --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-uk.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-uk.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-vi.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-vi.min.js new file mode 100644 index 00000000..04f3e584 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-vi.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-vi.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-CN.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-CN.min.js new file mode 100644 index 00000000..9f4a60fe --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-CN.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-zh-CN.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-HK.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-HK.min.js new file mode 100644 index 00000000..1ed1371e --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-HK.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-zh-HK.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-TW.min.js b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-TW.min.js new file mode 100644 index 00000000..2bf079ef --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/jquery_ui_datepicker_i18n/jquery.ui.datepicker-zh-TW.min.js @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.9.2 - 2012-11-23 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-zh-TW.js +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])}); \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/js/log_filter.js b/sites/all/modules/contrib/admin/log_filter/js/log_filter.js new file mode 100644 index 00000000..d1ce6ba0 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/log_filter.js @@ -0,0 +1,2932 @@ +/** + * @file + * Drupal Log Filter module + */ + + +/*jslint browser: true, continue: true, indent: 2, newcap: true, nomen: true, plusplus: true, regexp: true, white: true, ass: true*/ +/*global alert: false, confirm: false, console: false*/ +/*global jQuery: false, Drupal: false, inspect: false, Judy: false*/ + +/** + * @param {function} $ + * @returns {object} + */ +(function($) { + 'use strict'; + + /** + * Singleton, instantiated to itself. + * @constructor + * @namespace + * @name LogFilter + * @singleton + * @param {function} $ + */ + var LogFilter = function($) { + /** + * @ignore + * @private + * @type {LogFilter} + */ + var self = this, + /** + * @ignore + * @private + * @type {string} + */ + _name = "LogFilter", + /** + * @ignore + * @private + * @type {object} + */ + _errorCodes = { + unknown: 1, + // Programmatic errors and wrong use of program. + algo: 100, + use: 101, + // Missing permission. + perm_general: 200, + form_expired: 201, + perm_filter_crud: 202, + perm_filter_restricted: 203, + // Database. + db_general: 500, + // Misc. + filter_name_composition: 1001, + filter_name_nonunique: 1002, + filter_doesnt_exist: 1003, + bad_filter_condition: 1010 + }, + /** + * @ignore + * @private + * @type {object} + */ + _ = { + // {arr} + errors: [], + dateFormat: "YYYY-MM-DD", + dateFormat_datepicker: "yy-mm-dd", + mode: "default", // default | adhoc | stored | create | edit | delete_filter + modePrevious: "default", + name: "", + origin: "", + crudFilters: false, + recordedValues: { // For some fields (having pattern validation) we have to record last value to safely detect change. + time_range: "", + uid: "", + hostname: "", + location: "", + referer: "", + orderBy: [], + type_options: [] + }, + deleteLogs_allowed: false, + saveEditFilterAjaxed: false, // Save/update filter using AJAX or ordinary POST request? + listMessageTruncate: 250, + adminOverlayOffset: 80, // Module Overlay. + currentOffset: 0, + currentMax: 100, + logs: {}, + library_judy_version: 2.1, + library_judy_compatible: true + }, + /** + * @ignore + * @private + * @type {array} + */ + _severity = ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'], + /** + * @ignore + * @private + * @type {boolean|undefined} + */ + _submitted, + /** + * @ignore + * @private + * @type {boolean|undefined} + */ + _ajaxRequestingBlocking, + /** + * List of previously used localized labels/messages. + * + * @ignore + * @private + * @type {object} + */ + _local = {}, + /** + * @ignore + * @private + * @type {object} + */ + _selectors = { + page: "div#page", + form: "form#log-filter-form", + settings: { + mode: "input[name='log_filter_mode']", + onlyOwn: "input[name='log_filter_only_own']", + delete_logs_max: "input[name='log_filter_delete_logs_max']", // May not exist. + translate: "input[name='log_filter_translate']", + pager_range: "input[name='log_filter_pager_range']" + }, + filter: { + filter: "select[name='log_filter_filter']", + name: "input[name='log_filter_name']", // Hidden. + origin: "input[name='log_filter_origin']", // Hidden. + name_suggest: "input[name='log_filter_name_suggest']", + description: "textarea[name='log_filter_description']", + require_admin: "input[name='log_filter_require_admin']" // May not exist. + }, + conditions: { + time_range: "input[name='log_filter_time_range']", // For iteration: must go before the other time fields. + time_from: "input[name='log_filter_time_from']", + time_from_proxy: "input[name='log_filter_time_from_proxy']", + time_to: "input[name='log_filter_time_to']", + time_to_proxy: "input[name='log_filter_time_to_proxy']", + severity_any: "input[name='log_filter_severity[-1]']", // For iteration: must go before severity_some. + severity_some: "div#edit-log-filter-severity input:not([name='log_filter_severity[-1]'])", // More elements. + type_any: "input[name='log_filter_type_wildcard']", // For iteration: must go before type_proxy. + type_some: "textarea[name='log_filter_type']", // For iteration: must go before type_proxy. + type_proxy: "div#edit-log-filter-type-proxy input", // We only store the first, because we only need one for getting/setting value. + role: "select[name='log_filter_role']", // For iteration: must go before uid. + uid: "input[name='log_filter_uid']", + username: "input[name='log_filter_username']", + hostname: "input[name='log_filter_hostname']", + location: "input[name='log_filter_location']", + referer: "input[name='log_filter_referer']" + }, + orderBy: { + options: "div.filter-orderby select", + bools: "div.filter-orderby input[type='checkbox']" + }, + buttons: { + // Not part of filter dialog. + submit: "input#edit-submit", + update_list: "input[name='log_filter_update_list']", + reset: "input[name='log_filter_reset']", + // Filter dialog. + create: "input[name='log_filter_create']", + edit: "input[name='log_filter_edit']", + delete_filter: "input[name='log_filter_delete']", + cancel: "input[name='log_filter_cancel']", + save: "input[name='log_filter_save']", // Doesnt exist if user isnt permitted to create|edit|save filter. + delete_logs_button: "input[name='log_filter_delete_logs_button']" + }, + pager: { + first: 'div#log_filter_pager_first', + previous: 'div#log_filter_pager_previous', + current: 'div#log_filter_pager_current', + progress: 'div#log_filter_pager_progress', + next: 'div#log_filter_pager_next', + last: 'div#log_filter_pager_last' + }, + misc: { + title: "#log_filter_title_display" + } + }, + _elements = { + settings: {}, + filter: {}, + conditions: {}, + orderBy: [], // Array. + buttons: { + crudFilters: [] // create, edit, delete_filter, cancel, save. + }, + pager: { + }, + misc: { + } + }, + /** + * @ignore + * @private + * @type {array} + */ + _filters = [], + /** + * @ignore + * @private + * @type {object} + */ + _logs = {}, + + // Declare private methods, to make IDEs list them + _errorHandler, _oGet, _toAscii, + _textareaRemoveWrapper, + _machineNameConvert, _machineNameIllegals, _machineNameValidate, + _validateTimeSequence, + _url, _submit, _typeProxyHandler, _prepareForm, _setMode, _crudRelay, _changedCriterion, _resetCriteria, _deleteLogs, _filterByEventColumn, + _getLogList, _listLogs, + _ajaxResponse, _ajaxRequest; + /** + * @see inspect.errorHandler + * @ignore + * @private + * @param {Error} [error] + * @param {mixed} [variable] + * @param {object|integer|boolean|string} [options] + * @return {void} + */ + _errorHandler = function(error, variable, options) { + var u = options, o = {}, t; + // Do nothing, if inspect is the 'no action' type. + if(typeof window.inspect === "function" && inspect.tcepsni) { + if(typeof inspect.errorHandler === "function") { + if(u) { + if((t = typeof u) === "string") { + o.message = u; + o.wrappers = 1; // This function wraps Inspect.errorHandler(). + } + else if(t === "object") { + o = u; + o.wrappers = !u.wrappers ? 1 : (u.wrappers + 1); + } + // Otherwise: ignore; use object argument for options if other properties are needed. + } + o.category = "log_filter"; + inspect.errorHandler(error, variable, o); + } + else { + inspect.console("Please update Inspect."); + } + } + }; + /** + * Object/function property getter, Object.hasOwnproperty() alternative. + * + * @ignore + * @param {object} o + * @param {string|integer} k0 + * @param {string|integer} [k1] + * @return {mixed} + * - undefined: o not object, or o doesnt have property k0, or the value of o[k1] is undefined; and the same goes if arg k1 is used + */ + _oGet = function(o, k0, k1) { + var t = typeof o; + return o && (t === "object" || t === "function") && o.hasOwnProperty(k0) ? + (k1 === undefined ? o[k0] : ( + (o = o[k0]) && ((t = typeof o) === "object" || t === "function") && o.hasOwnProperty(k1) ? o[k1] : undefined + ) ) : undefined; + }; + _toAscii = function(s) { + var ndl = _toAscii.needles, rpl = _toAscii.replacers, le = ndl.length, i, u; + if(typeof ndl[0] === "string") { // First time called. + u = ndl.concat(); + for(i = 0; i < le; i++) { + ndl[i] = new RegExp("\\u" + Judy.toLeading(u[i].charCodeAt(0).toString(16), 4), "g"); + } + } + for(i = 0; i < le; i++) { + s = s.replace(ndl[i], rpl[i]); + } + return s; + }; + /** + * Removes parent form-textarea-wrapper div from (non-resizable) textarea, for easier (standard) DOM access. + * + * @ignore + * @param {element} elm + * @return {void} + */ + _textareaRemoveWrapper = function(elm) { + var jq; + if ((jq = $(elm.parentNode)).hasClass("form-textarea-wrapper")) { + jq.after( $(elm).remove() ); + jq.remove(); + } + }; + _toAscii.needles = [ + // iso-8859-1 + //JSLINT_IGNORE--- jslint unsafe chars,but _toAscii() starts out converting them to \uNNNN regexes. + "Ä","Æ","ä","æ","Ö","Ø","ö","ø","Ü","ü","ß","Å","å","À","Á","Â","Ã","à","á","â","ã","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","ò","ó","ô","õ","Ù","Ú","Û","ù","ú","û","Ý","ý","ÿ","Þ","þ" + //---JSLINT_IGNORE + ]; + _toAscii.replacers = [ + // iso-8859-1 + "Ae","Ae","ae","ae","Oe","Oe","oe","oe","Ue","ue","ss","Aa","aa","A","A","A","A","a","a","a","a","C","c","D","d","E","E","E","E","e","e","e","e","I","I","I","I","i","i","i","i","N","n","O","O","O","O","o","o","o","o","U","U","U","u","u","u","Y","y","y","Th","th" + ]; + /** + * @ignore + * @return {void} + */ + _machineNameConvert = function() { + var v = this.value, rgx = /^[a-z\d_]$/; + if(v.length > 1 && !rgx.test(v)) { + if(!rgx.test(v = v.toLowerCase())) { + if(!rgx.test(v = v.replace(/[ \-]/g, "_"))) { + if(!rgx.test(v = _toAscii(v))) { + v = v.replace(/[^a-z\d_]/g, "_"); + } + } + } + this.value = v; + } + }; + /** + * @ignore + * @type {array} + */ + _machineNameIllegals = [ + "log_filter", + "default", + "adhoc" + ]; + /** + * @ignore + * @param {Event|falsy} evt + * - default: falsy (~ use arg elm) + * @param {element} [elm] + * - default: falsy (~ use arg value) + * @param {string} [value] + * @param {boolean} [noFeedback] + * - default: false (~ do pop alert upon validation failure) + * @return {boolean} + */ + _machineNameValidate = function(evt, elm, value, noFeedback) { + var v = evt ? this.value : (elm ? elm.value : value), le = v.length; + if(le < 2 || le > 32 || !/[a-z_]/.test(v.charAt(0)) || !/[a-z\d_]/.test(v) || $.inArray(v.toLowerCase(), _machineNameIllegals) > -1) { + if(!noFeedback) { + self.Message.set( self.local("error_machine_name_composition", {"!illegals": _machineNameIllegals.join(", ")}), "warning", { + modal: true, + close: function() { + Judy.focus(_elements.filter.name_suggest); + } + }); + } + return false; + } + return true; + }; + /** + * @ignore + * @param {string} nm + * @param {boolean} [date] + * @return {boolean} + */ + _validateTimeSequence = function(nm, date) { + var o = _elements.conditions, v, from = (v = o.time_from.value) ? parseInt(v, 10) : 0, to; + if (from && (to = (v = o.time_to.value) ? parseInt(v, 10) : 0) && from > to) { + // Date To and From must be allowed to be the same, otherwise user can't enter same date. + if (date && $.trim(o.time_to_proxy.value) === $.trim(o.time_from_proxy.value)) { + return true; + } + o[ "time_" + nm ].value = o[ "time_" + nm + "_proxy" ].value = o[ "time_" + nm + "_time" ].value = ""; + self.Message.set( self.local("invalid_timeSequence_" + nm), "warning", { modal: true }); + return false; + } + return true; + }; + /** + * @ignore + * @param {boolean} [top] + * - default: false (~ use current window's location, not top.location) + * @return {string} + */ + _url = function(top) { + var loc = (!top ? window : top).location, v; + return loc.protocol + "//" + loc.hostname + (!(v = loc.port) ? "" : (":" + v)) + loc.pathname.replace(/\/dblog(\/.+)?$/, "/dblog/log_filter"); + }; + /** + * @ignore + * @return {void} + */ + _submit = function() { + var nm = "", elm; + if(_submitted) { + return; + } + _submitted = true; + switch(_.mode) { + case "adhoc": + nm = "adhoc"; + break; + case "stored": + nm = _.name; + break; + } + // Add filter name to action url. + _elements.form.setAttribute( + "action", + _elements.form.getAttribute("action").replace(/\/dblog(\/[^\?&]+)([\?&].+)?$/, "/dblog/log_filter/" + nm + "$2") + ); + // Delay; otherwise it may in some situations not submit, presumably because Judy.enable() hasnt finished it's job yet(?). + setTimeout(function() { + $(_elements.buttons.submit).trigger("click"); + }, 100); + }; + /** + * @ignore + * @return {void} + */ + _typeProxyHandler = function() { + var v, i; + if(this.checked) { // Un-check type_any. + _elements.conditions.type_any.checked = false; + // Pass value to type_some. + if (Judy.arrayIndexOf(v = $.trim(_elements.conditions.type_some.value).split(/\n/), this.value) === -1) { + v.push(this.value); + _elements.conditions.type_some.value = $.trim(v.join("\n")); + } + } + else { + // Remove from hidden type_some. + if ((i = Judy.arrayIndexOf(v = $.trim(_elements.conditions.type_some.value).split(/\n/), this.value)) > -1) { + v.splice(i, 1); + if (v.length) { + _elements.conditions.type_some.value = $.trim(v.join("\n")); + } + else { + _elements.conditions.type_some.value = ""; + _elements.conditions.type_any.checked = "checked"; + } + } + } + _changedCriterion(); + }; + /** + * @ignore + * @return {void} + */ + _prepareForm = function() { + var oSels, oElms, nm, jq, elm, par, aElms, a, le, i, v, nOrderBy, u, elm2, d; + try { + _elements.page = $(_selectors.page).get(0); + _elements.form = $(_selectors.form).get(0); + // Filter; do first because we need references to name and origin. + oSels = _selectors.filter; + oElms = _elements.filter; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + oElms[nm] = elm; + switch(nm) { + case "filter": + // Selecting a stored filter means submit form. + jq.change(function() { + var v; + _elements.filter.name.value = _.name = v = Judy.fieldValue(this); + _elements.settings.mode.value = _.mode = v ? "stored" : "default"; + if(!v) { // default|adhoc + _resetCriteria(null, "default"); + return; + } + Judy.overlay(1, false, self.local("wait")); // Transparent. + _submit(); + }); + break; + case "name_suggest": // May not exist. + jq.keyup(_machineNameConvert); + break; + case "description": // May not exist. + _textareaRemoveWrapper(elm); // Remove parent form-textarea-wrapper. + jq.change(function() { + var v; + if((v = this.value)) { + this.value = Judy.stripTags(v); + } + }); + break; + } + } + } + _.name = _elements.filter.name.value; + _.origin = _elements.filter.origin.value; + // Fields; get element references, and fix some issues. + // Settings. + oSels = _selectors.settings; + oElms = _elements.settings; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + oElms[nm] = elm; + switch(nm) { + case "mode": + // Get mode. + _.mode = elm.value; + break; + case "onlyOwn": // May not exist. + // Submit if user (un)checks filter_only_own. + jq.change(function() { + if(_.mode === "stored") { + _elements.settings.mode.value = "adhoc"; + Judy.fieldValue(_elements.filter.filter, null, ""); + _elements.filter.origin.value = _.name; // Pass name to origin. + _elements.filter.name.value = ""; + } + Judy.overlay(1, false, self.local("wait")); // Transparent. + _submit(); + }); + break; + case "delete_logs_max": // May not exist. + jq.change(function() { + var v = this.value; + if(v !== "") { + if((v = $.trim(v)) !== "" && !/^[1-9]\d*$/.test(v)) { + v = ""; + } + this.value = v; + } + }); + break; + case "pager_range": + _.currentMax = parseInt(elm.value, 10); + // Pass value to delete max logs field. + if ($(_selectors.buttons.delete_logs_button).get(0)) { + oElms.delete_logs_max.value = _.currentMax; + } + jq.change(function() { + var v = this.value, n, m; + if(v !== "") { + if((v = $.trim(v)) !== "" && /^\d+$/.test(v)) { + _.currentMax = n = parseInt(v, 10); + if (_.deleteLogs_allowed && + ((m = _elements.settings.delete_logs_max.value) === '' || (m = parseInt(m, 10)) > n) + ) { + _elements.settings.delete_logs_max.value = n; + } + } + else { + v = ""; + } + this.value = v; + } + }); + break; + } + } + } + // Conditions. + oSels = _selectors.conditions; + oElms = _elements.conditions; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + switch(nm) { + case "time_range": + oElms[nm] = elm; + _.recordedValues[nm] = elm.value; + // Clear time_to and time_from when setting a time_range. + jq.change(function() { + var v = this.value, o; + if(v !== "") { + this.value = v = $.trim(v); + } + if(v !== "") { + if(v === "0" || !/^[1-9]\d*$/.test(v)) { + this.value = v = ""; + } + else { + if (v.length > 4) { + this.value = v = '9999'; + } + (o = _elements.conditions).time_from.value = + o.time_from_proxy.value = + o.time_from_time.value = + o.time_to.value = + o.time_to_proxy.value = + o.time_to_time.value = ""; + } + } + if(v !== _.recordedValues.time_range) { + _.recordedValues.time_range = v; + _changedCriterion(); + } + }); + break; + case "time_from": // Hidden fields. + case "time_to": + oElms[nm] = elm; + break; + case "time_from_proxy": + case "time_to_proxy": + oElms[nm] = elm; + u = nm === "time_from_proxy" ? "from" : "to"; + // Create time field. + jq.after( + "" + ); + // Put jQuery UI datepicker on time fields. + jq.datepicker({ + dateFormat: _.dateFormat_datepicker + }); + // Refer time field. + oElms[ "time_" + u + "_time" ] = elm2 = $("input[name=\'log_filter_time_" + u + "_time\']").get(0); + // Set datepicker and time field values. + if((v = _elements.conditions[ u === "from" ? "time_from" : "time_to" ].value) && (v = parseInt(v, 10))) { + jq.datepicker("setDate", d = new Date(v * 1000)); + elm2.value = Judy.timeFormat(d); + } + // Date proxy field handler. + jq.change(function() { + var v, d, nm = this.name.indexOf("from") > 1 ? "from" : "to", r = _elements.conditions[ "time_" + nm ], + rT = _elements.conditions[ "time_" + nm + "_time" ]; + if((v = $.trim(this.value)).length) { + if((d = Judy.dateFromFormat(v, _.dateFormat))) { + _.recordedValues.time_range = _elements.conditions.time_range.value = ""; // Clear time_range. + rT.value = Judy.timeFormat(d, rT.value); + r.value = v = Math.floor(d.getTime() / 1000); + // If time_to, and same as time_from, and no hours/minutes/seconds: make time_to the end of the day. + if(nm === "to" && ("" + v) === _elements.conditions.time_from.value && + d.getHours() === 0 && d.getMinutes() === 0 && d.getSeconds() === 0 + ) { + rT.value = Judy.timeFormat(d, "24"); + r.value = Math.floor(d.getTime() / 1000); + } + else { + _validateTimeSequence(nm, true); + } + } + else { + self.Message.set( self.local("invalid_date", {"!date": v, "!format": _.dateFormat}), "warning", { modal: true }); + r.value = ""; + return; // No change, skip _changedCriterion() + } + } + _changedCriterion(); + }); + // Time field handler. + $(elm2).change(function() { + var nm = this.name.indexOf("from") > -1 ? "from" : "to", rD = _elements.conditions[ "time_" + nm ], d; + // Cant set time when no date. + if(!(d = rD.value)) { + this.value = ""; + return; + } + d = new Date(d * 1000); + this.value = Judy.timeFormat(d, this.value); + rD.value = Math.floor(d / 1000); + _validateTimeSequence(nm); + _changedCriterion(); + }); + break; + case "severity_any": + oElms[nm] = elm; + // Un-check specific severities upon checking severity:any. + jq.change(function() { + var a = _elements.conditions.severity_some, le = a.length, i, v; + if(this.checked) { // Un-check all severity_some. + for(i = 0; i < le; i++) { + a[i].checked = false; + } + } + else { // If no severity_some, re-check severity_any. + for(i = 0; i < le; i++) { + if(a[i].checked) { + v = true; + break; + } + } + if(!v) { + this.checked = "checked"; + return; // No change. + } + } + _changedCriterion(); + }); + break; + case "severity_some": // More elements. + oElms[nm] = jq.get(); + // Un-check severity:any upon change in list of severity. + jq.change(function() { + var a, le, i, someChecked; + if(this.checked) { + _elements.conditions.severity_any.checked = false; + } + else { + le = (a = _elements.conditions.severity_some).length; + for(i = 0; i < le; i++) { + if(a[i].checked) { + someChecked = true; + break; + } + } + if(!someChecked) { + _elements.conditions.severity_any.checked = "checked"; + } + } + _changedCriterion(); + }); + break; + case "type_any": // check list + oElms[nm] = elm; + jq.change(function() { + var elm; + if(this.checked) { + _elements.conditions.type_some.value = ""; + Judy.fieldValue(_elements.conditions.type_proxy, null, "", "checkboxes"); + } + _changedCriterion(); + }); + break; + case "type_some": // Real name: log_filter_type. + oElms[nm] = elm; + _textareaRemoveWrapper(elm); + elm.value = elm.value.replace(/\r/g, ''); + break; + case "type_proxy": // check list + oElms[nm] = elm; + // Un-name checklist options, to prevent backend validation error (Illegal choice...). + // And make list of all options. + $("input[type='checkbox']", par = Judy.ancestor(elm, 'div.form-checkboxes')).each(function() { + this.id = ''; + this.setAttribute('name', ''); + _.recordedValues.type_options.push(this.value); + }); + // Pass values from type_some (hidden textarea; real name: log_filter_type). + Judy.fieldValue(_elements.conditions.type_proxy, _elements.form, $.trim(_elements.conditions.type_some.value).split(/\n/), "checkboxes"); + jq.change(_typeProxyHandler); + // Insert 'Add type' option. + $(par).prepend( + '
' + + '' + + ' ' + + '
' + ); + $('input[name="log_filter_type_proxy_add_item"]', _elements.form).change(function() { + var elm, v; + if (this.checked) { + elm = $('input[name="log_filter_type_proxy_add_item_value"]', _elements.form).get(0); + if ((v = elm.value) && (v = $.trim(Judy.stripTags(v.replace(/[\r\n]/g, ''))))) { + if (Judy.arrayIndexOf(_.recordedValues.type_options, v) === -1) { // IDE may wrongly report error. + _.recordedValues.type_options.push(v); + _elements.conditions.type_some.value += (_elements.conditions.type_some.value ? "\n" : '') + v; + $(elm.parentNode).after( + '
' + + '' + + ' ' + + '
' + ); + $('input[value="' + v +'"]', par).change(_typeProxyHandler); + _elements.conditions.type_any.checked = false; + } + else { + self.Message.set(self.local('type_option_dupe', { '!option': v }), "warning", { + modal: true, + close: function() { + Judy.focus(elm); + } + }); + } + } + this.checked = false; + elm.value = ''; + } + }); + break; + case "role": + oElms[nm] = elm; + // Clear uid when selecting a role. + jq.change(function() { + if(Judy.fieldValue(this)) { + _elements.conditions.uid.value = _elements.conditions.username.value = ""; + } + _changedCriterion(); + }); + break; + case "uid": + oElms[nm] = elm; + _.recordedValues[nm] = elm.value; + // Clear role when setting a uid. + jq.change(function() { + var v = this.value; + if(v !== "") { + this.value = v = $.trim(v); + } + if(v !== "") { + if(!/^\d+$/.test(v)) { + self.Message.set( self.local("invalid_uid"), "warning", { + modal: true, + close: function() { + Judy.focus(_elements.conditions.uid); + } + }); + this.value = v = ""; + } + else { + // Clear role when setting a uid. + Judy.fieldValue(_elements.conditions.role, null, ""); + _elements.conditions.username.value = ''; + } + } + // Always clear username when setting uid. + _elements.conditions.username.value = ''; + if(v !== _.recordedValues.uid) { + _.recordedValues.uid = v; + _changedCriterion(); + } + }); + break; + case "username": + oElms[nm] = elm; + $(elm).autocomplete({ + source: "/log_filter/ajax/username_autocomplete", + minLength: 2, + select: function(event, ui) { + var v; + if (ui.item) { + _elements.conditions.uid.value = (v = ui.item.value); + _elements.conditions.username.value = ui.item.label; + if(v !== _.recordedValues.uid) { + _.recordedValues.uid = v; + Judy.fieldValue(_elements.conditions.role, null, ""); // Clear role when setting a uid. + _changedCriterion(); + } + } + return false; + } + }).bind('autocompletesearch', function() { + $(this).addClass('throbbing'); + }).bind('autocompleteresponse', function() { // Doesnt work, propably old version of jQuery UI. + $(this).removeClass('throbbing'); + }); + Judy.ajaxcomplete(_selectors.conditions.username, '/log_filter/ajax/username_autocomplete', function(event) { // This works, instead. + $(this).removeClass('throbbing'); + }); + break; + case "hostname": + oElms[nm] = elm; + _.recordedValues[nm] = elm.value; + jq.change(function() { + var v = this.value; + if(v !== "") { + this.value = v = Judy.stripTags(v); + } + if(v !== _.recordedValues.hostname) { + _.recordedValues.hostname = v; + _changedCriterion(); + } + }); + break; + case "location": + case "referer": + oElms[nm] = elm; + _.recordedValues[nm]= elm.value; + // Check for url pattern. + jq.change(function() { + var v = $.trim(this.value), nm = this.name === "log_filter_location" ? "location" : "referer"; // Not the same nm as iteration nm ;-) + if(nm === "referer" && (v === "none" || v === "")) { + this.value = "none"; + } + else { + if(v !== "") { + this.value = v = Judy.stripTags(v); + } + if(v !== "" && v !== "*" && !/^https?:\/\/.+$/.test(v)) { + if(!/^https?:\/\/.+$/.test(v = "http://" + v)) { + self.Message.set( self.local(nm === "location" ? "invalid_location" : "invalid_referer"), "warning", { + modal: true, + close: function() { + Judy.focus(_elements.conditions[ nm ]); + } + }); + this.value = v = ""; + } + else { + this.value = v; + } + } + } + if(v !== _.recordedValues[nm]) { + _.recordedValues[nm] = v; + _changedCriterion(); + } + }); + break; + default: + oElms[nm] = elm; + jq.change(_changedCriterion); // Criterion change handler. + } + } + } + // Order by. + oElms = _elements.orderBy; // Array. + if((nOrderBy = (aElms = $(_selectors.orderBy.options).get()).length)) { + for(i = 0; i < nOrderBy; i++) { + oElms.push( + [ elm = aElms[i] ] + ); + _.recordedValues.orderBy.push(Judy.fieldValue(elm)); + // There can't be two orderBys having same value. + $(elm).change(function() { + var v, index, i, a; + if((v = Judy.fieldValue(this)) && v !== "_none") { + index = parseInt(this.name.replace(/^log_filter_orderby_/, ""), 10) - 1; + a = _elements.orderBy; + for(i = 0; i < nOrderBy; i++) { + if(i !== index && Judy.fieldValue(a[i][0]) === v) { + Judy.fieldValue(this, null, v = ""); + break; + } + } + } + if(v !== _.recordedValues.orderBy[index]) { + _.recordedValues.orderBy[index] = v; + _changedCriterion(); + } + }); + } + if((le = (aElms = $(_selectors.orderBy.bools).get()).length)) { + for(i = 0; i < le; i++) { + oElms[i].push( + elm = aElms[i] + ); + $(elm).change(_changedCriterion); + } + } + } + + // Miscellaneous. + oSels = _selectors.pager; + oElms = _elements.pager; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + oElms[nm] = elm; + switch(nm) { + case "first": + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(0, 0); + }); + break; + case "previous": + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(0, (v = _.currentOffset - _.currentMax) > 0 ? v : 0); + }); + break; + case "current": + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(); + }); + break; + case "next": + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(0, _.currentOffset + _.currentMax); + }); + break; + case "last": + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(0, -1); + }); + break; + } + } + } + + // Miscellaneous. + oSels = _selectors.misc; + oElms = _elements.misc; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + oElms[nm] = elm; + } + } + + // Buttons; get element references, and fix some issues. + oSels = _selectors.buttons; + oElms = _elements.buttons; + for(nm in oSels) { + if(oSels.hasOwnProperty(nm) && (elm = (jq = $(oSels[nm])).get(0))) { + switch(nm) { + case "submit": + // Hidden, but we do submit by triggering a click on it anyway, in case Form API sets some javascript behaviour on it. + // ...jQuery behaviour, really. Because a jQuery(elm).trigger("click") apparantly doesnt trigger a real click event(?). + oElms[nm] = elm; + break; + case "update_list": + oElms[nm] = elm; + elm.setAttribute("type", "button"); + jq.unbind(); // Remove Drupal native button handlers. + jq.click(function() { + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(); + }); + Judy.keydown(document.documentElement, "ctr+u cmd+u", function(event) { + event.preventDefault(); + _ajaxRequestingBlocking = true; // Prevent consecutive clicks on update buttons. + _getLogList(); + }); + break; + default: + oElms[nm] = elm; + elm.setAttribute("type", "button"); // Fix type (apparant Form API shortcoming). + jq.unbind(); // Remove Drupal native button handlers. + switch(nm) { + case "create": + case "edit": + case "delete_filter": + case "cancel": + case "save": + _.crudFilters = true; + oElms.crudFilters.push(elm); + jq.click(_crudRelay); // Set our common button handler. + break; + case "delete_logs_button": + _.deleteLogs_allowed = true; + Judy.disable(elm, null, self.local("deleteLogs_prohibit")); + jq.click(_crudRelay); // Set our common button handler. + break; + case "reset": + jq.click(_resetCriteria); + break; + } + } + } + } + + // Prevent click on hover title label span from resulting in checking/unchecking checkbox. + $("label span").click(function(evt) { + evt.stopPropagation(); + return false; + }); + } + catch(er) { + _errorHandler(er, 0, _name + "._prepareForm()"); + } + }; + + self.inspector = function(u) { + inspect(u, {wrappers:1}); + }; + + /** + * Sets current mode. + * + * Values: + * - default + * - adhoc + * - stored + * - create + * - edit + * - delete + * + * @ignore + * @param {string} mode + * @param {boolean} [submit] + * @param {boolean} [initially] + * @return {void} + */ + _setMode = function(mode, submit, initially) { + var fromMode = _.mode, doSubmit, elm, nm; + try { + if(_submitted) { + return; + } + if(!initially && mode !== "delete_filter") { + if(!submit && _.crudFilters) { + // Hide all filter buttons. + $(_elements.buttons.crudFilters).hide(); + } + } + switch(mode) { + case "default": + $("option[value='']", _elements.filter.filter).html( self.local("default") ); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html(self.local("default")); + if(!initially) { + Judy.fieldValue(_elements.filter.filter, null, ""); + _elements.filter.name.value = _.name = _elements.filter.origin.value = _.origin = ""; + } + if(_.crudFilters) { + $(_elements.settings.onlyOwn.parentNode).show(); + $(_elements.buttons.create).show(); + if ((elm = _elements.filter.require_admin)) { + $(elm.parentNode).hide(); + } + $(_elements.filter.name_suggest.parentNode).hide(); + $(_elements.filter.description.parentNode).hide(); + } + if(_.deleteLogs_allowed) { + $(_elements.settings.delete_logs_max).show(); + $(elm = _elements.buttons.delete_logs_button).show(); + $(elm.parentNode).show(); + } + if(fromMode === "create") { + fromMode = ""; // Dont keep 'create' as _.modePrevious. + } + break; + case "adhoc": + if(!initially) { + Judy.fieldValue(_elements.filter.filter, null, ""); + } + if(fromMode === "stored") { + // Pass current name to origin field. + _elements.filter.origin.value = _.origin = nm = _.name; + _elements.filter.name.value = _.name = ""; + $("option[value='']", _elements.filter.filter).html("(" + nm + ")"); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html( self.local("adhocForOrigin", {"!origin": nm} ) ); + } + else { + fromMode = ""; // Dont keep 'create' as _.modePrevious. + $("option[value='']", _elements.filter.filter).html(self.local("adhoc")); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html(self.local("adhoc")); + } + if(_.crudFilters) { + $(_elements.settings.onlyOwn.parentNode).show(); + $(_elements.buttons.create).show(); + if ((elm = _elements.filter.require_admin)) { + $(elm.parentNode).hide(); + } + $(_elements.filter.name_suggest.parentNode).hide(); + $(_elements.filter.description.parentNode).hide(); + } + if(_.deleteLogs_allowed) { + $(_elements.settings.delete_logs_max).show(); + $(elm = _elements.buttons.delete_logs_button).show(); + $(elm.parentNode).show(); + } + break; + case "stored": // stored mode may only appear on page load and after cancelling create. + if(!initially) { + if(fromMode === "create") { + _elements.filter.name.value = _.name = _.origin; + _elements.filter.origin.value = _.origin = ""; + } + Judy.fieldValue(elm = _elements.filter.filter, null, nm = _.name); + $("option[value='']", elm).html( self.local("default") ); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html( nm ); + if(_.crudFilters) { + if ((elm = _elements.filter.require_admin)) { + $(elm.parentNode).hide(); + } + $(_elements.filter.name_suggest.parentNode).hide(); + $(_elements.filter.description.parentNode).hide(); + } + } + if(_.crudFilters) { + $(_elements.settings.onlyOwn.parentNode).show(); + $(_elements.buttons.create).show(); + $(_elements.buttons.edit).show(); + $(_elements.buttons.delete_filter).show(); + } + if(_.deleteLogs_allowed) { + $(_elements.settings.delete_logs_max).show(); + $(elm = _elements.buttons.delete_logs_button).show(); + $(elm.parentNode).show(); + } + switch(fromMode) { + case "create": + case "edit": + fromMode = "stored"; // Dont keep 'create' as _.modePrevious. + break; + } + break; + case "create": + if(!_.crudFilters) { + throw new Error("Mode[" + mode + "] not allowed."); + } + switch(fromMode) { + case "default": + case "adhoc": + $("option[value='']", _elements.filter.filter).html("(" + self.local("newName") + ")"); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html( self.local("newTitle") ); + break; + case "stored": + Judy.fieldValue(_elements.filter.filter, null, ""); + // Pass current name to origin field. + _elements.filter.origin.value = _.origin = nm = _.name; + _elements.filter.name.value = _.name = ""; + $("option[value='']", _elements.filter.filter).html("(" + nm + ")"); // Set visual value of filter selector's empty option. + $(_elements.misc.title).html( self.local("newForOrigin", {"!origin": nm} ) ); + break; + default: + throw new Error("Cant create from mode[" + fromMode + "]."); + } + $(_elements.settings.onlyOwn.parentNode).hide(); + $(_elements.filter.name_suggest.parentNode).show(); + if ((elm = _elements.filter.require_admin)) { + $(elm.parentNode).show(); + } + $(_elements.filter.description.parentNode).show(); + $(_elements.buttons.save).show(); + $(_elements.buttons.cancel).show(); + if(_.deleteLogs_allowed) { + $(_elements.buttons.delete_logs_button.parentNode).hide(); + } + break; + case "edit": + if(!_.crudFilters) { + throw new Error("Mode[" + mode + "] not allowed."); + } + if(fromMode === "create") { + // If going from create to edit: memorize mode right before create, to prevent ending up having (useless) create as previous mode. + fromMode = _.modePrevious; + $("option[value='']", elm = _elements.filter.filter).after( + "" + ); + $("option[value='']", elm).html( self.local("default") ); + Judy.fieldValue(elm, null, nm); + } + if ((elm = _elements.filter.require_admin)) { + $(elm.parentNode).show(); + } + $(_elements.filter.name_suggest.parentNode).hide(); + $(_elements.filter.description.parentNode).show(); + $(_elements.buttons.cancel).show(); + $(_elements.buttons.save).show(); + $(_elements.settings.onlyOwn.parentNode).hide(); + if(_.deleteLogs_allowed) { + $(_elements.buttons.delete_logs_button.parentNode).hide(); + } + break; + case "delete_filter": // Pop confirm(), and submit upon positive confirmation. + if(!_.crudFilters) { + throw new Error("Mode[" + mode + "] not allowed."); + } + Judy.overlay(1, true); // Opaque. + if (_elements.filter.name.value) { + if(!confirm( self.local( + "confirmDelete", + {"!filter": _elements.filter.name.value} + ))) { + Judy.overlay(0); + return; + } + doSubmit = true; + Judy.overlay(1, false, self.local("wait")); // Transparent. + } + else { + throw new Error("Cant delete filter having empty name[" + _elements.filter.name.value + "]."); + } + break; + default: + throw new Error("Mode[" + mode + "] not supported."); + } + _.modePrevious = fromMode; + _elements.settings.mode.value = _.mode = mode; + if(submit || doSubmit) { + _submit(); + } + } + catch(er) { + _errorHandler(er, 0, _name + "._setMode()"); + } + }; + /** + * Common handler for all CRUD buttons. + * + * @ignore + * @return {boolean} + */ + _crudRelay = function() { + var nm = this.name, // The element's name, not _.name. + elm, v, rqa; + try { + switch(nm) { + case "log_filter_reset": + _resetCriteria(); + break; + case "log_filter_create": + _setMode("create"); + Judy.focus(_elements.filter.name_suggest); + break; + case "log_filter_edit": + _setMode("edit"); + break; + case "log_filter_delete": + _setMode("delete_filter"); + break; + case "log_filter_cancel": + switch(_.mode) { + case "create": + case "edit": + switch(_.modePrevious) { + case "default": + case "adhoc": + break; + case "stored": + break; + default: + throw new Error("Previous mode[" + _.modePrevious + "] not supported when cancelling."); + } + _setMode(_.modePrevious); + break; + default: + throw new Error("Cant cancel in mode[" + _.mode + "]."); + } + break; + case "log_filter_save": + if(_.mode === "edit" && !_.saveEditFilterAjaxed) { + Judy.overlay(1, false, self.local("wait_" + _.mode)); + _submit(); + return false; + } + else { + // Prevent double-click. + if(_ajaxRequestingBlocking) { + return false; // false for IE<9's sake. + } + if(_.mode === "create") { + // No reason to trim(), because change handler (_machineNameChange()) replaces spaces with underscores. + if(!_machineNameValidate(null, null, v = (elm = _elements.filter.name_suggest).value)) { + Judy.focus(elm); + return false; // false for IE<9's sake. + } + if($.inArray(v, _filters) > -1) { + Judy.overlay(1, true); + if (!confirm(self.local("error_filter_name_nonunique", {"!name": v}))) { + Judy.overlay(0); + return false; + } + else { + Judy.overlay(1, false, self.local("wait_edit")); + _elements.settings.mode.value = _.mode = "edit"; + _elements.filter.name.value = v; + _submit(); + return false; + } + } + nm = v; + rqa = _elements.filter.require_admin ? 1 : 0; // Create with require_admin if the element exists (the user has the permission). + } + else { + nm = _.name; + rqa = (elm = _elements.filter.require_admin) && Judy.fieldValue(elm); + } + Judy.overlay(1, false, self.local("wait_" + _.mode)); + _ajaxRequestingBlocking = true; + v = self.getCriteria(); + _ajaxRequest("filter_" + _.mode, { // filter_create|filter_edit + name: nm, + filter: { + require_admin: rqa, + description: $.trim(Judy.stripTags(_elements.filter.description.value).replace(/[\r\n\t]/g, " ").replace(/\ +/g, " ")).substr(0, 255) + }, + conditions: v.conditions, + order_by: v.order_by + }); + } + break; + case "log_filter_delete_logs_button": + if(_.deleteLogs_allowed) { + Judy.overlay(1, false, self.local("wait")); + setTimeout(_deleteLogs, 200); + } + else { + throw new Error("Button name[" + nm + "] not allowed."); + } + break; + default: + throw new Error("Unsupported button name[" + nm + "]."); + } + } + catch(er) { + _errorHandler(er, 0, _name + "._crudRelay()"); + } + return false; // false for IE<9's sake. + }; + /** + * Change handler for all condition and orderBy fields. + * + * @ignore + * @return {void} + */ + _changedCriterion = function() { + if(_.deleteLogs_allowed) { + Judy.disable(_elements.buttons.delete_logs_button, null, self.local("deleteLogs_prohibit")); + } + try { + switch(_.mode) { + case "default": + _setMode("adhoc"); + break; + case "adhoc": + break; + case "stored": + // A change of a stored filter triggers edit mode if the user is allowed to edit filters. + _setMode(!_.crudFilters ? "adhoc" : "edit"); + break; + case "create": + break; + case "edit": + break; + case "delete_filter": + break; + default: + throw new Error("Mode[" + _.mode + "] not supported."); + } + } + catch(er) { + _errorHandler(er, 0, _name + "._changedCriterion()"); + } + }; + /** + * Clear all condition and orderby fields, and set defaults. + * + * @ignore + * @param {Event} [evt] + * - when used as event handler + * @param {string|falsy} [mode] + * - set mode to that + * @param {boolean} [noModeChange] + * - do not change mode + * @return {void} + */ + _resetCriteria = function(evt, mode, noModeChange) { + var o = _elements.conditions, nm, r, a, le, i; + if(_.deleteLogs_allowed) { + Judy.disable(_elements.buttons.delete_logs_button, null, self.local("deleteLogs_prohibit")); + } + for(nm in o) { + if(o.hasOwnProperty(nm)) { + r = o[nm]; + // Default to severity any and type any. + switch(nm) { + case "severity_any": + case "type_any": + r.checked = true; + break; + case "severity_some": // Array. + le = r.length; + for(i = 0; i < le; i++) { + r[i].checked = false; + } + break; + case "type_proxy": + if(r) { // Doesnt exists if no logs at all. + Judy.fieldValue(r, null, "", "checkboxes"); + } + break; + default: + r.value = ""; + } + } + } + le = (a = _elements.orderBy).length; + // Default to order by time ascending, only. + for(i = 0; i < le; i++) { + Judy.fieldValue(a[i][0], null, i ? "" : "time"); + a[i][1].checked = i ? false : "checked"; + } + if(!noModeChange) { + // Degrade mode. + if(mode) { + _setMode(mode); + } + else { + _setMode("default"); + } + } + }; + /** + * @ignore + * @return {void} + */ + _deleteLogs = function() { + var o = self.getCriteria(), v, offset = _.currentOffset, max = (v = _elements.settings.delete_logs_max.value) !== "" ? parseInt(v) : 0; + if(!o.nConditions) { // Even stored filters go here; if a stored filter has no conditions, than THAT is the important thing. + // We warn every time, when no conditions at all. + if(!max) { + if (!offset) { + if(!confirm( self.local("deleteLogs_all") )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_noMax", {"!offset": offset}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if (!offset) { + if(!confirm( self.local("deleteLogs_noOffset", {"!max": max}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_noConditions", {"!offset": offset, "!max": max}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(_.mode === "stored") { + if(!max) { + if (!offset) { + if(!confirm( self.local("deleteLogs_storedAll", {"!name": _.name}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_storedNoMax", {"!offset": offset, "!name": _.name}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if (!offset) { + if(!confirm( self.local("deleteLogs_storedNoOffset", {"!max": max, "!name": _.name}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_stored", {"!offset": offset, "!max": max, "!name": _.name}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!max) { + if (!offset) { + if(!confirm( self.local("deleteLogs_adhocAll") )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_adhocNoMax", {"!offset": offset}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if (!offset) { + if(!confirm( self.local("deleteLogs_adhocNoOffset", {"!max": max}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + } + else if(!confirm( self.local("deleteLogs_adhoc", {"!offset": offset, "!max": max}) )) { + Judy.overlay(0); + Judy.focus(_elements.settings.delete_logs_max); + return; + } + _ajaxRequestingBlocking = true; + v = self.getCriteria(); + _ajaxRequest("delete_logs", { + conditions: v.conditions, + order_by: v.order_by, + offset: offset, + max: max + }); + }; + + /** + * @ignore + * @param {Event} evt + * @return {void} + */ + _filterByEventColumn = function(evt) { + var that = evt.target, tag, logId, col, log, u, o = _elements.conditions, elm, elm1, v, v1, a, vShow, username; + if (evt.type === 'contextmenu') { + evt.preventDefault(); + } + // Get out if not td or link within td. + switch ((tag = that.tagName || 'none').toLowerCase()) { + case 'td': + break; + case 'a': // User column may contain link. + username = $(that).text(); + that = that.parentNode; + break; + default: + return; + } + // The td must have column attribute. + if (!(col = that.getAttribute('log_filter_list_event_column'))) { + return; + } + // Parent tr must have a log id attribute, and the log must exist. + if (!(logId = that.parentNode.getAttribute('log_filter_list_event_id')) || + !(log = _logs['_' + logId]) || !_logs.hasOwnProperty('_' + logId) + ) { + return; + } + + switch (col) { + case 'severity': + vShow = self.local(_severity[ log.severity ]); + v = log.severity || 'zero'; + if ((a = Judy.fieldValue(elm = o.severity_some, _elements.form, undefined, 'checklist'))) { + a.push(v); + v = a; + } + Judy.fieldValue(elm, _elements.form, v, 'checklist'); + $(elm).trigger('change'); + break; + case 'type': + // If no such option exists yet: add it. + if (Judy.arrayIndexOf(_.recordedValues.type_options, v = log.type) === -1) { + $('input[name="log_filter_type_proxy_add_item_value"]', _elements.form).val(v); + $('input[name="log_filter_type_proxy_add_item"]', _elements.form).get(0).checked = 'checked'; + $('input[name="log_filter_type_proxy_add_item"]', _elements.form).trigger('change'); + } + else { + if ((a = Judy.fieldValue(elm = o.type_proxy, _elements.form, undefined, 'checklist'))) { + a.push(v); + v = a; + } + Judy.fieldValue(elm, _elements.form, v, 'checklist'); + $('div#edit-log-filter-type-proxy input[value="' + v + '"]').trigger('change'); + } + vShow = v; + break; + case 'time': // Time: right-click/f means Time From, shift+f means Time To. + u = evt.type === 'keydown' && evt.keystrokes !== 'f' ? 'time_to' : 'time_from'; + (elm = o[u + '_proxy']).value = v = log.time.substr(0, 10); + $(elm).trigger('change'); + (elm1 = o[u + '_time']).value = v1 = log.time.substr(11); + $(elm1).trigger('change'); + if (elm.value !== v || elm1.value !== v1) { + return; // Dont set message. + } + col = u; // For Message. + vShow = log.time; + break; + default: + (elm = o[col]).value = vShow = v = log[col]; + $(elm).trigger('change'); + if (col === 'uid' && username) { + _elements.conditions.username.value = username; + } + } + self.Message.set( self.local("filtered_event_column", { '!column': self.local('log_' + col), '!value': vShow }), "info"); + }; + + /** + * @ignore + * @param {integer} [wid] + * - for single log view + * @param {integer|undefined} [offset] + * - default: current offset + * - minus one means last + * @return {void} + */ + _getLogList = function(wid, offset) { + var v = self.getCriteria(); + Judy.overlay(1, false, self.local("wait")); + if(wid) { + v.conditions = { + wid: wid + }; + offset = 0; + } + _ajaxRequest("list_logs", { + conditions: v.conditions, + order_by: v.order_by, + offset: offset || offset === 0 ? offset : _.currentOffset, + max: _.currentMax, + translate: Judy.fieldValue(_elements.settings.translate) + }); + $(_elements.pager.first).addClass("log-filter-pager-button-disabled"); + $(_elements.pager.previous).addClass("log-filter-pager-button-disabled"); + $(_elements.pager.current).hide(); + $(_elements.pager.progress).show(); + $(_elements.pager.next).addClass("log-filter-pager-button-disabled"); + $(_elements.pager.last).addClass("log-filter-pager-button-disabled"); + }; + + /** + * @ignore + * @param {array} logs + * @param {object} conditions + * - list of conditions used, values are always true (except for the 'wid' condition) + * @param {integer} offset + * @param {integer} nTotal + * @return {void} + */ + _listLogs = function(logs, conditions, offset, nTotal) { + var le = logs.length, i, o, v, css = 'log-filter-list', s, nCols = 5, wid, optionalColumns = {}, tabindex = 999; + _logs = {}; + _.currentOffset = offset || 0; + if(le) { + for(i = 0; i < le; i++) { + o = logs[i]; + // Replace variables if exist and not done already by backend (is done if translate is on). + if(o.variables) { + o.message = Drupal.formatString(o.message, o.variables); + } + delete o.variables; + // Resolve severity. + o.severity = parseInt('' + o.severity, 10); + o.severity_string = _severity[o.severity]; + // Set other properties. + o.time = Judy.dateTime(new Date(o.timestamp * 1000)); + if (!o.uid || o.uid === "0") { + o.uid = 0; + o.name = self.local("anonymous_user"); + } + _logs[ "_" + o.wid ] = o; + } + } + // Render. + s = '' + + '' + + '' + + '' + + ''; + if(conditions.hostname || _elements.conditions.hostname.value === '*') { + ++nCols; + optionalColumns.hostname = true; + s += ''; + } + if(conditions.location || _elements.conditions.location.value === '*') { + ++nCols; + optionalColumns.location = true; + s += ''; + } + if(conditions.referer || _elements.conditions.referer.value === '*') { + ++nCols; + optionalColumns.referer = true; + s += ''; + } + s += '' + + ''; + if(le) { + // Listing only a single log (from url)? + if ((wid = conditions.wid) && conditions.hasOwnProperty('wid')) { + s += '' + + '' + + ''; + setTimeout(function() { + self.displayLog(wid); + }, 100); + } + for(i = 0; i < le; i++) { + o = logs[i]; + s += '' + + '' + + '' + + '' + + '' + + (!optionalColumns.hostname ? '' : + '') + + (!optionalColumns.location ? '' : + '') + + (!optionalColumns.referer ? '' : + '') + + '' + + ''; + } + // Pager. + $(_elements.pager.progress).hide(); + if (offset) { + $(_elements.pager.first).removeClass("log-filter-pager-button-disabled"); + $(_elements.pager.previous).removeClass("log-filter-pager-button-disabled"); + } + $(_elements.pager.current).html(self.local('pager_current', { '!first': (offset + 1), '!last': (offset + le), '!total': nTotal })).show(); + if (offset + le < nTotal) { + $(_elements.pager.next).removeClass("log-filter-pager-button-disabled"); + $(_elements.pager.last).removeClass("log-filter-pager-button-disabled"); + } + } + else { + s += '' + + '' + + ''; + // Pager. + $(_elements.pager.progress).hide(); + if (offset) { + $(_elements.pager.first).removeClass("log-filter-pager-button-disabled"); + $(_elements.pager.previous).removeClass("log-filter-pager-button-disabled"); + } + if (!nTotal) { + $(_elements.pager.current).html(self.local('pager_current_none')).show(); + } + else { + $(_elements.pager.current).html(self.local('pager_current_outofrange', { '!offset': offset, '!total': nTotal })).show(); + } + } + s += "
' + Drupal.t('Severity') + '' + Drupal.t('Type') + '' + Drupal.t('Time') + '' + Drupal.t('User') + '' + Drupal.t('Hostname') + '' + Drupal.t('Location') + '' + Drupal.t('Referrer') + '' + Drupal.t('Message') + '
' + + self.local('event_from_url', { '!number': wid }) + + '
 ' + o.type + '' + o.time + '' + (o.name)) : ('>-' + self.local("deleted_user") + '-')) : + ('>' + o.name + '')) + + '' + o.hostname + '' + o.location + '' + o.referer + '
' + + Judy.stripTags(o.message.replace(/\r?\n/g, " ")).substr(0, _.listMessageTruncate) + '
' + + (!conditions.wid ? self.local('no_event_matches') : self.local('non_existing_event', { '!number': conditions.wid })) + + '
"; + // Display the table, after updating pager (displaying the table may take some time). + $("#log_filter_log_list").html(s); + + setTimeout(function() { + // Apply Drupal tableheader. + $('#log_filter_log_list table.sticky-enabled').once('tableheader', function () { + $(this).data("drupal-tableheader", new Drupal.tableHeader(this)); + }); + // Add filter by event column value handlers. + $('table#log_filter_log_list_table').bind('contextmenu', _filterByEventColumn); + Judy.keydown('table#log_filter_log_list_table', 'f shift+f', _filterByEventColumn, true); // preventDefault + }, 100); + }; + + /** + * @ignore + * @param {string} action + * @param {object} oData + * @return {void} + */ + _ajaxRequest = function(action, oData) { + $.ajax({ + url: "/log_filter/ajax/" + action, + type: "POST", + data: oData, + dataType: "json", // expects json formatted response data + cache: false, + /** + * @return {void} + * @param {object} oResp + * - (string) action + * - (boolean) success + * - (string) error + * - (integer) error_code + * @param {string} textStatus + * @param {object} jqXHR + */ + success: function(oResp, textStatus, jqXHR) { + var o; + if(textStatus === "success" && typeof action === "string" && $.type(oResp) === "object") { + _ajaxResponse(action, oResp); + } + else { + o = { + source: "ajax request", + action: action, + textStatus: textStatus, + oResp: oResp + }; + _.errors.push(o); + _errorHandler(null, o, _name + "._ajaxRequest()"); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + var o; + if(jqXHR && jqXHR.status === 403) { + _ajaxResponse(action, { success: false, error_code: _errorCodes.perm_general }); + } + else { + o = { + source: "ajax request", + action: action, + textStatus: textStatus, + errorThrown: errorThrown + }; + _.errors.push(o); + _errorHandler(null, o, _name + "._ajaxRequest()"); + } + } + }); + }; + /** + * @ignore + * @param {string} action + * @param {object} oResp + * @return {void} + */ + _ajaxResponse = function(action, oResp) { + var errorCode = oResp.error_code || 0, url; + // Handle general errors. + if (!oResp.success || errorCode) { + switch(errorCode) { + // General errors. + case _errorCodes.perm_general: // Probably session timeout. + // Reload page, to get 403. And remove form. + $(_elements.form).html(""); + self.Message.set( self.local("error_form_expired", { "!url": url = _url() }), "warning", { // In case Javascript redirect fails. + modal: true, + close: function() { + window.location.href = url; + } + }); + return; + case _errorCodes.form_expired: + self.Message.set( self.local("error_form_expired", { "!url": url = _url() }), "warning", { + modal: true, + close: function() { + window.location.href = url; + } + }); + return; + // Errors by more than one request type. + case _errorCodes.perm_filter_crud: + self.Message.set( self.local("error_perm_filter_crud"), "warning", { + modal: true, + close: function() { + window.location.href = _url(); // Reload to make GUI reflect permissions; omitting create/edit/save/delete controls. + } + }); + return; + case _errorCodes.db_general: // Database error. + self.Message.set( self.local("error_db_general"), "error", { + modal: true, + close: function() { + window.location.href = _url(); + } + }); + break; + // default: Let action function handle the error, and optionally return false if it doesnt know that error code. + } + } + if(_ajaxResponse.hasOwnProperty(action)) { // IE<9 wont like that, has no function.hasOwnProperty() method ;-) + if(!_ajaxResponse[action](oResp)) { + _errorHandler(null, oResp, _name + "._ajaxResponse." + action + "()"); + self.Message.set( self.local("error_unknown"), "error", { + modal: true, + close: function() { + window.location.href = _url(); + } + }); + } + } + else { + _errorHandler(null, oResp, _name + "._ajaxResponse(), unsupported action[" + action + "]"); + } + }; + /** + * @ignore + * @param {object} oResp + * @return {boolean} + */ + _ajaxResponse.filter_create = function(oResp) { // Only saves a default filter with a name; progress to edit mode on success. + var nm = oResp.name; + if(oResp.success) { + _elements.filter.name_suggest.value = ""; + _elements.filter.origin.value = _.origin = _.name; + _elements.filter.name.value = _.name = nm; + _filters.push(nm); + _setMode("edit"); + $(_elements.misc.title).html(nm + " - " + oResp.description + ""); + Judy.overlay(0); + self.Message.set(self.local("savedNew", {"!filter": nm})); + } + else { + switch(oResp.error_code) { + case _errorCodes.filter_name_composition: // Invalid machine name. + Judy.overlay(0); + self.Message.set( self.local("error_machine_name_composition"), "warning", { + modal: true, + close: function() { + Judy.focus(_elements.filter.name_suggest); + } + }); + break; + case _errorCodes.filter_name_nonunique: // Filter name already exists. + Judy.overlay(0); + self.Message.set( self.local("error_filter_name_nonunique", {"!name": nm}), "warning", { + modal: true, + close: function() { + Judy.focus(_elements.filter.name_suggest); + } + }); + break; + default: // Unknown error code. + return false; + } + } + _ajaxRequestingBlocking = false; + return true; + }; + /** + * @ignore + * @param {object} oResp + * @return {boolean} + */ + _ajaxResponse.filter_edit = function(oResp) { + var nm = oResp.name; + if(oResp.success) { + $("span", _elements.misc.title).html(" - " + oResp.description); + Judy.overlay(0); + self.Message.set(self.local("saved", {"!filter": nm})); + } + else if(oResp.error_code === _errorCodes.filter_doesnt_exist) { + self.Message.set( self.local("error_filter_doesnt_exist", {"!name": nm}), "warning", { + modal: true, + close: function() { + window.location.href = _url(); // Reload to make GUI reflect missing filter. + } + }); + } + else if(oResp.error_code === _errorCodes.perm_filter_restricted) { + self.Message.set( self.local("error_perm_filter_restricted"), "error", { + modal: true, + close: function() { + window.location.href = _url(); // Reload to make get out of that situation. + } + }); + } + else { + return false; + } + _ajaxRequestingBlocking = false; + return true; + }; + /** + * @ignore + * @param {object} oResp + * @return {boolean} + */ + _ajaxResponse.list_logs = function(oResp) { + var nm = oResp.name, conditions = oResp.log_list[1]; + if(oResp.success) { + _listLogs(oResp.log_list[0], oResp.log_list[1], oResp.log_list[2], oResp.log_list[3]); + // Deleting logs is allowed when evenever the log list reflects the filter. + if(_.deleteLogs_allowed && + // If wid condition, we list a single log (from url) and thus the list doesnt reflect current filter. + (!conditions.wid || !conditions.hasOwnProperty('wid')) + ) { + Judy.enable(_elements.buttons.delete_logs_button, null, ""); + } + Judy.overlay(0); + } + else { + return false; + } + _ajaxRequestingBlocking = false; + return true; + }; + /** + * @ignore + * @param {object} oResp + * @return {boolean} + */ + _ajaxResponse.delete_logs = function(oResp) { + if(oResp.success) { + self.Message.set(self.local("deleteLogs_success", { "!number": oResp.delete_logs }), "notice", { noFade: false }); + _getLogList(); + return true; + } + else { + return false; + } + }; + + /** + * Does nothing if no Inspect module (or no-action version of Inspect; user not allowed to use frontend instection). + * + * @function + * @name LogFilter.inspect + * @param {string|falsy} [prop] + * @return {void} + */ + this.inspect = function(prop) { + if(typeof window.inspect === "function" && inspect.tcepsni === true) { + inspect(!prop ? _ : _[prop], _name + (!prop ? "" : (" - " + prop))); + } + }; + /** + * @function + * @name LogFilter.inspectElements + * @param {string|falsy} [group] + * @return {void} + */ + this.inspectElements = function(group) { + if(typeof window.inspect === "function" && inspect.tcepsni === true) { + inspect(!group ? _elements : _elements[group], "_elements" + (!group ? "" : ("." + group))); + } + }; + /** + * Caches translated labels/message having no replacers. + * + * @function + * @name LogFilter.local + * @param {string} name + * @param {object|falsy} [replacers] + * @return {string} + */ + this.local = function(name, replacers) { + var nm = name, s; + // S.... Drupal.t() doesnt use the 'g' flag when replace()'ing, so Drupal.t() replacement is utterly useless - and nowhere to report the bug :-( + if(!(s = _oGet(_local, nm))) { + switch(nm) { + case "default": + _local[nm] = s = Drupal.t("Default"); + break; + case "adhoc": + _local[nm] = s = Drupal.t("Ad hoc"); + break; + case "adhocForOrigin": + // {"!origin": nm} + s = Drupal.t("Ad hoc - based on !origin", replacers ); + break; + case "newForOrigin": + // {"!origin": nm} + s = Drupal.t("New - based on !origin", replacers ); + break; + case "newTitle": + _local[nm] = s = Drupal.t("New"); + break; + case "newName": + _local[nm] = s = Drupal.t("new"); + break; + case "savedNew": + // { "!filter": name } + s = Drupal.t("Saved new filter '!filter'.", replacers); + break; + case "saved": + // { "!filter": name } + s = Drupal.t("Saved filter '!filter'.", replacers); + break; + case "confirmDelete": + // { "!filter": _elements.filter.name.value } + s = Drupal.t("Are you sure you want to delete the filter!newline!filter?", replacers); + break; + case "invalid_date": + // {"!date": v, "!format": _.dateFormat} + s = Drupal.t("The date '!date' is not valid!newline- please use the format: !format", replacers); + break; + case "invalid_timeSequence_from": + _local[nm] = s = Drupal.t("'From' time cannot be later than 'To' time."); + break; + case "invalid_timeSequence_to": + _local[nm] = s = Drupal.t("'To' time cannot be earlier than 'From' time."); + break; + case "invalid_uid": + _local[nm] = s = Drupal.t("User ID must be a positive number, or empty."); + break; + case "invalid_location": + _local[nm] = s = Drupal.t("Requested URL must be a URL, or empty."); + break; + case "invalid_referer": + _local[nm] = s = Drupal.t("Referrer URL must be a URL, 'none', or empty."); + break; + case "error_machine_name_composition": + // { "!illegals": "default, adhoc" } + s = Drupal.t("The filter name:!newline- must be 2 to 32 characters long!newline- must only consist of the characters a-z, letters, and underscore (_)!newline- cannot start with a number!newline- cannot be: !illegals", replacers); + break; + case "error_filter_name_nonunique": + // {"!name": name} + s = Drupal.t("There's already a filter named!newline'!name'.!newlineDo you want to overwrite that filter?", replacers); + break; + case "error_filter_doesnt_exist": + // {"!name": name} + s = Drupal.t("There's no filter named!newline'!name'.", replacers); + break; + case "wait": + _local[nm] = s = Drupal.t("Please wait a sec..."); + break; + case "wait_create": + _local[nm] = s = Drupal.t("Creating new filter. Please wait a sec..."); + break; + case "wait_ereate": + _local[nm] = s = Drupal.t("Saving filter changes. Please wait a sec..."); + break; + case "deleteLogs_prohibit": + _local[nm] = s = Drupal.t("Only allowed when the log list is freshly updated,!newlinereflecting current filter - press the 'Update list' button."); + break; + case "deleteLogs_all": + _local[nm] = s = Drupal.t("Do you want to delete!newlineALL logs?"); + break; + case "deleteLogs_noMax": + // {"!offset": offset} + s = Drupal.t("Do you want to delete!newlineALL logs after event no. !offset?", replacers); + break; + case "deleteLogs_noOffset": + // {"!max": max} + s = Drupal.t("Do you want to delete logs!newlinewithout ANY condition!newlineexcept limited by a maximum of !max?", replacers); + break; + case "deleteLogs_noConditions": + // {"!offset": offset, "!max": max} + s = Drupal.t("Do you want to delete logs after event no. !offset!newlinewithout ANY condition!newlineexcept limited by a maximum of !max?", replacers); + break; + case "deleteLogs_storedAll": + // {"!name": name} + s = Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlinelimited by NO maximum?", replacers); + break; + case "deleteLogs_storedNoMax": + // {"!offset": offset, !name": name} + s = Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineafter matching event no. !offset!newlinelimited by NO maximum?", replacers); + break; + case "deleteLogs_storedNoOffset": + // {"!offset": offset, !name": name} + s = Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineexcept limited by a maximum of !max?", replacers); + break; + case "deleteLogs_stored": + // {"!offset": offset, "!max": max, "!name": name} + s = Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineafter matching event no. !offset!newlinelimited by a maximum of !max?", replacers); + break; + case "deleteLogs_adhocAll": + _local[nm] = s = Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlinelimited by NO maximum?"); + break; + case "deleteLogs_adhocNoMax": + // {"!offset": offset} + s = Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineafter matching event no. !offset!newlinelimited by NO maximum?", replacers); + break; + case "deleteLogs_adhocNoOffset": + // {"!max": max} + s = Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineexcept limited by a maximum of !max?", replacers); + break; + case "deleteLogs_adhoc": + // {"!offset": offset, "!max": max} + s = Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineafter matching event no. !offset!newlinelimited by a maximum of !max?", replacers); + break; + case "deleteLogs_success": + // {"!number": integer} + s = Drupal.t("Deleted !number log events.", replacers); + break; + case "error_form_expired": + // {"!url": url} + s = Drupal.t("The form has become outdated!newline- please reload this page.", replacers); + break; + case "error_perm_filter_crud": + _local[nm] = s = Drupal.t("Sorry, you're not allowed to edit saveable filters."); + break; + case "error_perm_filter_restricted": + _local[nm] = s = Drupal.t("You're not allowed to use that filter."); + break; + case "error_db_general": + _local[nm] = s = Drupal.t("Sorry, failed to save data."); + break; + case "error_unknown": + _local[nm] = s = Drupal.t("Sorry, something unexpected happened."); + break; + case "emergency": + _local[nm] = s = Drupal.t("emergency"); + break; + case "alert": + _local[nm] = s = Drupal.t("alert"); + break; + case "critical": + _local[nm] = s = Drupal.t("critical"); + break; + case "error": + _local[nm] = s = Drupal.t("error"); + break; + case "warning": + _local[nm] = s = Drupal.t("warning"); + break; + case "notice": + _local[nm] = s = Drupal.t("notice"); + break; + case "info": + _local[nm] = s = Drupal.t("info"); + break; + case "debug": + _local[nm] = s = Drupal.t("debug"); + break; + case "anonymous_user": + _local[nm] = s = Drupal.t("anonymous"); + break; + case "deleted_user": + _local[nm] = s = Drupal.t("deleted"); + break; + case "log_event": + _local[nm] = s = Drupal.t("Event"); + break; + case "log_severity": + _local[nm] = s = Drupal.t("Severity"); + break; + case "log_type": + _local[nm] = s = Drupal.t("Type"); + break; + case "log_time": + _local[nm] = s = Drupal.t("Time"); + break; + case "log_time_from": + _local[nm] = s = Drupal.t("Time From"); + break; + case "log_time_to": + _local[nm] = s = Drupal.t("Time To"); + break; + case "log_user": + case "log_uid": + _local[nm] = s = Drupal.t("User"); + break; + case "log_location": + _local[nm] = s = Drupal.t("Location"); + break; + case "log_referer": + _local[nm] = s = Drupal.t("Referrer"); + break; + case "log_hostname": + _local[nm] = s = Drupal.t("Hostname"); + break; + case "log_message": + _local[nm] = s = Drupal.t("Message"); + break; + case "log_link": + _local[nm] = s = Drupal.t("Link"); + break; + case "eventItem_display": + // {"!logId": integer} + s = Drupal.t("Event !logId", replacers); + break; + case "eventItemHover_filter": + // {"!logId": logId, '!filter': filter } + s = Drupal.t("Event !logId - press F key (or right-click) to filter !filter", replacers); + break; + case "eventItemHover_severity": + // {"!logId": logId, '!severity': severity} + s = Drupal.t("Event !logId (!severity) - press F key (or right-click) to filter Severity", replacers); + break; + case "eventItemHover_time": + // {"!logId": logId } + s = Drupal.t("Event !logId!newline - press F key (or right-click) to filter Time From!newline - press shift+F to filter Time To", replacers); + break; + case "eventItemHover_user": + // {"!logId": logId, '!uid': uid} + s = Drupal.t("Event !logId (user !uid) - press F key (or right-click) to filter User", replacers); + break; + case "filtered_event_column": + // {"!logId": logId, '!value': value } + s = Drupal.t("Filter !column by '!value'.", replacers); + break; + case "event_link": + _local[nm] = s = Drupal.t("Link to this log event"); + break; + case "no_event_matches": + _local[nm] = s = Drupal.t("The current filter matches no events."); + break; + case "non_existing_event": + // {"!number": integer} + s = Drupal.t("Event ID !number doesn't exist.", replacers); + break; + case "event_from_url": + // {"!number": integer} + s = Drupal.t("Listing event ID !number, according to URL. Press 'Update list' button to reflect current filter.", replacers); + break; + case "add_type_item": + _local[nm] = s = Drupal.t("Add type..."); + break; + case "type_option_dupe": + // {"!option": string} + s = Drupal.t("Type !option already exists.", replacers); + break; + case "pager_current": + // { '!first': (offset + 1), '!last': (offset + le), '!total': nTotal } + s = Drupal.t("!first-!last of !total", replacers); + break; + case "pager_current_none": + _local[nm] = s = Drupal.t("None"); + break; + case "pager_current_outofrange": + // { '!offset': offset, '!total': nTotal } + s = Drupal.t("None after !offset, of !total", replacers); + break; + case "library_judy_incompatible": + // { '!version': version } + s = Drupal.t("Log Filter doesn't work without the Judy library, version !version or newer.", replacers); + break; + default: + s = "[LOCAL: " + nm + "]"; + } + } + return s.replace(/\!newline/g, "\n"); + }; + + /** + * For querying backend. + * + * Must be called delayed (after displaying overlay) to secure that validation (set-up in _prepareForm()) has done it's job. + * + * @function + * @name LogFilter.getCriteria + * @return {object} + */ + this.getCriteria = function() { + var n = 0, conditions = {}, order_by = [], oElms = _elements.conditions, nm, r, v, le, i; + try { + // Rely on validation set-up in _prepareForm(), dont do the same thing once over. + for(nm in oElms) { + if(oElms.hasOwnProperty(nm)) { + r = oElms[nm]; + switch(nm) { + case "time_from_proxy": + case "time_to_proxy": + case "time_from_time": + case "time_to_time": + break; + case "time_range": + case "time_from": + case "time_to": + case "uid": + if((v = r.value) !== "" && (v = $.trim(v)).length && (v = parseInt(v, 10)) > -1) { + ++n; + conditions[nm] = v; + } + break; + case "username": + // Skip, we use uid instead. + break; + case "role": + if((v = Judy.fieldValue(r)) !== "" && v !== "_none" && (v = $.trim(v)) && (v = parseInt(v, 10))) { + ++n; + conditions[nm] = v; + } + break; + case "severity_any": + case "type_any": + case "type_proxy": + // Check at severity_some/type_some instead. + break; + case "severity_some": + if(!oElms.severity_any.checked) { + v = []; + le = r.length; + for(i = 0; i < le; i++) { + if(r[i].checked) { + v.push(r[i].value); + } + } + if(v.length) { + ++n; + conditions.severity = v; + } + } + break; + case "type_some": + if((v = r.value) !== "" && (v = $.trim(v))) { + ++n; + conditions.type = v.split(/\n/); + } + break; + case "hostname": + case "location": + case "referer": + if((v = r.value) !== "" && (v = $.trim(v)) && v !== '*') { + ++n; + conditions[nm] = v; + } + break; + default: + throw new Error("Condition[" + nm + "] not supported."); + } + } + } + le = (oElms = _elements.orderBy).length; + for(i = 0; i < le; i++) { + if((v = Judy.fieldValue(oElms[i][0])) && v !== "_none" && (v = $.trim(v))) { + order_by.push([ + v, + oElms[i][1].checked ? "DESC" : "ASC" + ]); + } + } + } + catch(er) { + _errorHandler(er, 0, _name + ".getCriteria()"); + } + return { + nConditions: n, + conditions: conditions, + order_by: order_by + }; + }; + + /** + * Singleton, instantiated to itself. + * @constructor + * @namespace + * @name LogFilter.Message + * @singleton + */ + this.Message = function() { + var _self = this, + _n = -1, + _htmlList = "
", + _htmlItem = "
__CONTENT__
x
", + _list, + _faders = {}, + /** + * @function + * @name LogFilter.Message._close + * @return {void} + */ + _close = function() { + $(this.parentNode).hide(); + }, + /** + * Message item fader. + * + * Not prototypal because the 'this' of prototypal methods as event handlers is masked by jQuery's element 'this' (or for inline handlers the global window 'this'). + * Could use prototypal methods if we passed the the 'this' of the fader to jQuery handlers, but that would result in lots of references to the fader object (and probably more overall overhead). + * + * @constructor + * @class + * @name LogFilter.Message._fader + * @param {string} selector + * @param {integer|float|falsy} [delay] + * - default: 3000 (milliseconds) + * - if less than 1000 it will be used as multiplier against the default delay + */ + _fader = function(selector, delay) { + var __self = this, + /** + * Default delay. + * + * @name LogFilter.Message._fader#_delayDefault + * @type integer + */ + _delayDefault = 3000, + /** + * Interval setting. + * + * @name LogFilter.Message._fader#_pause + * @type integer + */ + _pause = 150, // Milliseconds. + /** + * Opacity decrease factor setting. + * + * @name LogFilter.Message._fader#_factor + * @type float + */ + _factor = 1.2, + /** + * State. + * + * @name LogFilter.Message._fader#_stopped + * @type boolean + */ + _stopped, + /** + * @name LogFilter.Message._fader#_opacity + * @type integer + */ + _opacity = 100, + /** + * @name LogFilter.Message._fader#_subtractor + * @type integer + */ + _subtractor = 1, + /** + * @function + * @name LogFilter.Message._fader#_start + * @return {void} + */ + _start = function() { + /** @ignore */ + __self._interval = setInterval(_fade, _pause) + }, + /** + * @function + * @name LogFilter.Message._fader#_fade + * @return {void} + */ + _fade = function() { + var n = _opacity, jq = __self._jq; + if(!_stopped) { + if((_opacity = (n -= (_subtractor *= _factor))) > 0) { + if(Judy.browserIE < 11) { + jq.css("opacity", n / 100); + } + else { + jq.css({ + "-ms-filter": "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + (n = Math.round(n)) + ")", + filter: "alpha(opacity=" + n + ")" + }); + } + } + else { + _stopped = true; + clearInterval(__self._interval); + jq.hide(); + } + } + }, + /** @ignore */ + jq; + /** + * @function + * @name LogFilter.Message._fader#stop + * @return {void} + */ + this.stop = function() { + if(!_stopped) { + _stopped = true; + clearTimeout(__self._timeout); + clearInterval(__self._interval); + } + }; + /** + * @function + * @name LogFilter.Message._fader#unfade + * @return {void} + */ + this.unfade = function() { + __self.stop(); + if(_opacity < 100) { + if(Judy.browserIE < 11) { + __self._jq.css("opacity", 1); + } + else { + __self._jq.css({ + "-ms-filter": "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)", + filter: "alpha(opacity=100)" + }); + } + } + }; + /** + * @function + * @name LogFilter.Message._fader#destroy + * @return {void} + */ + this.destroy = function() { + __self.stop(); + delete __self._jq; + }; + // Construction logics. + if((jq = $(selector)).get(0)) { + /** + * @name LogFilter.Message._fader#_jq + * @type jquery + */ + this._jq = jq; + /** @ignore */ + this._timeout = setTimeout( + _start, + !delay ? _delayDefault : (delay < 1000 ? Math.floor(delay * _delayDefault) : _delayDefault) + ); + } + }; + /** + * @function + * @name LogFilter.Message.setup + * @return {void} + */ + this.setup = function() { + var elm, jq; + if((elm = document.getElementById("console"))) { + $(elm).after(_htmlList); + } + else { + $("#content").prepend(_htmlList); + } + _list = document.getElementById("log_filter__message_list"); + // Draggable. + if((jq = $(_list)).draggable) { + jq.draggable({ handle: "div.log-filter--message-content", cancel: "span", cursor: "move" }); + } + }; + /** + * @function + * @name LogFilter.Message.set + * @param {mixed} txt + * @param {string} [type] + * - default: 'status' + * - values: 'status' | 'info' | 'notice' | 'warning' | 'error' + * @param {object} [options] + * - (boolean) noFade: default false ~ a 'status' or 'info' message will eventually fade away, unless clicked/mousedowned + * - (number) fadeDelay: default zero ~ use default delay before starting fade ('status' message only) + * - (number) fadeDelay: >1000 ~ use that delay | < 1000 multiply default delay with that number (both 'status' message only) + * - (boolean) modal: default false ~ do not display blocking overlay + * - (function) close: function to execute upon click on close button + * @param {integer} [delay] + * - default: 4000 (milliseconds) + * @return {void} + */ + this.set = function(txt, type, options) { + var t = type || "status", s, f, k, jq, o = { + noFade: true, + fadeDelay: 0, + modal: false, + close: null + }; + switch(t) { + case "status": + case "info": + o.noFade = false; + break; + case "notice": + case "warning": + break; + default: + t = "error"; + } + if(options) { + for(k in o) { + if(o.hasOwnProperty(k) && options.hasOwnProperty(k)) { + o[k] = options[k]; + } + } + } + // Add message to DOM. + $(_list).prepend( + _htmlItem.replace(/__NO__/, ++_n).replace(/__TYPE__/, t).replace(/__CONTENT__/, txt ? txt.replace(/\n/g, "
") : "") + ); + // Close behaviours. + (jq = $((s = "#log_filter__message_" + _n) + " > div:last-child")).click(_close); + // If modal, show overlay. + if(o.modal) { + jq.click(Judy.overlay); // And hide it on close click. + Judy.overlay(1, true); // Opaque, no hover title. + } + // Close function. + if(o.close) { + jq.click(o.close); + } + // If to be fading, make click on message content unfade the message. + if(!o.noFade) { + _faders[ "_" + _n ] = f = new _fader(s, o.fadeDelay); + $(s + " > div:first-child").bind("click mousedown", f.unfade); // And mousedown, otherwise dragging wont prevent fade. + } + // Display the message. + $(s).show(); + }; + /** + * @function + * @name LogFilter.Message.showAll + * @return {void} + */ + this.showAll = function() { + var le = _n + 1, i, f; + for(i = 0; i < le; i++) { + if((f = _faders[ "_" + i ]) && _faders.hasOwnProperty("_" + i)) { + f.unfade(); + } + $("#log_filter__message_" + i).show(); + } + }; + }; + + /** + * @param {integer|falsy|string} logId + * @return {void} + */ + this.displayLog = function(logId) { + var o, s, v, css = 'log-filter-log-display', dialId = 'log_filter_logDisplay_' + logId, elm, $dialOuter, dialInner; + if ((o = _logs['_' + logId]) && _logs.hasOwnProperty('_' + logId)) { + // If already open: close the dialog. + if ((elm = document.getElementById(dialId))) { + $('#log_filter_list_log_' + logId).removeClass('log-filter-list-displayed'); + Judy.dialog(dialId, "close"); + } + else { + $('#log_filter_list_log_' + logId).addClass('log-filter-list-displayed'); + o = _logs['_' + logId]; + s = '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + (!o.link ? '' : ('')) + + '
' + self.local('log_severity') + '' + (v = o.severity_string) + '
 
' + self.local('log_type') + '' + o.type + '
' + self.local('log_time') + '' + o.time + '
' + self.local('log_user') + '' + (!o.uid ? o.name : ('(' + o.uid + ') ' + o.name + '')) + + '   •   ' + self.local('log_hostname') + ': ' + o.hostname + '
' + self.local('log_location') + '' + o.location + '
' + self.local('log_referer') + '' + (!o.referer ? ' ' : ('' + o.referer + '')) + '
' + self.local('log_message') + '' + o.message + '
' + self.local('log_link') + '' + o.link + '
' + + '
'; + Judy.dialog(dialId, { + title: '' + self.local('log_event') + ': ' + o.wid + '', + content: s, + fixed: true, + resizable: false, + closeOnEscape: false, // Set behaviour that closes all log filter dialogs on escape, disregarding current focus. + dialogClass: "log-filter-log-display-dialog", + contentClass: "log-filter-log-display-content", + autoOpen: false, + close: function(event, ui) { + setTimeout(function() { + $('#log_filter_logDisplay_' + logId).dialog('destroy').remove(); + $('#log_filter_list_log_' + logId).removeClass('log-filter-list-displayed'); + }); + } + }); + ($dialOuter = $( (dialInner = $('#' + dialId).get(0)).parentNode )).css({ + visibility: 'hidden', + overflow: 'visible' + }); + Judy.dialog(dialId, "open"); + Judy.outerWidth($dialOuter, true, Judy.innerWidth(window) - 200, 2); + Judy.outerHeight('#' + dialId, true, + Judy.outerHeight($dialOuter, true, Judy.outerHeight(window) - 10, 1) - + Judy.outerHeight($('div.ui-dialog-titlebar', $dialOuter)) - + Math.ceil(parseFloat($dialOuter.css("padding-top")) + parseFloat($dialOuter.css("padding-bottom"))) - + _.adminOverlayOffset, + 1 + ); + + $dialOuter.css({ + visibility: 'visible', + left: '150px', // jQuery UI dialog position apparantly doesnt work well when css position is fixed. + top: (4 + _.adminOverlayOffset) + 'px' + }); + + // Apply behaviours (if any). + Drupal.attachBehaviors($dialOuter.get(0)); + } + } + }; + + /** + * Called before page load. + * + * @function + * @name LogFilter.init + * @param {boolean|integer} useModuleCss + * @param {string} theme + * @return {void} + */ + this.init = function(useModuleCss, theme) { + var v; + /** @ignore */ + self.init = function() {}; + + // Make sure Judy exists and is version 2.0+. + if (typeof window.Judy !== 'object' || !(v = Judy.version) || Judy.version < _.library_judy_version) { + _.library_judy_compatible = false; + return; + } + + // Tell styles about theme. + if((_.useModuleCss = useModuleCss)) { + $("div#page").addClass("theme-" + theme); + } + // Set overlay, to prevent user from doing anything before page load and after form submission. + Judy.overlay(1, false, self.local("wait")); + }; + /** + * Called upon page load. + * + * @function + * @name LogFilter.setup + * @param {object} [filters] + * @param {array} [messages] + * @return {void} + */ + this.setup = function(filters, messages) { + var a = messages, le, i, o = { fadeDelay: 2 }, url, wid; // Long (double) delay when at page load. + /** @ignore */ + self.setup = function() {}; + _filters = filters || []; + + if (!_.library_judy_compatible) { + alert(self.local('library_judy_incompatible', { '!version': _.library_judy_version })); + return; + } + + _prepareForm(); + _setMode(_.mode, false, true); + + // Display messages, if any. + (self.Message = new self.Message()).setup(); + if(a) { + le = a.length; + // Check if any message isnt of type status; status message should fade, unless there's another message of a different (more urgent) type. + for(i = 0; i < le; i++) { + if(a[i][1] && a[i][1] !== "status") { + o.noFade = true; + break; + } + } + for(i = 0; i < le; i++) { + self.Message.set(a[i][0], a[i][1], o); + } + } + + // Set title attribute of all labels containing a span that has a non-empty title attribute. + $('label > span[title]').each(function() { + var t = this.getAttribute('title'); + if (t) { + this.parentNode.setAttribute('title', t); + } + }); + + // Check if administrative Overlay is on. + if (!/^#overlay=admin\//.test(top.location.hash)) { + url = window.location.href; + _.adminOverlayOffset = 0; + } + else { + url = top.location.href + top.location.hash; + } + + // Prepare log list. + _getLogList( + // Check if url ends with /integer ~ single log view. + /^.+\/(\d+)\/?$/.test(url) && (wid = parseInt(url.replace(/^.+\/(\d+)\/?$/, '$1'), 10)) && + wid <= Math.pow(2, 31) ? wid : 0 + ); + + // Make all event dialogs close on escape, and no matter what has focus. + Judy.keydown(document.documentElement, "escape", function() { + $('div.log-filter-log-display-content').each(function() { + $(this).dialog("close"); + }); + }); + + Judy.overlay(0); + }; + } + window.LogFilter = new LogFilter($); + +})(jQuery); diff --git a/sites/all/modules/contrib/admin/log_filter/js/log_filter.min.js b/sites/all/modules/contrib/admin/log_filter/js/log_filter.min.js new file mode 100644 index 00000000..0cf51603 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/js/log_filter.min.js @@ -0,0 +1,1063 @@ +(function($){var LogFilter=function($){var self=this,_name="LogFilter",_errorCodes={unknown:1,algo:100,use:101,perm_general:200,form_expired:201,perm_filter_crud:202,perm_filter_restricted:203,db_general:500,filter_name_composition:1001,filter_name_nonunique:1002,filter_doesnt_exist:1003,bad_filter_condition:1010},_={errors:[],dateFormat:"YYYY-MM-DD",dateFormat_datepicker:"yy-mm-dd",mode:"default",modePrevious:"default",name:"",origin:"",crudFilters:false,recordedValues:{time_range:"",uid:"",hostname:"",location:"",referer:"",orderBy:[],type_options:[]},deleteLogs_allowed:false,saveEditFilterAjaxed:false,listMessageTruncate:250,adminOverlayOffset:80,currentOffset:0,currentMax:100,logs:{},library_judy_version:2.1,library_judy_compatible:true},_severity=["emergency","alert","critical","error","warning","notice","info","debug"],_submitted,_ajaxRequestingBlocking,_local={},_selectors={page:"div#page",form:"form#log-filter-form",settings:{mode:"input[name='log_filter_mode']",onlyOwn:"input[name='log_filter_only_own']",delete_logs_max:"input[name='log_filter_delete_logs_max']",translate:"input[name='log_filter_translate']",pager_range:"input[name='log_filter_pager_range']"},filter:{filter:"select[name='log_filter_filter']",name:"input[name='log_filter_name']",origin:"input[name='log_filter_origin']",name_suggest:"input[name='log_filter_name_suggest']",description:"textarea[name='log_filter_description']",require_admin:"input[name='log_filter_require_admin']"},conditions:{time_range:"input[name='log_filter_time_range']",time_from:"input[name='log_filter_time_from']",time_from_proxy:"input[name='log_filter_time_from_proxy']",time_to:"input[name='log_filter_time_to']",time_to_proxy:"input[name='log_filter_time_to_proxy']",severity_any:"input[name='log_filter_severity[-1]']",severity_some:"div#edit-log-filter-severity input:not([name='log_filter_severity[-1]'])",type_any:"input[name='log_filter_type_wildcard']",type_some:"textarea[name='log_filter_type']",type_proxy:"div#edit-log-filter-type-proxy input",role:"select[name='log_filter_role']",uid:"input[name='log_filter_uid']",username:"input[name='log_filter_username']",hostname:"input[name='log_filter_hostname']",location:"input[name='log_filter_location']",referer:"input[name='log_filter_referer']"},orderBy:{options:"div.filter-orderby select",bools:"div.filter-orderby input[type='checkbox']"},buttons:{submit:"input#edit-submit",update_list:"input[name='log_filter_update_list']",reset:"input[name='log_filter_reset']",create:"input[name='log_filter_create']",edit:"input[name='log_filter_edit']",delete_filter:"input[name='log_filter_delete']",cancel:"input[name='log_filter_cancel']",save:"input[name='log_filter_save']",delete_logs_button:"input[name='log_filter_delete_logs_button']"},pager:{first:"div#log_filter_pager_first",previous:"div#log_filter_pager_previous",current:"div#log_filter_pager_current",progress:"div#log_filter_pager_progress",next:"div#log_filter_pager_next",last:"div#log_filter_pager_last"},misc:{title:"#log_filter_title_display"}},_elements={settings:{},filter:{},conditions:{},orderBy:[],buttons:{crudFilters:[]},pager:{},misc:{}},_filters=[],_logs={},_errorHandler,_oGet,_toAscii,_textareaRemoveWrapper,_machineNameConvert,_machineNameIllegals,_machineNameValidate,_validateTimeSequence,_url,_submit,_typeProxyHandler,_prepareForm,_setMode,_crudRelay,_changedCriterion,_resetCriteria,_deleteLogs,_filterByEventColumn,_getLogList,_listLogs,_ajaxResponse,_ajaxRequest; +_errorHandler=function(error,variable,options){var u=options,o={},t; +if(typeof window.inspect==="function"&&inspect.tcepsni){if(typeof inspect.errorHandler==="function"){if(u){if((t=typeof u)==="string"){o.message=u; +o.wrappers=1; +}else{if(t==="object"){o=u; +o.wrappers=!u.wrappers?1:(u.wrappers+1); +}}}o.category="log_filter"; +inspect.errorHandler(error,variable,o); +}else{inspect.console("Please update Inspect."); +}}}; +_oGet=function(o,k0,k1){var t=typeof o; +return o&&(t==="object"||t==="function")&&o.hasOwnProperty(k0)?(k1===undefined?o[k0]:((o=o[k0])&&((t=typeof o)==="object"||t==="function")&&o.hasOwnProperty(k1)?o[k1]:undefined)):undefined; +}; +_toAscii=function(s){var ndl=_toAscii.needles,rpl=_toAscii.replacers,le=ndl.length,i,u; +if(typeof ndl[0]==="string"){u=ndl.concat(); +for(i=0; +i1&&!rgx.test(v)){if(!rgx.test(v=v.toLowerCase())){if(!rgx.test(v=v.replace(/[ \-]/g,"_"))){if(!rgx.test(v=_toAscii(v))){v=v.replace(/[^a-z\d_]/g,"_"); +}}}this.value=v; +}}; +_machineNameIllegals=["log_filter","default","adhoc"]; +_machineNameValidate=function(evt,elm,value,noFeedback){var v=evt?this.value:(elm?elm.value:value),le=v.length; +if(le<2||le>32||!/[a-z_]/.test(v.charAt(0))||!/[a-z\d_]/.test(v)||$.inArray(v.toLowerCase(),_machineNameIllegals)>-1){if(!noFeedback){self.Message.set(self.local("error_machine_name_composition",{"!illegals":_machineNameIllegals.join(", ")}),"warning",{modal:true,close:function(){Judy.focus(_elements.filter.name_suggest); +}}); +}return false; +}return true; +}; +_validateTimeSequence=function(nm,date){var o=_elements.conditions,v,from=(v=o.time_from.value)?parseInt(v,10):0,to; +if(from&&(to=(v=o.time_to.value)?parseInt(v,10):0)&&from>to){if(date&&$.trim(o.time_to_proxy.value)===$.trim(o.time_from_proxy.value)){return true; +}o["time_"+nm].value=o["time_"+nm+"_proxy"].value=o["time_"+nm+"_time"].value=""; +self.Message.set(self.local("invalid_timeSequence_"+nm),"warning",{modal:true}); +return false; +}return true; +}; +_url=function(top){var loc=(!top?window:top).location,v; +return loc.protocol+"//"+loc.hostname+(!(v=loc.port)?"":(":"+v))+loc.pathname.replace(/\/dblog(\/.+)?$/,"/dblog/log_filter"); +}; +_submit=function(){var nm="",elm; +if(_submitted){return; +}_submitted=true; +switch(_.mode){case"adhoc":nm="adhoc"; +break; +case"stored":nm=_.name; +break; +}_elements.form.setAttribute("action",_elements.form.getAttribute("action").replace(/\/dblog(\/[^\?&]+)([\?&].+)?$/,"/dblog/log_filter/"+nm+"$2")); +setTimeout(function(){$(_elements.buttons.submit).trigger("click"); +},100); +}; +_typeProxyHandler=function(){var v,i; +if(this.checked){_elements.conditions.type_any.checked=false; +if(Judy.arrayIndexOf(v=$.trim(_elements.conditions.type_some.value).split(/\n/),this.value)===-1){v.push(this.value); +_elements.conditions.type_some.value=$.trim(v.join("\n")); +}}else{if((i=Judy.arrayIndexOf(v=$.trim(_elements.conditions.type_some.value).split(/\n/),this.value))>-1){v.splice(i,1); +if(v.length){_elements.conditions.type_some.value=$.trim(v.join("\n")); +}else{_elements.conditions.type_some.value=""; +_elements.conditions.type_any.checked="checked"; +}}}_changedCriterion(); +}; +_prepareForm=function(){var oSels,oElms,nm,jq,elm,par,aElms,a,le,i,v,nOrderBy,u,elm2,d; +try{_elements.page=$(_selectors.page).get(0); +_elements.form=$(_selectors.form).get(0); +oSels=_selectors.filter; +oElms=_elements.filter; +for(nm in oSels){if(oSels.hasOwnProperty(nm)&&(elm=(jq=$(oSels[nm])).get(0))){oElms[nm]=elm; +switch(nm){case"filter":jq.change(function(){var v; +_elements.filter.name.value=_.name=v=Judy.fieldValue(this); +_elements.settings.mode.value=_.mode=v?"stored":"default"; +if(!v){_resetCriteria(null,"default"); +return; +}Judy.overlay(1,false,self.local("wait")); +_submit(); +}); +break; +case"name_suggest":jq.keyup(_machineNameConvert); +break; +case"description":_textareaRemoveWrapper(elm); +jq.change(function(){var v; +if((v=this.value)){this.value=Judy.stripTags(v); +}}); +break; +}}}_.name=_elements.filter.name.value; +_.origin=_elements.filter.origin.value; +oSels=_selectors.settings; +oElms=_elements.settings; +for(nm in oSels){if(oSels.hasOwnProperty(nm)&&(elm=(jq=$(oSels[nm])).get(0))){oElms[nm]=elm; +switch(nm){case"mode":_.mode=elm.value; +break; +case"onlyOwn":jq.change(function(){if(_.mode==="stored"){_elements.settings.mode.value="adhoc"; +Judy.fieldValue(_elements.filter.filter,null,""); +_elements.filter.origin.value=_.name; +_elements.filter.name.value=""; +}Judy.overlay(1,false,self.local("wait")); +_submit(); +}); +break; +case"delete_logs_max":jq.change(function(){var v=this.value; +if(v!==""){if((v=$.trim(v))!==""&&!/^[1-9]\d*$/.test(v)){v=""; +}this.value=v; +}}); +break; +case"pager_range":_.currentMax=parseInt(elm.value,10); +if($(_selectors.buttons.delete_logs_button).get(0)){oElms.delete_logs_max.value=_.currentMax; +}jq.change(function(){var v=this.value,n,m; +if(v!==""){if((v=$.trim(v))!==""&&/^\d+$/.test(v)){_.currentMax=n=parseInt(v,10); +if(_.deleteLogs_allowed&&((m=_elements.settings.delete_logs_max.value)===""||(m=parseInt(m,10))>n)){_elements.settings.delete_logs_max.value=n; +}}else{v=""; +}this.value=v; +}}); +break; +}}}oSels=_selectors.conditions; +oElms=_elements.conditions; +for(nm in oSels){if(oSels.hasOwnProperty(nm)&&(elm=(jq=$(oSels[nm])).get(0))){switch(nm){case"time_range":oElms[nm]=elm; +_.recordedValues[nm]=elm.value; +jq.change(function(){var v=this.value,o; +if(v!==""){this.value=v=$.trim(v); +}if(v!==""){if(v==="0"||!/^[1-9]\d*$/.test(v)){this.value=v=""; +}else{if(v.length>4){this.value=v="9999"; +}(o=_elements.conditions).time_from.value=o.time_from_proxy.value=o.time_from_time.value=o.time_to.value=o.time_to_proxy.value=o.time_to_time.value=""; +}}if(v!==_.recordedValues.time_range){_.recordedValues.time_range=v; +_changedCriterion(); +}}); +break; +case"time_from":case"time_to":oElms[nm]=elm; +break; +case"time_from_proxy":case"time_to_proxy":oElms[nm]=elm; +u=nm==="time_from_proxy"?"from":"to"; +jq.after(''); +jq.datepicker({dateFormat:_.dateFormat_datepicker}); +oElms["time_"+u+"_time"]=elm2=$("input[name='log_filter_time_"+u+"_time']").get(0); +if((v=_elements.conditions[u==="from"?"time_from":"time_to"].value)&&(v=parseInt(v,10))){jq.datepicker("setDate",d=new Date(v*1000)); +elm2.value=Judy.timeFormat(d); +}jq.change(function(){var v,d,nm=this.name.indexOf("from")>1?"from":"to",r=_elements.conditions["time_"+nm],rT=_elements.conditions["time_"+nm+"_time"]; +if((v=$.trim(this.value)).length){if((d=Judy.dateFromFormat(v,_.dateFormat))){_.recordedValues.time_range=_elements.conditions.time_range.value=""; +rT.value=Judy.timeFormat(d,rT.value); +r.value=v=Math.floor(d.getTime()/1000); +if(nm==="to"&&(""+v)===_elements.conditions.time_from.value&&d.getHours()===0&&d.getMinutes()===0&&d.getSeconds()===0){rT.value=Judy.timeFormat(d,"24"); +r.value=Math.floor(d.getTime()/1000); +}else{_validateTimeSequence(nm,true); +}}else{self.Message.set(self.local("invalid_date",{"!date":v,"!format":_.dateFormat}),"warning",{modal:true}); +r.value=""; +return; +}}_changedCriterion(); +}); +$(elm2).change(function(){var nm=this.name.indexOf("from")>-1?"from":"to",rD=_elements.conditions["time_"+nm],d; +if(!(d=rD.value)){this.value=""; +return; +}d=new Date(d*1000); +this.value=Judy.timeFormat(d,this.value); +rD.value=Math.floor(d/1000); +_validateTimeSequence(nm); +_changedCriterion(); +}); +break; +case"severity_any":oElms[nm]=elm; +jq.change(function(){var a=_elements.conditions.severity_some,le=a.length,i,v; +if(this.checked){for(i=0; +i
'); +$('input[name="log_filter_type_proxy_add_item"]',_elements.form).change(function(){var elm,v; +if(this.checked){elm=$('input[name="log_filter_type_proxy_add_item_value"]',_elements.form).get(0); +if((v=elm.value)&&(v=$.trim(Judy.stripTags(v.replace(/[\r\n]/g,""))))){if(Judy.arrayIndexOf(_.recordedValues.type_options,v)===-1){_.recordedValues.type_options.push(v); +_elements.conditions.type_some.value+=(_elements.conditions.type_some.value?"\n":"")+v; +$(elm.parentNode).after('
"); +$('input[value="'+v+'"]',par).change(_typeProxyHandler); +_elements.conditions.type_any.checked=false; +}else{self.Message.set(self.local("type_option_dupe",{"!option":v}),"warning",{modal:true,close:function(){Judy.focus(elm); +}}); +}}this.checked=false; +elm.value=""; +}}); +break; +case"role":oElms[nm]=elm; +jq.change(function(){if(Judy.fieldValue(this)){_elements.conditions.uid.value=_elements.conditions.username.value=""; +}_changedCriterion(); +}); +break; +case"uid":oElms[nm]=elm; +_.recordedValues[nm]=elm.value; +jq.change(function(){var v=this.value; +if(v!==""){this.value=v=$.trim(v); +}if(v!==""){if(!/^\d+$/.test(v)){self.Message.set(self.local("invalid_uid"),"warning",{modal:true,close:function(){Judy.focus(_elements.conditions.uid); +}}); +this.value=v=""; +}else{Judy.fieldValue(_elements.conditions.role,null,""); +_elements.conditions.username.value=""; +}}_elements.conditions.username.value=""; +if(v!==_.recordedValues.uid){_.recordedValues.uid=v; +_changedCriterion(); +}}); +break; +case"username":oElms[nm]=elm; +$(elm).autocomplete({source:"/log_filter/ajax/username_autocomplete",minLength:2,select:function(event,ui){var v; +if(ui.item){_elements.conditions.uid.value=(v=ui.item.value); +_elements.conditions.username.value=ui.item.label; +if(v!==_.recordedValues.uid){_.recordedValues.uid=v; +Judy.fieldValue(_elements.conditions.role,null,""); +_changedCriterion(); +}}return false; +}}).bind("autocompletesearch",function(){$(this).addClass("throbbing"); +}).bind("autocompleteresponse",function(){$(this).removeClass("throbbing"); +}); +Judy.ajaxcomplete(_selectors.conditions.username,"/log_filter/ajax/username_autocomplete",function(event){$(this).removeClass("throbbing"); +}); +break; +case"hostname":oElms[nm]=elm; +_.recordedValues[nm]=elm.value; +jq.change(function(){var v=this.value; +if(v!==""){this.value=v=Judy.stripTags(v); +}if(v!==_.recordedValues.hostname){_.recordedValues.hostname=v; +_changedCriterion(); +}}); +break; +case"location":case"referer":oElms[nm]=elm; +_.recordedValues[nm]=elm.value; +jq.change(function(){var v=$.trim(this.value),nm=this.name==="log_filter_location"?"location":"referer"; +if(nm==="referer"&&(v==="none"||v==="")){this.value="none"; +}else{if(v!==""){this.value=v=Judy.stripTags(v); +}if(v!==""&&v!=="*"&&!/^https?:\/\/.+$/.test(v)){if(!/^https?:\/\/.+$/.test(v="http://"+v)){self.Message.set(self.local(nm==="location"?"invalid_location":"invalid_referer"),"warning",{modal:true,close:function(){Judy.focus(_elements.conditions[nm]); +}}); +this.value=v=""; +}else{this.value=v; +}}}if(v!==_.recordedValues[nm]){_.recordedValues[nm]=v; +_changedCriterion(); +}}); +break; +default:oElms[nm]=elm; +jq.change(_changedCriterion); +}}}oElms=_elements.orderBy; +if((nOrderBy=(aElms=$(_selectors.orderBy.options).get()).length)){for(i=0; +i0?v:0); +}); +break; +case"current":jq.click(function(){_ajaxRequestingBlocking=true; +_getLogList(); +}); +break; +case"next":jq.click(function(){_ajaxRequestingBlocking=true; +_getLogList(0,_.currentOffset+_.currentMax); +}); +break; +case"last":jq.click(function(){_ajaxRequestingBlocking=true; +_getLogList(0,-1); +}); +break; +}}}oSels=_selectors.misc; +oElms=_elements.misc; +for(nm in oSels){if(oSels.hasOwnProperty(nm)&&(elm=(jq=$(oSels[nm])).get(0))){oElms[nm]=elm; +}}oSels=_selectors.buttons; +oElms=_elements.buttons; +for(nm in oSels){if(oSels.hasOwnProperty(nm)&&(elm=(jq=$(oSels[nm])).get(0))){switch(nm){case"submit":oElms[nm]=elm; +break; +case"update_list":oElms[nm]=elm; +elm.setAttribute("type","button"); +jq.unbind(); +jq.click(function(){_ajaxRequestingBlocking=true; +_getLogList(); +}); +Judy.keydown(document.documentElement,"ctr+u cmd+u",function(event){event.preventDefault(); +_ajaxRequestingBlocking=true; +_getLogList(); +}); +break; +default:oElms[nm]=elm; +elm.setAttribute("type","button"); +jq.unbind(); +switch(nm){case"create":case"edit":case"delete_filter":case"cancel":case"save":_.crudFilters=true; +oElms.crudFilters.push(elm); +jq.click(_crudRelay); +break; +case"delete_logs_button":_.deleteLogs_allowed=true; +Judy.disable(elm,null,self.local("deleteLogs_prohibit")); +jq.click(_crudRelay); +break; +case"reset":jq.click(_resetCriteria); +break; +}}}}$("label span").click(function(evt){evt.stopPropagation(); +return false; +}); +}catch(er){_errorHandler(er,0,_name+"._prepareForm()"); +}}; +self.inspector=function(u){inspect(u,{wrappers:1}); +}; +_setMode=function(mode,submit,initially){var fromMode=_.mode,doSubmit,elm,nm; +try{if(_submitted){return; +}if(!initially&&mode!=="delete_filter"){if(!submit&&_.crudFilters){$(_elements.buttons.crudFilters).hide(); +}}switch(mode){case"default":$("option[value='']",_elements.filter.filter).html(self.local("default")); +$(_elements.misc.title).html(self.local("default")); +if(!initially){Judy.fieldValue(_elements.filter.filter,null,""); +_elements.filter.name.value=_.name=_elements.filter.origin.value=_.origin=""; +}if(_.crudFilters){$(_elements.settings.onlyOwn.parentNode).show(); +$(_elements.buttons.create).show(); +if((elm=_elements.filter.require_admin)){$(elm.parentNode).hide(); +}$(_elements.filter.name_suggest.parentNode).hide(); +$(_elements.filter.description.parentNode).hide(); +}if(_.deleteLogs_allowed){$(_elements.settings.delete_logs_max).show(); +$(elm=_elements.buttons.delete_logs_button).show(); +$(elm.parentNode).show(); +}if(fromMode==="create"){fromMode=""; +}break; +case"adhoc":if(!initially){Judy.fieldValue(_elements.filter.filter,null,""); +}if(fromMode==="stored"){_elements.filter.origin.value=_.origin=nm=_.name; +_elements.filter.name.value=_.name=""; +$("option[value='']",_elements.filter.filter).html("("+nm+")"); +$(_elements.misc.title).html(self.local("adhocForOrigin",{"!origin":nm})); +}else{fromMode=""; +$("option[value='']",_elements.filter.filter).html(self.local("adhoc")); +$(_elements.misc.title).html(self.local("adhoc")); +}if(_.crudFilters){$(_elements.settings.onlyOwn.parentNode).show(); +$(_elements.buttons.create).show(); +if((elm=_elements.filter.require_admin)){$(elm.parentNode).hide(); +}$(_elements.filter.name_suggest.parentNode).hide(); +$(_elements.filter.description.parentNode).hide(); +}if(_.deleteLogs_allowed){$(_elements.settings.delete_logs_max).show(); +$(elm=_elements.buttons.delete_logs_button).show(); +$(elm.parentNode).show(); +}break; +case"stored":if(!initially){if(fromMode==="create"){_elements.filter.name.value=_.name=_.origin; +_elements.filter.origin.value=_.origin=""; +}Judy.fieldValue(elm=_elements.filter.filter,null,nm=_.name); +$("option[value='']",elm).html(self.local("default")); +$(_elements.misc.title).html(nm); +if(_.crudFilters){if((elm=_elements.filter.require_admin)){$(elm.parentNode).hide(); +}$(_elements.filter.name_suggest.parentNode).hide(); +$(_elements.filter.description.parentNode).hide(); +}}if(_.crudFilters){$(_elements.settings.onlyOwn.parentNode).show(); +$(_elements.buttons.create).show(); +$(_elements.buttons.edit).show(); +$(_elements.buttons.delete_filter).show(); +}if(_.deleteLogs_allowed){$(_elements.settings.delete_logs_max).show(); +$(elm=_elements.buttons.delete_logs_button).show(); +$(elm.parentNode).show(); +}switch(fromMode){case"create":case"edit":fromMode="stored"; +break; +}break; +case"create":if(!_.crudFilters){throw new Error("Mode["+mode+"] not allowed."); +}switch(fromMode){case"default":case"adhoc":$("option[value='']",_elements.filter.filter).html("("+self.local("newName")+")"); +$(_elements.misc.title).html(self.local("newTitle")); +break; +case"stored":Judy.fieldValue(_elements.filter.filter,null,""); +_elements.filter.origin.value=_.origin=nm=_.name; +_elements.filter.name.value=_.name=""; +$("option[value='']",_elements.filter.filter).html("("+nm+")"); +$(_elements.misc.title).html(self.local("newForOrigin",{"!origin":nm})); +break; +default:throw new Error("Cant create from mode["+fromMode+"]."); +}$(_elements.settings.onlyOwn.parentNode).hide(); +$(_elements.filter.name_suggest.parentNode).show(); +if((elm=_elements.filter.require_admin)){$(elm.parentNode).show(); +}$(_elements.filter.description.parentNode).show(); +$(_elements.buttons.save).show(); +$(_elements.buttons.cancel).show(); +if(_.deleteLogs_allowed){$(_elements.buttons.delete_logs_button.parentNode).hide(); +}break; +case"edit":if(!_.crudFilters){throw new Error("Mode["+mode+"] not allowed."); +}if(fromMode==="create"){fromMode=_.modePrevious; +$("option[value='']",elm=_elements.filter.filter).after('"); +$("option[value='']",elm).html(self.local("default")); +Judy.fieldValue(elm,null,nm); +}if((elm=_elements.filter.require_admin)){$(elm.parentNode).show(); +}$(_elements.filter.name_suggest.parentNode).hide(); +$(_elements.filter.description.parentNode).show(); +$(_elements.buttons.cancel).show(); +$(_elements.buttons.save).show(); +$(_elements.settings.onlyOwn.parentNode).hide(); +if(_.deleteLogs_allowed){$(_elements.buttons.delete_logs_button.parentNode).hide(); +}break; +case"delete_filter":if(!_.crudFilters){throw new Error("Mode["+mode+"] not allowed."); +}Judy.overlay(1,true); +if(_elements.filter.name.value){if(!confirm(self.local("confirmDelete",{"!filter":_elements.filter.name.value}))){Judy.overlay(0); +return; +}doSubmit=true; +Judy.overlay(1,false,self.local("wait")); +}else{throw new Error("Cant delete filter having empty name["+_elements.filter.name.value+"]."); +}break; +default:throw new Error("Mode["+mode+"] not supported."); +}_.modePrevious=fromMode; +_elements.settings.mode.value=_.mode=mode; +if(submit||doSubmit){_submit(); +}}catch(er){_errorHandler(er,0,_name+"._setMode()"); +}}; +_crudRelay=function(){var nm=this.name,elm,v,rqa; +try{switch(nm){case"log_filter_reset":_resetCriteria(); +break; +case"log_filter_create":_setMode("create"); +Judy.focus(_elements.filter.name_suggest); +break; +case"log_filter_edit":_setMode("edit"); +break; +case"log_filter_delete":_setMode("delete_filter"); +break; +case"log_filter_cancel":switch(_.mode){case"create":case"edit":switch(_.modePrevious){case"default":case"adhoc":break; +case"stored":break; +default:throw new Error("Previous mode["+_.modePrevious+"] not supported when cancelling."); +}_setMode(_.modePrevious); +break; +default:throw new Error("Cant cancel in mode["+_.mode+"]."); +}break; +case"log_filter_save":if(_.mode==="edit"&&!_.saveEditFilterAjaxed){Judy.overlay(1,false,self.local("wait_"+_.mode)); +_submit(); +return false; +}else{if(_ajaxRequestingBlocking){return false; +}if(_.mode==="create"){if(!_machineNameValidate(null,null,v=(elm=_elements.filter.name_suggest).value)){Judy.focus(elm); +return false; +}if($.inArray(v,_filters)>-1){Judy.overlay(1,true); +if(!confirm(self.local("error_filter_name_nonunique",{"!name":v}))){Judy.overlay(0); +return false; +}else{Judy.overlay(1,false,self.local("wait_edit")); +_elements.settings.mode.value=_.mode="edit"; +_elements.filter.name.value=v; +_submit(); +return false; +}}nm=v; +rqa=_elements.filter.require_admin?1:0; +}else{nm=_.name; +rqa=(elm=_elements.filter.require_admin)&&Judy.fieldValue(elm); +}Judy.overlay(1,false,self.local("wait_"+_.mode)); +_ajaxRequestingBlocking=true; +v=self.getCriteria(); +_ajaxRequest("filter_"+_.mode,{name:nm,filter:{require_admin:rqa,description:$.trim(Judy.stripTags(_elements.filter.description.value).replace(/[\r\n\t]/g," ").replace(/\ +/g," ")).substr(0,255)},conditions:v.conditions,order_by:v.order_by}); +}break; +case"log_filter_delete_logs_button":if(_.deleteLogs_allowed){Judy.overlay(1,false,self.local("wait")); +setTimeout(_deleteLogs,200); +}else{throw new Error("Button name["+nm+"] not allowed."); +}break; +default:throw new Error("Unsupported button name["+nm+"]."); +}}catch(er){_errorHandler(er,0,_name+"._crudRelay()"); +}return false; +}; +_changedCriterion=function(){if(_.deleteLogs_allowed){Judy.disable(_elements.buttons.delete_logs_button,null,self.local("deleteLogs_prohibit")); +}try{switch(_.mode){case"default":_setMode("adhoc"); +break; +case"adhoc":break; +case"stored":_setMode(!_.crudFilters?"adhoc":"edit"); +break; +case"create":break; +case"edit":break; +case"delete_filter":break; +default:throw new Error("Mode["+_.mode+"] not supported."); +}}catch(er){_errorHandler(er,0,_name+"._changedCriterion()"); +}}; +_resetCriteria=function(evt,mode,noModeChange){var o=_elements.conditions,nm,r,a,le,i; +if(_.deleteLogs_allowed){Judy.disable(_elements.buttons.delete_logs_button,null,self.local("deleteLogs_prohibit")); +}for(nm in o){if(o.hasOwnProperty(nm)){r=o[nm]; +switch(nm){case"severity_any":case"type_any":r.checked=true; +break; +case"severity_some":le=r.length; +for(i=0; +i'+Drupal.t("Severity")+""+Drupal.t("Type")+""+Drupal.t("Time")+""+Drupal.t("User")+""; +if(conditions.hostname||_elements.conditions.hostname.value==="*"){++nCols; +optionalColumns.hostname=true; +s+=""+Drupal.t("Hostname")+""; +}if(conditions.location||_elements.conditions.location.value==="*"){++nCols; +optionalColumns.location=true; +s+=""+Drupal.t("Location")+""; +}if(conditions.referer||_elements.conditions.referer.value==="*"){++nCols; +optionalColumns.referer=true; +s+=""+Drupal.t("Referrer")+""; +}s+=""+Drupal.t("Message")+""; +if(le){if((wid=conditions.wid)&&conditions.hasOwnProperty("wid")){s+=''+self.local("event_from_url",{"!number":wid})+""; +setTimeout(function(){self.displayLog(wid); +},100); +}for(i=0; +i '+o.type+''+o.time+''+(o.name)):(">-"+self.local("deleted_user")+"-")):('>'+o.name+""))+""+(!optionalColumns.hostname?"":''+o.hostname+"")+(!optionalColumns.location?"":''+o.location+"")+(!optionalColumns.referer?"":''+o.referer+"")+'
'+Judy.stripTags(o.message.replace(/\r?\n/g," ")).substr(0,_.listMessageTruncate)+"
"; +}$(_elements.pager.progress).hide(); +if(offset){$(_elements.pager.first).removeClass("log-filter-pager-button-disabled"); +$(_elements.pager.previous).removeClass("log-filter-pager-button-disabled"); +}$(_elements.pager.current).html(self.local("pager_current",{"!first":(offset+1),"!last":(offset+le),"!total":nTotal})).show(); +if(offset+le'+(!conditions.wid?self.local("no_event_matches"):self.local("non_existing_event",{"!number":conditions.wid}))+""; +$(_elements.pager.progress).hide(); +if(offset){$(_elements.pager.first).removeClass("log-filter-pager-button-disabled"); +$(_elements.pager.previous).removeClass("log-filter-pager-button-disabled"); +}if(!nTotal){$(_elements.pager.current).html(self.local("pager_current_none")).show(); +}else{$(_elements.pager.current).html(self.local("pager_current_outofrange",{"!offset":offset,"!total":nTotal})).show(); +}}s+=""; +$("#log_filter_log_list").html(s); +setTimeout(function(){$("#log_filter_log_list table.sticky-enabled").once("tableheader",function(){$(this).data("drupal-tableheader",new Drupal.tableHeader(this)); +}); +$("table#log_filter_log_list_table").bind("contextmenu",_filterByEventColumn); +Judy.keydown("table#log_filter_log_list_table","f shift+f",_filterByEventColumn,true); +},100); +}; +_ajaxRequest=function(action,oData){$.ajax({url:"/log_filter/ajax/"+action,type:"POST",data:oData,dataType:"json",cache:false,success:function(oResp,textStatus,jqXHR){var o; +if(textStatus==="success"&&typeof action==="string"&&$.type(oResp)==="object"){_ajaxResponse(action,oResp); +}else{o={source:"ajax request",action:action,textStatus:textStatus,oResp:oResp}; +_.errors.push(o); +_errorHandler(null,o,_name+"._ajaxRequest()"); +}},error:function(jqXHR,textStatus,errorThrown){var o; +if(jqXHR&&jqXHR.status===403){_ajaxResponse(action,{success:false,error_code:_errorCodes.perm_general}); +}else{o={source:"ajax request",action:action,textStatus:textStatus,errorThrown:errorThrown}; +_.errors.push(o); +_errorHandler(null,o,_name+"._ajaxRequest()"); +}}}); +}; +_ajaxResponse=function(action,oResp){var errorCode=oResp.error_code||0,url; +if(!oResp.success||errorCode){switch(errorCode){case _errorCodes.perm_general:$(_elements.form).html(""); +self.Message.set(self.local("error_form_expired",{"!url":url=_url()}),"warning",{modal:true,close:function(){window.location.href=url; +}}); +return; +case _errorCodes.form_expired:self.Message.set(self.local("error_form_expired",{"!url":url=_url()}),"warning",{modal:true,close:function(){window.location.href=url; +}}); +return; +case _errorCodes.perm_filter_crud:self.Message.set(self.local("error_perm_filter_crud"),"warning",{modal:true,close:function(){window.location.href=_url(); +}}); +return; +case _errorCodes.db_general:self.Message.set(self.local("error_db_general"),"error",{modal:true,close:function(){window.location.href=_url(); +}}); +break; +}}if(_ajaxResponse.hasOwnProperty(action)){if(!_ajaxResponse[action](oResp)){_errorHandler(null,oResp,_name+"._ajaxResponse."+action+"()"); +self.Message.set(self.local("error_unknown"),"error",{modal:true,close:function(){window.location.href=_url(); +}}); +}}else{_errorHandler(null,oResp,_name+"._ajaxResponse(), unsupported action["+action+"]"); +}}; +_ajaxResponse.filter_create=function(oResp){var nm=oResp.name; +if(oResp.success){_elements.filter.name_suggest.value=""; +_elements.filter.origin.value=_.origin=_.name; +_elements.filter.name.value=_.name=nm; +_filters.push(nm); +_setMode("edit"); +$(_elements.misc.title).html(nm+" - "+oResp.description+""); +Judy.overlay(0); +self.Message.set(self.local("savedNew",{"!filter":nm})); +}else{switch(oResp.error_code){case _errorCodes.filter_name_composition:Judy.overlay(0); +self.Message.set(self.local("error_machine_name_composition"),"warning",{modal:true,close:function(){Judy.focus(_elements.filter.name_suggest); +}}); +break; +case _errorCodes.filter_name_nonunique:Judy.overlay(0); +self.Message.set(self.local("error_filter_name_nonunique",{"!name":nm}),"warning",{modal:true,close:function(){Judy.focus(_elements.filter.name_suggest); +}}); +break; +default:return false; +}}_ajaxRequestingBlocking=false; +return true; +}; +_ajaxResponse.filter_edit=function(oResp){var nm=oResp.name; +if(oResp.success){$("span",_elements.misc.title).html(" - "+oResp.description); +Judy.overlay(0); +self.Message.set(self.local("saved",{"!filter":nm})); +}else{if(oResp.error_code===_errorCodes.filter_doesnt_exist){self.Message.set(self.local("error_filter_doesnt_exist",{"!name":nm}),"warning",{modal:true,close:function(){window.location.href=_url(); +}}); +}else{if(oResp.error_code===_errorCodes.perm_filter_restricted){self.Message.set(self.local("error_perm_filter_restricted"),"error",{modal:true,close:function(){window.location.href=_url(); +}}); +}else{return false; +}}}_ajaxRequestingBlocking=false; +return true; +}; +_ajaxResponse.list_logs=function(oResp){var nm=oResp.name,conditions=oResp.log_list[1]; +if(oResp.success){_listLogs(oResp.log_list[0],oResp.log_list[1],oResp.log_list[2],oResp.log_list[3]); +if(_.deleteLogs_allowed&&(!conditions.wid||!conditions.hasOwnProperty("wid"))){Judy.enable(_elements.buttons.delete_logs_button,null,""); +}Judy.overlay(0); +}else{return false; +}_ajaxRequestingBlocking=false; +return true; +}; +_ajaxResponse.delete_logs=function(oResp){if(oResp.success){self.Message.set(self.local("deleteLogs_success",{"!number":oResp.delete_logs}),"notice",{noFade:false}); +_getLogList(); +return true; +}else{return false; +}}; +this.inspect=function(prop){if(typeof window.inspect==="function"&&inspect.tcepsni===true){inspect(!prop?_:_[prop],_name+(!prop?"":(" - "+prop))); +}}; +this.inspectElements=function(group){if(typeof window.inspect==="function"&&inspect.tcepsni===true){inspect(!group?_elements:_elements[group],"_elements"+(!group?"":("."+group))); +}}; +this.local=function(name,replacers){var nm=name,s; +if(!(s=_oGet(_local,nm))){switch(nm){case"default":_local[nm]=s=Drupal.t("Default"); +break; +case"adhoc":_local[nm]=s=Drupal.t("Ad hoc"); +break; +case"adhocForOrigin":s=Drupal.t("Ad hoc - based on !origin",replacers); +break; +case"newForOrigin":s=Drupal.t("New - based on !origin",replacers); +break; +case"newTitle":_local[nm]=s=Drupal.t("New"); +break; +case"newName":_local[nm]=s=Drupal.t("new"); +break; +case"savedNew":s=Drupal.t("Saved new filter '!filter'.",replacers); +break; +case"saved":s=Drupal.t("Saved filter '!filter'.",replacers); +break; +case"confirmDelete":s=Drupal.t("Are you sure you want to delete the filter!newline!filter?",replacers); +break; +case"invalid_date":s=Drupal.t("The date '!date' is not valid!newline- please use the format: !format",replacers); +break; +case"invalid_timeSequence_from":_local[nm]=s=Drupal.t("'From' time cannot be later than 'To' time."); +break; +case"invalid_timeSequence_to":_local[nm]=s=Drupal.t("'To' time cannot be earlier than 'From' time."); +break; +case"invalid_uid":_local[nm]=s=Drupal.t("User ID must be a positive number, or empty."); +break; +case"invalid_location":_local[nm]=s=Drupal.t("Requested URL must be a URL, or empty."); +break; +case"invalid_referer":_local[nm]=s=Drupal.t("Referrer URL must be a URL, 'none', or empty."); +break; +case"error_machine_name_composition":s=Drupal.t("The filter name:!newline- must be 2 to 32 characters long!newline- must only consist of the characters a-z, letters, and underscore (_)!newline- cannot start with a number!newline- cannot be: !illegals",replacers); +break; +case"error_filter_name_nonunique":s=Drupal.t("There's already a filter named!newline'!name'.!newlineDo you want to overwrite that filter?",replacers); +break; +case"error_filter_doesnt_exist":s=Drupal.t("There's no filter named!newline'!name'.",replacers); +break; +case"wait":_local[nm]=s=Drupal.t("Please wait a sec..."); +break; +case"wait_create":_local[nm]=s=Drupal.t("Creating new filter. Please wait a sec..."); +break; +case"wait_ereate":_local[nm]=s=Drupal.t("Saving filter changes. Please wait a sec..."); +break; +case"deleteLogs_prohibit":_local[nm]=s=Drupal.t("Only allowed when the log list is freshly updated,!newlinereflecting current filter - press the 'Update list' button."); +break; +case"deleteLogs_all":_local[nm]=s=Drupal.t("Do you want to delete!newlineALL logs?"); +break; +case"deleteLogs_noMax":s=Drupal.t("Do you want to delete!newlineALL logs after event no. !offset?",replacers); +break; +case"deleteLogs_noOffset":s=Drupal.t("Do you want to delete logs!newlinewithout ANY condition!newlineexcept limited by a maximum of !max?",replacers); +break; +case"deleteLogs_noConditions":s=Drupal.t("Do you want to delete logs after event no. !offset!newlinewithout ANY condition!newlineexcept limited by a maximum of !max?",replacers); +break; +case"deleteLogs_storedAll":s=Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlinelimited by NO maximum?",replacers); +break; +case"deleteLogs_storedNoMax":s=Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineafter matching event no. !offset!newlinelimited by NO maximum?",replacers); +break; +case"deleteLogs_storedNoOffset":s=Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineexcept limited by a maximum of !max?",replacers); +break; +case"deleteLogs_stored":s=Drupal.t("Do you want to delete all logs matching!newlinethe '!name' filter!newlineafter matching event no. !offset!newlinelimited by a maximum of !max?",replacers); +break; +case"deleteLogs_adhocAll":_local[nm]=s=Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlinelimited by NO maximum?"); +break; +case"deleteLogs_adhocNoMax":s=Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineafter matching event no. !offset!newlinelimited by NO maximum?",replacers); +break; +case"deleteLogs_adhocNoOffset":s=Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineexcept limited by a maximum of !max?",replacers); +break; +case"deleteLogs_adhoc":s=Drupal.t("Do you want to delete all logs!newlinematching current ad hoc filter!newlineafter matching event no. !offset!newlinelimited by a maximum of !max?",replacers); +break; +case"deleteLogs_success":s=Drupal.t("Deleted !number log events.",replacers); +break; +case"error_form_expired":s=Drupal.t('The form has become outdated!newline- please reload this page.',replacers); +break; +case"error_perm_filter_crud":_local[nm]=s=Drupal.t("Sorry, you're not allowed to edit saveable filters."); +break; +case"error_perm_filter_restricted":_local[nm]=s=Drupal.t("You're not allowed to use that filter."); +break; +case"error_db_general":_local[nm]=s=Drupal.t("Sorry, failed to save data."); +break; +case"error_unknown":_local[nm]=s=Drupal.t("Sorry, something unexpected happened."); +break; +case"emergency":_local[nm]=s=Drupal.t("emergency"); +break; +case"alert":_local[nm]=s=Drupal.t("alert"); +break; +case"critical":_local[nm]=s=Drupal.t("critical"); +break; +case"error":_local[nm]=s=Drupal.t("error"); +break; +case"warning":_local[nm]=s=Drupal.t("warning"); +break; +case"notice":_local[nm]=s=Drupal.t("notice"); +break; +case"info":_local[nm]=s=Drupal.t("info"); +break; +case"debug":_local[nm]=s=Drupal.t("debug"); +break; +case"anonymous_user":_local[nm]=s=Drupal.t("anonymous"); +break; +case"deleted_user":_local[nm]=s=Drupal.t("deleted"); +break; +case"log_event":_local[nm]=s=Drupal.t("Event"); +break; +case"log_severity":_local[nm]=s=Drupal.t("Severity"); +break; +case"log_type":_local[nm]=s=Drupal.t("Type"); +break; +case"log_time":_local[nm]=s=Drupal.t("Time"); +break; +case"log_time_from":_local[nm]=s=Drupal.t("Time From"); +break; +case"log_time_to":_local[nm]=s=Drupal.t("Time To"); +break; +case"log_user":case"log_uid":_local[nm]=s=Drupal.t("User"); +break; +case"log_location":_local[nm]=s=Drupal.t("Location"); +break; +case"log_referer":_local[nm]=s=Drupal.t("Referrer"); +break; +case"log_hostname":_local[nm]=s=Drupal.t("Hostname"); +break; +case"log_message":_local[nm]=s=Drupal.t("Message"); +break; +case"log_link":_local[nm]=s=Drupal.t("Link"); +break; +case"eventItem_display":s=Drupal.t("Event !logId",replacers); +break; +case"eventItemHover_filter":s=Drupal.t("Event !logId - press F key (or right-click) to filter !filter",replacers); +break; +case"eventItemHover_severity":s=Drupal.t("Event !logId (!severity) - press F key (or right-click) to filter Severity",replacers); +break; +case"eventItemHover_time":s=Drupal.t("Event !logId!newline - press F key (or right-click) to filter Time From!newline - press shift+F to filter Time To",replacers); +break; +case"eventItemHover_user":s=Drupal.t("Event !logId (user !uid) - press F key (or right-click) to filter User",replacers); +break; +case"filtered_event_column":s=Drupal.t("Filter !column by '!value'.",replacers); +break; +case"event_link":_local[nm]=s=Drupal.t("Link to this log event"); +break; +case"no_event_matches":_local[nm]=s=Drupal.t("The current filter matches no events."); +break; +case"non_existing_event":s=Drupal.t("Event ID !number doesn't exist.",replacers); +break; +case"event_from_url":s=Drupal.t("Listing event ID !number, according to URL. Press 'Update list' button to reflect current filter.",replacers); +break; +case"add_type_item":_local[nm]=s=Drupal.t("Add type..."); +break; +case"type_option_dupe":s=Drupal.t("Type !option already exists.",replacers); +break; +case"pager_current":s=Drupal.t("!first-!last of !total",replacers); +break; +case"pager_current_none":_local[nm]=s=Drupal.t("None"); +break; +case"pager_current_outofrange":s=Drupal.t("None after !offset, of !total",replacers); +break; +case"library_judy_incompatible":s=Drupal.t("Log Filter doesn't work without the Judy library, version !version or newer.",replacers); +break; +default:s="[LOCAL: "+nm+"]"; +}}return s.replace(/\!newline/g,"\n"); +}; +this.getCriteria=function(){var n=0,conditions={},order_by=[],oElms=_elements.conditions,nm,r,v,le,i; +try{for(nm in oElms){if(oElms.hasOwnProperty(nm)){r=oElms[nm]; +switch(nm){case"time_from_proxy":case"time_to_proxy":case"time_from_time":case"time_to_time":break; +case"time_range":case"time_from":case"time_to":case"uid":if((v=r.value)!==""&&(v=$.trim(v)).length&&(v=parseInt(v,10))>-1){++n; +conditions[nm]=v; +}break; +case"username":break; +case"role":if((v=Judy.fieldValue(r))!==""&&v!=="_none"&&(v=$.trim(v))&&(v=parseInt(v,10))){++n; +conditions[nm]=v; +}break; +case"severity_any":case"type_any":case"type_proxy":break; +case"severity_some":if(!oElms.severity_any.checked){v=[]; +le=r.length; +for(i=0; +i
',_htmlItem='
__CONTENT__
x
',_list,_faders={},_close=function(){$(this.parentNode).hide(); +},_fader=function(selector,delay){var __self=this,_delayDefault=3000,_pause=150,_factor=1.2,_stopped,_opacity=100,_subtractor=1,_start=function(){__self._interval=setInterval(_fade,_pause); +},_fade=function(){var n=_opacity,jq=__self._jq; +if(!_stopped){if((_opacity=(n-=(_subtractor*=_factor)))>0){if(Judy.browserIE<11){jq.css("opacity",n/100); +}else{jq.css({"-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity="+(n=Math.round(n))+")",filter:"alpha(opacity="+n+")"}); +}}else{_stopped=true; +clearInterval(__self._interval); +jq.hide(); +}}},jq; +this.stop=function(){if(!_stopped){_stopped=true; +clearTimeout(__self._timeout); +clearInterval(__self._interval); +}}; +this.unfade=function(){__self.stop(); +if(_opacity<100){if(Judy.browserIE<11){__self._jq.css("opacity",1); +}else{__self._jq.css({"-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)",filter:"alpha(opacity=100)"}); +}}}; +this.destroy=function(){__self.stop(); +delete __self._jq; +}; +if((jq=$(selector)).get(0)){this._jq=jq; +this._timeout=setTimeout(_start,!delay?_delayDefault:(delay<1000?Math.floor(delay*_delayDefault):_delayDefault)); +}}; +this.setup=function(){var elm,jq; +if((elm=document.getElementById("console"))){$(elm).after(_htmlList); +}else{$("#content").prepend(_htmlList); +}_list=document.getElementById("log_filter__message_list"); +if((jq=$(_list)).draggable){jq.draggable({handle:"div.log-filter--message-content",cancel:"span",cursor:"move"}); +}}; +this.set=function(txt,type,options){var t=type||"status",s,f,k,jq,o={noFade:true,fadeDelay:0,modal:false,close:null}; +switch(t){case"status":case"info":o.noFade=false; +break; +case"notice":case"warning":break; +default:t="error"; +}if(options){for(k in o){if(o.hasOwnProperty(k)&&options.hasOwnProperty(k)){o[k]=options[k]; +}}}$(_list).prepend(_htmlItem.replace(/__NO__/,++_n).replace(/__TYPE__/,t).replace(/__CONTENT__/,txt?txt.replace(/\n/g,"
"):"")); +(jq=$((s="#log_filter__message_"+_n)+" > div:last-child")).click(_close); +if(o.modal){jq.click(Judy.overlay); +Judy.overlay(1,true); +}if(o.close){jq.click(o.close); +}if(!o.noFade){_faders["_"+_n]=f=new _fader(s,o.fadeDelay); +$(s+" > div:first-child").bind("click mousedown",f.unfade); +}$(s).show(); +}; +this.showAll=function(){var le=_n+1,i,f; +for(i=0; +i"+(!o.link?"":('"))+"
'+self.local("log_severity")+""+(v=o.severity_string)+'
 
'+self.local("log_type")+""+o.type+'
'+self.local("log_time")+""+o.time+'
'+self.local("log_user")+""+(!o.uid?o.name:('('+o.uid+") "+o.name+""))+"   •   "+self.local("log_hostname")+": "+o.hostname+'
'+self.local("log_location")+''+o.location+'
'+self.local("log_referer")+""+(!o.referer?" ":(''+o.referer+""))+'
'+self.local("log_message")+""+o.message+"
'+self.local("log_link")+''+o.link+"
"; +Judy.dialog(dialId,{title:''+self.local("log_event")+": "+o.wid+"",content:s,fixed:true,resizable:false,closeOnEscape:false,dialogClass:"log-filter-log-display-dialog",contentClass:"log-filter-log-display-content",autoOpen:false,close:function(event,ui){setTimeout(function(){$("#log_filter_logDisplay_"+logId).dialog("destroy").remove(); +$("#log_filter_list_log_"+logId).removeClass("log-filter-list-displayed"); +}); +}}); +($dialOuter=$((dialInner=$("#"+dialId).get(0)).parentNode)).css({visibility:"hidden",overflow:"visible"}); +Judy.dialog(dialId,"open"); +Judy.outerWidth($dialOuter,true,Judy.innerWidth(window)-200,2); +Judy.outerHeight("#"+dialId,true,Judy.outerHeight($dialOuter,true,Judy.outerHeight(window)-10,1)-Judy.outerHeight($("div.ui-dialog-titlebar",$dialOuter))-Math.ceil(parseFloat($dialOuter.css("padding-top"))+parseFloat($dialOuter.css("padding-bottom")))-_.adminOverlayOffset,1); +$dialOuter.css({visibility:"visible",left:"150px",top:(4+_.adminOverlayOffset)+"px"}); +Drupal.attachBehaviors($dialOuter.get(0)); +}}}; +this.init=function(useModuleCss,theme){var v; +self.init=function(){}; +if(typeof window.Judy!=="object"||!(v=Judy.version)||Judy.version<_.library_judy_version){_.library_judy_compatible=false; +return; +}if((_.useModuleCss=useModuleCss)){$("div#page").addClass("theme-"+theme); +}Judy.overlay(1,false,self.local("wait")); +}; +this.setup=function(filters,messages){var a=messages,le,i,o={fadeDelay:2},url,wid; +self.setup=function(){}; +_filters=filters||[]; +if(!_.library_judy_compatible){alert(self.local("library_judy_incompatible",{"!version":_.library_judy_version})); +return; +}_prepareForm(); +_setMode(_.mode,false,true); +(self.Message=new self.Message()).setup(); +if(a){le=a.length; +for(i=0; +i span[title]").each(function(){var t=this.getAttribute("title"); +if(t){this.parentNode.setAttribute("title",t); +}}); +if(!/^#overlay=admin\//.test(top.location.hash)){url=window.location.href; +_.adminOverlayOffset=0; +}else{url=top.location.href+top.location.hash; +}_getLogList(/^.+\/(\d+)\/?$/.test(url)&&(wid=parseInt(url.replace(/^.+\/(\d+)\/?$/,"$1"),10))&&wid<=Math.pow(2,31)?wid:0); +Judy.keydown(document.documentElement,"escape",function(){$("div.log-filter-log-display-content").each(function(){$(this).dialog("close"); +}); +}); +Judy.overlay(0); +}; +}; +window.LogFilter=new LogFilter($); +})(jQuery); diff --git a/sites/all/modules/contrib/admin/log_filter/log_filter.info b/sites/all/modules/contrib/admin/log_filter/log_filter.info new file mode 100644 index 00000000..1c2252e3 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/log_filter.info @@ -0,0 +1,17 @@ +name = "Log Filter" +description = "Log Filter provides means of filtering, displaying and deleting dblog/watchdog logs." +package = Administration +;Utility + +core = 7.x +php = 5.3 + +dependencies[] = judy + +configure = admin/config/system/log_filter +; Information added by Drupal.org packaging script on 2014-11-09 +version = "7.x-1.4" +core = "7.x" +project = "log_filter" +datestamp = "1415558584" + diff --git a/sites/all/modules/contrib/admin/log_filter/log_filter.install b/sites/all/modules/contrib/admin/log_filter/log_filter.install new file mode 100644 index 00000000..e2e432a9 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/log_filter.install @@ -0,0 +1,200 @@ +fields(array('weight' => 10)) + ->condition('type', 'module') + ->condition('name', 'log_filter') + ->execute(); + + // Insert some default filters. + $uid = $GLOBALS['user']->uid; + $filters = array( + array('name' => 'errors_day', 'creator' => $uid, 'description' => '', 'require_admin' => 1, 'severity' => '0,1,2,3', 'type' => '', 'time_range' => 30, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'errors_month', 'creator' => $uid, 'description' => '', 'require_admin' => 1, 'severity' => '0,1,2,3', 'type' => '', 'time_range' => 750, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'errors_week', 'creator' => $uid, 'description' => '', 'require_admin' => 1, 'severity' => '0,1,2,3', 'type' => '', 'time_range' => 175, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'latest_day', 'creator' => $uid, 'description' => '', 'require_admin' => 0, 'severity' => '', 'type' => '', 'time_range' => 30, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'latest_month', 'creator' => $uid, 'description' => '', 'require_admin' => 0, 'severity' => '', 'type' => '', 'time_range' => 750, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'latest_week', 'creator' => $uid, 'description' => '', 'require_admin' => 0, 'severity' => '', 'type' => '', 'time_range' => 175, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'severity_debug', 'creator' => $uid, 'description' => 'Debug severity', 'require_admin' => 1, 'severity' => 7, 'type' => '', 'time_range' => 0, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'severity_error', 'creator' => $uid, 'description' => 'All error severities', 'require_admin' => 1, 'severity' => '0,1,2,3', 'type' => '', 'time_range' => 0, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1), + array('name' => 'severity_warning_notice_info', 'creator' => $uid, 'description' => 'All non-error severities but debug', 'require_admin' => 1, 'severity' => '4,5,6', 'type' => '', 'time_range' => 0, 'time_from' => 0, 'time_to' => 0, 'role' => -1, 'uid' => -1, 'hostname' => '', 'location' => '', 'referer' => '', 'order_by' => '', 'editor' => $uid, 'created' => 1, 'changed' => 1) + ); + try { + $le = count($filters); + for ($i = 0; $i < $le; ++$i) { + db_insert('log_filter') + ->fields($filters[$i]) + ->execute(); + } + } + catch (Exception $xc) { + watchdog( + 'log_filter', + 'Failed to insert default filters during installation of module Log Filter.', + NULL, + WATCHDOG_ERROR + ); + } +} + +/** + * Implements hook_schema(). + * + * @return array + */ +function log_filter_schema() { + return array( + 'log_filter' => array( + 'description' => 'Log filters.', + 'fields' => array( + 'id' => array( + 'type' => 'serial', + 'not null' => TRUE, + ), + 'name' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + ), + 'creator' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'The user.uid that created the filter.', + ), + 'description' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'require_admin' => array( + 'type' => 'int', + 'size' => 'tiny', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Require the \'Administer log filtering\' role.', + ), + 'severity' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Comma-separated list.', + ), + 'type' => array( + 'type' => 'text', + 'not null' => TRUE, + // Text fields don't support default value; at least not MySQL. + 'description' => 'Comma-separated list. Empty default because it\'s a text field (not char/varchar).', + ), + 'time_range' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'time_from' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'time_to' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'role' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => -1, + ), + 'uid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => -1, + ), + 'hostname' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'location' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'referer' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Url, \'none\' or empty.', + ), + 'order_by' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => 'time:DESC', + 'description' => 'Comma-separated list, like: \'time:DESC,severity:ASC\'.', + ), + 'editor' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'The user.uid that most recently changed (or created) the filter.', + ), + 'created' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'The Unix timestamp when the filter was created.', + ), + 'changed' => array( + 'type' => 'int', + 'not null' => TRUE, + 'description' => 'The Unix timestamp when the filter was most recently saved.', + ), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'name' => array('name'), + ), + ), + ); +} + +/** + * Deletes configuration variables. + * + * Implements hook_uninstall(). + */ +function log_filter_uninstall() { + variable_del('log_filter_admintheme'); + variable_del('log_filter_cssdefault'); + variable_del('log_filter_trnslt'); + variable_del('log_filter_pgrng'); + variable_del('log_filter_showdeletions'); +} + +/** + * Increase log_filter's module weight to 10; the module's hook_menu() must be invoked _after_ dblog's ditto. + */ +function log_filter_update_7001() { + // Invoke our hook_menu() later than dblog's ditto. + db_update('system') + ->fields(array('weight' => 10)) + ->condition('type', 'module') + ->condition('name', 'log_filter') + ->execute(); +} diff --git a/sites/all/modules/contrib/admin/log_filter/log_filter.module b/sites/all/modules/contrib/admin/log_filter/log_filter.module new file mode 100644 index 00000000..383f6ad4 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/log_filter.module @@ -0,0 +1,181 @@ + array( + 'title' => t('Administer log filtering'), + 'restrict access' => TRUE, + ), + 'log_filter edit filters' => array( + 'title' => t('Create/edit/delete saveable log filters'), + ), + 'log_filter remove logs' => array( + 'title' => t('Remove logs'), + 'restrict access' => TRUE, + ), + ); +} + +/** + * Implements hook_menu(). + * + * Declares configuration page. + * + * @return array + */ +function log_filter_menu() { + $items = array( + // Settings page. + 'admin/config/system/log_filter' => array( + 'title' => 'Log Filter', + 'description' => 'Configure Log Filtering', + 'page callback' => 'drupal_get_form', // hook to implement + 'page arguments' => array('_log_filter_admin_form'), // name of implementing function + 'access arguments' => array('log_filter administer'), // permission required + 'file' => 'admin/log_filter.admin.inc', + 'type' => MENU_NORMAL_ITEM, + 'theme callback' => 'log_filter_use_admin_theme', + ), + // AJAX callback. + 'log_filter/ajax/%' => array( // % ~ action + 'page callback' => 'log_filter_ajax_callback', + 'page arguments' => array(2), // start at that bucket index + 'access callback' => TRUE, + 'access arguments' => array('access site reports'), // Permission required. + 'type' => MENU_CALLBACK, + ), + ); + + // NB: Accessing a saved filter is done via an extra url argument after admin/reports/dblog/log_filter; see LogFilter::FILTER_NAME_ARG. + // And accessing a log event is done by adding /NUMBER to the end of url (saved filter or not). + + // Take over the url of dblog's default viewer. + $i = 0; + // Overwrite dblog's default viewer. + $items['admin/reports/dblog'] = array( + 'title' => 'Recent log messages', + 'description' => 'View logged events using filters', + 'page callback' => 'drupal_get_form', // Hook to implement. + 'page arguments' => array('log_filter_form'), // Name of implementing function. + 'access arguments' => array('access site reports'), // Permission required. + 'type' => MENU_NORMAL_ITEM, + 'theme callback' => 'log_filter_use_admin_theme', // Do always administrative theme, if set so. + 'weight' => -1, + ); + $items['admin/reports/dblog/log_filter'] = array( + 'type' => MENU_DEFAULT_LOCAL_TASK, + 'title' => 'Recent log messages', + 'weight' => ++$i, + ); + $items['admin/reports/dblog/log_filter_settings'] = array( + 'title' => 'Log filter settings', + 'description' => 'Configure Log Filtering', + 'page callback' => 'drupal_get_form', // hook to implement + 'page arguments' => array('_log_filter_admin_form'), // name of implementing function + 'access arguments' => array('log_filter administer'), // permission required + 'file' => 'admin/log_filter.admin.inc', + 'type' => MENU_LOCAL_TASK, + 'theme callback' => 'log_filter_use_admin_theme', // Do always administrative theme, if set so. + 'weight' => ++$i, + ); + // Add dblog's default viewer as a tab. + if (module_exists('dblog')) { + $items['admin/reports/dblog/dblog_view'] = array( + 'title' => 'Standard dblog view', + 'description' => 'View events that have recently been logged.', + 'page callback' => 'dblog_overview', + 'access arguments' => array('access site reports'), + 'type' => MENU_LOCAL_TASK, + 'file path' => drupal_get_path('module', 'dblog'), + 'file' => 'dblog.admin.inc', + 'theme callback' => 'log_filter_use_admin_theme', // Do always administrative theme, if set so. + 'weight' => ++$i, + ); + } + + return $items; +} + +/** + * Forces administrative on log view pages, unless this feature has been turned off on this module's settings page. + * + * @return string + */ +function log_filter_use_admin_theme() { + return variable_get('log_filter_admintheme', TRUE) ? variable_get('admin_theme') : ( + !empty($GLOBALS['user']->theme) ? $GLOBALS['user']->theme : variable_get('theme_default', 'seven') + ); +} + +/** + * Removes clear log form from standard dblog log view page. + * + * @param array &$form + * @param array &$form_state + * @return void + */ +function log_filter_form_dblog_clear_log_form_alter(&$form, &$form_state) { + $form['dblog_clear'] = array(); +} + +/** + * Defines log viewer form and GUI. + * + * Function name not underscore prefixed to prevent html form id starting with hyphen (unhealthy naming). + * + * @param array $form + * @param array &$form_state + * @return array + */ +function log_filter_form($form, &$form_state) { + module_load_include('inc', 'log_filter', 'LogFilter'); + return LogFilter::viewerForm($form, $form_state); +} + +/** + * Called when log viewer form submits. + * + * @param array $form + * @param array &$form_state + * @return void + */ +function _log_filter_form_submit($form, &$form_state) { + module_load_include('inc', 'log_filter', 'LogFilter'); + LogFilter::viewerFormSubmit($form, $form_state); +} + +/** + * @param array $form + * @param array &$form_state + * @return void + */ +function log_filter_admin_form_submit($form, &$form_state) { + module_load_include('inc', 'log_filter', 'log_filter.admin'); + _log_filter_admin_form_submit($form, $form_state); +} + +/** + * Access permission: 'access site reports'. + * + * @see LogFilter::ajaxCallback() + * @param string $action + * @param string $arg + * Default: empty. + * @return void + * Sends 403 header if the expected POST vars arent set or their sanitized values evaluates to empty. + */ +function log_filter_ajax_callback($action, $arg = '') { + module_load_include('inc', 'log_filter', 'LogFilter'); + LogFilter::ajaxCallback($action, $arg); +} \ No newline at end of file diff --git a/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-1.0.txt b/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-1.0.txt new file mode 100644 index 00000000..5cfc4dda --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-1.0.txt @@ -0,0 +1,9 @@ +Log Filter 7.x-1.0 + + +First release. + + +Install/update notes +-------------------- +* Clear cache. diff --git a/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-y.z.txt b/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-y.z.txt new file mode 100644 index 00000000..8370ae82 --- /dev/null +++ b/sites/all/modules/contrib/admin/log_filter/release_notes/release_notes_7.x-y.z.txt @@ -0,0 +1,14 @@ +Log Filter 7.x-y.z + + +New features +------------ +* X + +Bug fixes +--------- +* Y + +Install/update notes +-------------------- +* Z \ No newline at end of file diff --git a/sites/all/modules/contrib/judy/CHANGELOG.txt b/sites/all/modules/contrib/judy/CHANGELOG.txt new file mode 100644 index 00000000..b6015666 --- /dev/null +++ b/sites/all/modules/contrib/judy/CHANGELOG.txt @@ -0,0 +1,196 @@ +judy 7.x-2.x, 2014-04-27 +------------------------ +* Fixed that dialog title couldn't be set as HTML when using later version of jQuery UI (~ jquery_update module support). +* Fixed that dialog z-index isn't 1000 when using later version of jQuery UI (~ jquery_update module support); which rendered dialog below admin_menu. +* Fixed that jQuery >=1.9 has no browser property (~ jquery_update module support). + +judy 7.x-2.x, 2013-07-21 +------------------------ +* Implemented ajaxcomplete event. + +judy 7.x-2.1, 2013-07-04 +-------------------------------------------------- +* Released. + +judy 7.x-2.x, 2013-07-04 +------------------------ +* Moved to correctly named development branch. + +judy 7.x-2.0.x, 2013-07-04 +-------------------------- +* Added .version property. + +judy 7.x-2.0.x, 2013-06-29 +-------------------------- +* Cleanup. + +judy 7.x-2.0.x, 2013-06-27 +-------------------------- +* Now adds .keystrokes attribute on keydown/keyup event. + +judy 7.x-2.0.x, 2013-06-22 +-------------------------- +* Prevent double disable. + +judy 7.x-2.0.x, 2013-05-25 +-------------------------- +* Fixed premature check for jQuery UI dialog support. +* Implemented contentClass option for Judy.dialog. + +judy 7.x-2.0.x, 2013-04-21 +-------------------------- +* Created methods scrollTrap() and scrollTo(). + +judy 7.x-2.0.x, 2013-03-26 +-------------------------- +* Created multi-element support for enable/disable(). + +judy 7.x-2.0.x, 2013-03-03 +-------------------------- +* Fixed missing radios support in enable/disable(). +* Made innerWidth/innerHeight/outerWidth/outerHeight() use selector parameter instead of element, and trimmed their algos. + +judy 7.x-2.0.x, 2013-03-02 +-------------------------- +* Removed isObject(); use isContainer(o, true) instead. +* Removed method useragentIE()/useragentIe(); use constant browserIE instead. +* Removed objectLength(), use Judy.objectKeys(o).length instead. +* Removed errorHandler(); use inspect.errorHandler() instead. +* Removed log(); use inspect.console() instead. +* Removed inspect(); use inspect() directly instead. +* Removed fieldGet(); use jQuery("[name='" + name + "']").get(0) instead. +* Made dialog() support all jQuery UI dialog options, events and methods. +* Fixed dialog()'s autoOpen behaviour. +* Created overlay(). +* Added stripTags(), setUrlParam(), disable() and enable(). +* Settings page help, and hook_uninstall() implementation. + +judy 7.x-2.0.x, 2013-03-01 +-------------------------- +* Removed objectEmpty(); use objectKeys().length instead. +* Removed checkboxValue(), checklistValue(), radioValue(), selectValue(), textValue(), textareaValue(); use fieldValue() instead. +* Removed argsToArray(); use toArray() instead (is now IE<9 safe). +* Methods log(), inspect() and fieldGet() are now deprecated. +* Created numberToFormat() and numberFromFormat(). +* objectLength() is now deprecated; use objectKeys().length instead. + +judy 7.x-2.0.x, 2013-02-28 +-------------------------- +* Eliminated own event model; now uses jQuery events for everything, including key events. +* Removed eventAdd(), eventRemove(). +* errorHandler() is now deprecated, use inspect.errorHandler() instead. +* Removed parameter jQueryEvents from method eventList(); all events are now jQuery events. +* Changed parameter signature for isField(); now only supports element not selector. +* Removed fieldFocus(). + + +judy 7.x-1.3.x, 2013-02-10 +-------------------------- +* Removed initial Inspect dependency; this library should find Inspect (if exists) even if this library gets included before Inspect. + +judy 7.x-1.3.x, 2013-02-09 +-------------------------- +* Made judy a library includable via drupal_add_library(), and added admin page. + +judy 7.x-1.3.x, 2013-02-02 +-------------------------- +* Fixed midnight bug in .dateFromFormat(), now sets seconds and milliseconds to zero; because 00:00:00 is 'today', whereas 24:00:00 is 'tomorrow', thus a date must start at zero. + +judy 7.x-1.3.x, 2013-01-19 +-------------------------- +* Fixed bug in .dialog() - established no element id when falsy selector arg. +* Fixed bug in .dialog() - failed to get element when called later using #id selector. +* .dialog() now always returns the id of the dialog box, except for calls using one of the methods. + +judy 7.x-1.3.x, 2013-01-05 +-------------------------- +* Fixed bad bug in .selectValue() - setting selectedIndex is seriously unhealthy, may effectively ruin the select. + +judy 7.x-1.3.x, 2012-11-18 +-------------------------- +* Added preventDefault parameter to .onKey(). +* Removed keystrokes ctr|meta+alt limitation. +* Created method .keydown(); full support for data etc. + +judy 7.x-1.3.x, 2012-11-10 +-------------------------- +* Added method argsToArray; function arguments are error-prone. +* Fixed uses of Inspect. +* Implemented key event adder, that uses jQuery instead of custom event implementation. + +judy 7.x-1.3.x, 2012-09-02 +-------------------------- +* eventList() now supports regular and weird structure of jQuery data. + +judy 7.x-1.3.x, 2012-07-29 +-------------------------- +* judy data object for events et al now has random name judy_[a-z\d]{20}. +* Created jQuery.ui.dialog wrapper/factory method. + +judy 7.x-1.3.x, 2012-07-26 +-------------------------- +* Return value of selectValue() is now empty string even for multiple select, when none selected or only _none is selected. +* Added context parameter to isField(). +* Max parameter added to ancestor(). +* checklistValue() done. +* selectValue() refactored, too messy. +* Tighter toLeading(). + +judy 7.x-1.3.x, 2012-07-25 +-------------------------- +* eventRemove() now removes actual element listeners (minor detail ;-). +* Made containerCopy use Array.concat() when array and shallow copy. +* Far better isContainer() and isObject(); now checks for all built-in object types, like typeOf(). +* Tuned date formatter. +* Backend: hook implementation that includes Javascript now implements hook_preprocess_html (instead of hook_init). + +judy 7.x-1.3.x, 2012-07-24 +-------------------------- +* Made field methods support element as first argument (not only name), and made the treatment of the type argument more restrictive. +* Added textValue() and textareaValue(). +* Safer and shorter toArray(). +* Fixed jsdoc comments, for jsdoc parser. +* objectGet(): better check for bad key arg. +* Added isNumber(). +* Implemented eventRemove(). + +judy 7.x-1.3.x, 2012-07-23 +-------------------------- +* Now using Drupal git repository. +* Moved javascript file inclusion to hook_preprocess() implementation. +* Code formatting. +* Started on making field methods accept element, not only name. + +judy 7.x-1.2, 2012-03-16 +------------------------ +* Getting value using .selectValue() now returns "" for "_none". + +judy 7.x-1.2, 2012-01-19 +------------------------ +* New method toArray + +judy 7.x-1.2, 2012-01-12 +------------------------ +* dateFromFormat: check for impossible date, plus more flexible format support. +* New method isLeapYear + +judy 7.x-1.2, 2012-01-11 +------------------------ +* Added toUpperCaseFirst method. + +judy 7.x-1.1, 2012-01-11 +------------------------ +* Added isInt method. + +judy 7.x-1.0, 2012-01-10 +------------------------ +* Dedicated .innerWidth/Height support for window/document/body. +* .outerWidth/Height methods. + +judy 7.x-1.0, 2012-01-02 +------------------------ +* Construcion and adding of event handler moved to separate function to prevent iteration errors when adding more in one go. + +judy 7.x-1.x, 2011-12-26 +------------------------ +* Started \ No newline at end of file diff --git a/sites/all/modules/contrib/judy/COPYRIGHT.txt b/sites/all/modules/contrib/judy/COPYRIGHT.txt new file mode 100644 index 00000000..75e6260b --- /dev/null +++ b/sites/all/modules/contrib/judy/COPYRIGHT.txt @@ -0,0 +1,18 @@ + +All code of the Drupal module Judy is Copyright 2012-2014 Jacob Friis Mathiasen. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program as the file LICENSE.txt; if not, please see +http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +Drupal is a registered trademark of Dries Buytaert. \ No newline at end of file diff --git a/sites/all/modules/contrib/judy/LICENSE.txt b/sites/all/modules/contrib/judy/LICENSE.txt new file mode 100755 index 00000000..d159169d --- /dev/null +++ b/sites/all/modules/contrib/judy/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/contrib/judy/judy.css b/sites/all/modules/contrib/judy/judy.css new file mode 100644 index 00000000..e8304362 --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.css @@ -0,0 +1,68 @@ +/** + * @file + * Drupal Judy module + */ + +/* Required -------------------------------------------- */ +div#module_judy_overlay { + position: absolute; left: 0; top: 0; width: 0; height: 0; overflow: hidden; + /* jQuery UI dialog defaults to 1000 in old (default) version, but to 100 (.ui-front) in later jQuery UI (jquery_update module) versions. */ + z-index: 99; + padding: 0; margin: 0; border: 0; background-color: transparent; +} +div#module_judy_overlay.module-judy-overlay-hovertitled { + cursor: wait; +} +div#module_judy_overlay.module-judy-overlay-opaque { + background-color: #BBB; + opacity:0.5; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)'; filter:alpha(opacity=50); +} + +/* Themeable ------------------------------------------- */ +div#module_judy_overlay { + /* Get above admin_menu, when using later jQuery UI (jquery_update module) versions. */ + z-index: 900; +} +div#module_judy_overlay.module-judy-overlay-opaque { + background-color: #BBB; +} +div.module-judy-dialog-container.ui-front { + /* Get above admin_menu, when using later jQuery UI (jquery_update module) versions. */ + z-index: 1000; +} + div.module-judy-dialog-container div.ui-dialog-titlebar { + padding: 0.2em 1em; /* default: 0.5em 1em 0.3em */ + } + div.module-judy-dialog-container div.ui-dialog-titlebar span#ui-dialog-title-module_judy_info.ui-dialog-title { + white-space: nowrap; + font-family: Tahoma, sans-serif; + font-size: 1.0em; + } + div.module-judy-dialog-container div.ui-dialog-titlebar a.ui-dialog-titlebar-close { + } + div.module-judy-dialog-container div.ui-dialog-titlebar a.ui-dialog-titlebar-close span.ui-icon { + } + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content { + padding: 2.0em 1.5em 1.0em; /* default: padding: 0.5em 1em; */ + font-family: Verdana, sans-serif; + font-size: 0.9em; + line-height: 1.5em; + } + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:link, + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:visited, + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:hover, + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:active { + text-decoration: underline; + color: #000; + } + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:hover, + div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:active { + color: #0071B3; + } + div.module-judy-dialog-container div.ui-dialog-buttonpane { + padding: 0.1em 0.5em 0.1em 0.1em; border-top: 0px; /* default: padding: 0.3em 1em 0.5em 0.4em; */ + } + div.module-judy-dialog-container div.ui-dialog-buttonpane div.ui-dialog-buttonset button.ui-button span.ui-button-text { + font-family: Tahoma, sans-serif; font-weight: bold; + padding: 0.3em 1em 0.4em; font-size: 1em; /* default: padding: 0.4em 1em; font-size: 1em */ + } diff --git a/sites/all/modules/contrib/judy/judy.info b/sites/all/modules/contrib/judy/judy.info new file mode 100644 index 00000000..83ceb07b --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.info @@ -0,0 +1,13 @@ +name = "Judy" +description = "Judy Javascript Utilities provides features to supplement jQuery." +package = Javascript Utilities + +core = 7.x +project = judy + +; Information added by Drupal.org packaging script on 2014-04-27 +version = "7.x-2.2" +core = "7.x" +project = "judy" +datestamp = "1398616428" + diff --git a/sites/all/modules/contrib/judy/judy.js b/sites/all/modules/contrib/judy/judy.js new file mode 100644 index 00000000..1ce73457 --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.js @@ -0,0 +1,3562 @@ +/** + * @file + * Drupal Judy module + */ + +/*jslint browser: true, continue: true, indent: 2, newcap: true, nomen: true, plusplus: true, regexp: true, white: true, ass: true*/ +/*global alert: false, confirm: false, console: false*/ +/*global jQuery: false, Drupal: false, inspect: false, Judy: false*/ + +(function($) { + 'use strict'; +/** + * Judy/Drupal.Judy - Javascript utility library. + * + * General stuff: + * - methods having a selector parameter only work on a single element (not a collection); except {@link Judy.keydown}(), {@link Judy.keyup}(), {@link Judy.disable}(), {@link Judy.enable}(), {@link Judy.scrollTrap}() + * - argument defaults are always falsy + * - complex methods, with notable risk of user error (bad argument) or program error, log errors via Inspect (if exists) + * - Judy is type sensitive, all comparisons are ===; "0" is not 0 (and btw "0" is never falsy in Javascript; only in PHP) + * + * Type: + * • {@link Judy.typeOf}() + * • {@link Judy.isContainer}() • {@link Judy.isArray}() + * • {@link Judy.isNumber}() • {@link Judy.isInt}() + * + * Objects and Arrays: + * • {@link Judy.toArray}() + * • {@link Judy.objectGet}() + * • {@link Judy.objectKeys}() + * • {@link Judy.objectKeyOf}() + * • {@link Judy.arrayIndexOf}() + * • {@link Judy.objectSort}() • {@link Judy.objectKeySort}() + * • {@link Judy.merge}() + * • {@link Judy.containerCopy}() + * + * String: + * • {@link Judy.stripTags}() + * • {@link Judy.toLeading}() + * • {@link Judy.toUpperCaseFirst}() + * • {@link Judy.randName}() + * + * Number: + * • {@link Judy.numberToFormat}() • {@link Judy.numberFromFormat}() + * • {@link Judy.rand}() + * + * Date: + * • {@link Judy.isLeapYear}() + * • {@link Judy.dateISO}() • {@link Judy.dateTime}() + * • {@link Judy.dateFromFormat}() • {@link Judy.dateToFormat}() + * • {@link Judy.timeFormat}() + * + * Form fields: + * • {@link Judy.fieldValue}() + * • {@link Judy.isField}() + * • {@link Judy.fieldType}() + * • {@link Judy.disable}() • {@link Judy.enable}() + * + * Style: + * • {@link Judy.innerWidth}() • {@link Judy.innerHeight}() • {@link Judy.outerWidth}() • {@link Judy.outerHeight}() + * • {@link Judy.scrollTrap}() • {@link Judy.scrollTo}() + * + * DOM: + * • {@link Judy.ancestor}() + * + * Event: + * • {@link Judy.keydown}() • {@link Judy.keyup}() + * • {@link Judy.ajaxcomplete}() • {@link Judy.ajaxcomplete_off}() + * + * UI: + * • {@link Judy.overlay}() + * • {@link Judy.dialog}() + * + * Miscellaneous: + * • {@link Judy.focus}() + * • {@link Judy.timer}() + * • {@link Judy.browserIE} + * • {@link Judy.yduJ} • {@link Judy.yduj} + * + * @constructor + * @namespace + * @name Judy + * @singleton + * @requires jQuery + * @param {jQuery} $ + */ +var Judy = function($) { + /** + * @ignore + * @private + * @type {State} + */ + var self = this, + _name = "Judy", + _nonObj = ["window","document","document.documentElement","element","image","textNode","attributeNode","otherNode","event","date","regexp","jquery"], + _uaIe = 0, + _dateFrmt, _dateTz, + _nonInputFlds = ["textarea", "select"], + _dataName, + _dialEvts = ["beforeClose", "create", "open", "focus", "dragStart", "drag", "dragStop", "resizeStart", "resize", "resizeStop", "close"], + _dialOpts = [ + "appendTo", "autoOpen", "buttons", "closeOnEscape", "closeText", "dialogClass", "draggable", "height", "hide", + "maxHeight", "maxWidth", "minHeight", "minWidth", "modal", "position", "resizable", "show", "title", "width" + ], + _dialMthds = ["close", "destroy", "isOpen", "moveToTop", "open", "option", "widget"], + _dialogs = [], + _acInit, _acLstnrs = {}, _acFltrs = [ + // These may tear down the browser. + { '!url': /\/inspect\/ajax/ }, + { '!url': /\/log_filter\/ajax/ } + ], + _checklist = "checkboxes", _radio = "radios", // Drupal Form API calls a checkbox list 'checkboxes' and a radio list 'radios' + _jqOvrly, _ovrlyRsz, // Overlay. + + /** + * Error handler, give it an error or a variable. + * + * Does nothing if no Inspect module, or if Inspect's 'Enable frontend javascript variable/trace inspector' permission is missing for current user. + * + * @see inspect.errorHandler + * @ignore + * @private + * @param {Error} [error] + * @param {mixed} [variable] + * @param {object|integer|boolean|string} [options] + * @return {void} + */ + _errorHandler = function(error, variable, options) { + var u = options, o = {}, t; + // Do nothing, if inspect is the 'no action' type. + if(typeof window.inspect === "function" && inspect.tcepsnI) { + if(typeof inspect.errorHandler === "function") { + if(u) { + if((t = typeof u) === "string") { + o.message = u; + o.wrappers = 1; // This function wraps Inspect.errorHandler(). + } + else if(t === "object") { + o = u; + o.wrappers = !u.wrappers ? 1 : (u.wrappers + 1); + } + // Otherwise: ignore; use object argument for options if other properties are needed. + } + o.category = "Judy"; + inspect.errorHandler(error, variable, o); + } + else { + inspect.console("Please update Inspect."); + } + } + }, + /** + * Resolve element(s). + * + * Logs error if failing to establish such element, unless noError. + * + * @ignore + * @param {boolean} list + * - false: return first element + * - true: return list of elements + * @param {string|element|array|jquery} u + * @param {string|object|falsy} [cntxt] + * - like jQuery() context argument + * @param {string} [mthd] + * - method name + * @param {boolean} [noError] + * - do not log error + * @return {element|undefined} + */ + _elm = function(list, u, cntxt, mthd, noError) { + var li = !list ? 0 : undefined, t, s = u, jq, le, i, f; + if(u) { + if((t = typeof u) === "object") { + // Element? + if(u === window || u === document || u.getAttributeNode) { + return !list ? u : [u]; + } + // jquery object + if(typeof u.jquery === "string") { + if(u.length) { + if(!cntxt) { + return u.get(li); + } + if((jq = $(u, cntxt)).length) { + return jq.get(li); + } + } + s = u.selector; + } + else if(self.isArray(u) && (le = u.length)) { + for(i = 0; i < le; i++) { + if(!(u[i] === window || u[i] === document || u[i].getAttributeNode)) { + f = true; + break; + } + else if(!i && !list) { + return u[0]; + } + } + if(!f) { + return u; + } + } + } + else if(t === "string" && (jq = $(u)).length) { + return jq.get(li); + } + } + if(!noError) { + try { + throw new Error("selector[" + s + "], type[" + self.typeOf(u) + "], doesnt resolve to element"); + } + catch(er) { + _errorHandler(er, null, _name + "." + mthd + "()"); + } + } + return undefined; + }, + /** + * object and button elements arent supported, but input button/submit/reset is. + * + * @ignore + * @param {element} r + * @param {boolean} [b] + * - allow button (input type:button|submit|reset) + * @return {string} + * - empty: not a field + */ + _fieldType = function(r, b) { + var t = r.tagName.toLowerCase(); + if(t === "input") { + if((t = r.getAttribute("type"))) { // Secure against getAttribute returning undefined or other non-string falsy (unlikely, but anyway). + switch(t) { + case "button": + case "submit": + case "reset": + return !b ? "" : t; + case "radio": + return _radio; + case "checkbox": + return self.ancestor(r, "div.form-checkboxes", 3) ? _checklist : "checkbox"; + default: + return t; + } + } + return ""; + } + return self.arrayIndexOf(_nonInputFlds, t) > -1 ? t : ""; + }, + /** + * Handles all field types (also checkbox, checkboxes/check list, and radios), and adds/removes css class 'form-button-disabled' to button. + * + * @ignore + * @param {boolean} nbl + * @param {string|element|array|jquery} slctr + * - works on multiple elements + * @param {element|string|falsy} [cntxt] + * - default: document is context + * @param {string} [ttl] + * - update the element's (hover) title attribute + * @return {void} + */ + _disable = function(nbl, slctr, cntxt, ttl) { + var a = _elm(true, slctr, cntxt, !nbl ? "disable" : "enable"), le, i, r; + if(a) { + le = a.length; + for(i = 0; i < le; i++) { + (r = a[i]).disabled = !nbl ? "disabled" : false; + if(typeof ttl === "string") { + r.setAttribute("title", ttl); + } + switch(_fieldType(r, true)) { // Allow button. + case "checkbox": + $(r).unbind("click." + _name + ".disabled"); + if(!nbl) { + $(r).bind("click." + _name + ".disabled", function() { + return false; + }); + } + break; + case _checklist: + $("input[type='checkbox']", r).each(function(){ + $(r).unbind("click." + _name + ".disabled"); + if(!nbl) { + $(this).bind("click." + _name + ".disabled", function() { + return false; + }); + } + }); + break; + case _radio: + $("input[name='" + r.getAttribute("name") + "']", cntxt).each(function(){ + this.disabled = !nbl ? "disabled" : false; + }); + break; + case "button": + case "submit": + case "reset": + $(r)[ !nbl ? "addClass" : "removeClass" ]("form-button-disabled"); + break; + } + } + } + }, + /** + * Get/set value checkbox field. + * + * Getting means getting the value attribute (if on), or empty string if off. + * + * Setting only means setting checked or not - does not change the value attribute of the field. + * + * @ignore + * @function + * @name Judy._valCheckbox + * @param {element} r + * @param {boolean|undefined} [val] + * - default: undefined (~ get value, dont set) + * - truthy: check it + * @return {string|integer|undefined} + * - empty string if not checked + * - true if setting succeeded + * - undefined if no such field exist + */ + _valCheckbox = function(r, val) { + // get + if(val === undefined) { + return r.checked ? r.value : ""; + } + // set + r.checked = (val ? "checked" : false); + return true; + }, + /** + * Get/set checked value of radio list field. + * + * If arg val is empty string: unchecks all radio options. + * + * If the radio element has no name attribute, then works like a checkbox; returns the value of that element if checked (ignores other radio elements). + * + * @ignore + * @function + * @name Judy._valRadio + * @param {element} r + * @param {element|string|falsy} [context] + * - default: document is context + * @param {string|integer|undefined} [val] + * - default: undefined (~ get value, dont set) + * @return {string|boolean|undefined} + * - empty string (getting only) if none checked + * - true if setting and that value is an option + * - false if setting and that value isnt an option + * - undefined if no such input field exist + */ + _valRadio = function(r, context, val) { + var nm = r.getAttribute("name"), a, le, i, v; + if(!nm) { // No name works like a checkbox. + return _valCheckbox(r, val); + } + // get ------------------------------------ + if(val === undefined) { + return (v = $("input[name='" + nm + "']:checked", context).val()) !== undefined ? v : ""; + } + // set ------------------------------------ + if( (le = (a = $().get("input[name='" + nm + "']", context)).length) ) { + // If real empty value, and not "0". + if((v = "" + val) === "") { + for(i = 0; i < le; i++) { + a[i].checked = false; // we dont care which was checked, just uncheck all + } + return true; + } + // non-empty value, check the one that has that particular value (if exists) + for(i = 0; i < le; i++) { + if(a[i].value === v) { + a[i].checked = "checked"; + return true; + } + } + return false; + } + return undefined; // Shouldnt be possible, .fieldValue() should catch non-existing; but anyway. + }, + /** + * Get/set selected value(s) of select field. + * + * Supports multiple. + * + * When getting: + * - option value "_none" translates to "" + * - multiple select returns array if any option selected, otherwise returns "" + * + * When setting, arg val is: + * - empty string or array, or [""]: un-selects all, no matter if the select is multiple or not + * - array, and select is non-multiple: uses only the first bucket of the array + * - non-empty string, and select is multiple: uses val as bucket in array having a single bucket + * + * Arg val will be stringified before comparison with option values (multiple: the buckets are stringified, in a copy of arg val). + * + * @ignore + * @function + * @name Judy._valSelect + * @param {element} r + * @param {array|string|mixed|undefined} [val] + * - default: undefined (~ get value, dont set) + * @return {string|array|boolean|undefined} + * - array if getting multiple select, unless none (then empty string) + * - empty string (getting only) if none selected + * - true if clearing all options + * - integer if selecting some option(s); zero if none of this/those options exist + * - undefined if no such select field exist + */ + _valSelect = function(r, val) { + var multi, ndx = -1, rOpts, nOpts, rOpt, nVals, i, vals = [], v, set = 0; + // get ------------------------------------ + if(val === undefined && + ((ndx = r.selectedIndex) === undefined || ndx < 0)) { + return ""; + } + // getting and setting + multi = r.multiple; + nOpts = (rOpts = $("option", r).get()).length; + // get ---------------- + // Translating selectedIndex to actual option is weird/error prone, so we use jQuery list of options instead. + if(val === undefined) { + if(!multi) { + return (v = rOpts[ndx].value) !== "_none" ? v : ""; + } + // multi + for(i = 0; i < nOpts; i++) { + if((rOpt = rOpts[i]).selected && + (v = rOpt.value) !== "" && v !== "_none") { + vals.push(v); + } + } + return vals.length ? vals : ""; + } + // set ------------------------------------ + // start by clearing all + // r.selectedIndex = -1; ...is seriously unhealthy, may effectively ruin the select. + for(i = 0; i < nOpts; i++) { + rOpts[i].selected = false; + } + if(val === "" || val === "_none") { + return true; // all done + } + // secure array + if(!self.isArray(val)) { + v = ["" + val]; + } + else { + if(!(nVals = val.length) || + (nVals === 1 && (val[0] === "" || val[0] === "_none")) + ) { + return true; // all done + } + v = val.concat(); + for(i = 0; i < nVals; i++) { // stringify for comparison + v[i] = "" + v[i]; + } + } + for(i = 0; i < nOpts; i++) { + if( ( (rOpt = rOpts[i]).selected = + self.arrayIndexOf(v, rOpt.value) > -1 ? "selected" : false) + ) { // set? and count + ++set; + if(!multi) { + return 1; + } + } + } + return set; + }, + /** + * Get/set selected values of checkbox list field (Drupal special). + * + * When getting: + * - returns array if any option selected, otherwise returns "" + * + * When setting, arg val is: + * - empty string or array, or [""]: un-selects all + * - non-empty string or not array: sets that single value (if stringified value equals one of the options available) + * + * Setting effectively means 1. resetting the whole list, and then 2. selecting the value(s) passed by the val argument. + * If you dont want to reset, but only make sure to select some value(s) - see the example. + * + * Arg val will be stringified before comparison with option values (array: the buckets are stringified, in a copy of arg val). + * + * Warning - empty value: + * - a check list should ideally not have an empty value (neither "" nor "_none"); instead, a check list is empty when no option is selected + * - if you really want an emptyish value, make it "_none" ("_none" is for this method a normal value, whereas "" means none selected at all) + * + * @example // Checking some option, but not resetting the whole list: +var values = Judy.fieldValue("some_field[und][whatever]"), checkOption = "some_option"; +if(values) { // not simply "" ~ empty + values.push(checkOption); // no matter if "some_option" is already checked, no prop if an option appears more than once when setting +} +else { + values = checkOption; +} +Judy.fieldValue("some_field[und][whatever]", null, values); + * + * @ignore + * @function + * @name Judy._valChecklist + * @param {element} r + * @param {array|string|mixed|undefined} [val] + * - default: undefined (~ get value, dont set) + * - empty string or array or [""] translates to clear all options + * - non-empty string or not array: sets that single value (stringified) + * @return {array|string|integer|boolean|undefined} + * - array if getting and any option is selected + * - empty string if getting and no option selected + * - true if clearing all options + * - integer if selecting some option(s); zero if none of this/those options exist + * - undefined if not a checklist field + */ + _valChecklist = function(r, val) { // NB: hidden 5th argument used internally + var par, rOpts, nOpts, rOpt, nVals, i, v = [], set = 0; + if((par = self.ancestor(r, "div.form-checkboxes", 3))) { + nOpts = (rOpts = $("input[type='checkbox']", par).get()).length; + // get ------------------------------------ + if(val === undefined) { + for(i = 0; i < nOpts; i++) { + if((rOpt = rOpts[i]).checked) { + v.push(rOpt.value); + } + } + return v.length ? v : ""; + } + // set ------------------------------------ + // let empty be undefined, otherwise secure array + v = !self.isArray(val) ? ( + val === "" ? undefined : [val] + ) : ( + !(nVals = val.length) || (nVals === 1 && val[0] === "") ? undefined : + val.concat() // do copy array, because we stringify values + ); + if(v === undefined) { // unset all + for(i = 0; i < nOpts; i++) { + rOpts[i].checked = false; + } + return true; + } + for(i = 0; i < nVals; i++) { // stringify all buckets, because field values are always strings (~> comparison) + v[i] = "" + v[i]; + } + for(i = 0; i < nOpts; i++) { + if( ( (rOpt = rOpts[i]).checked = + self.arrayIndexOf(v, rOpt.value) > -1 ? "checked" : false) + ) { // set? and count + ++set; + } + } + return set; + } + return undefined; // IDE (wrongly) complains otherwise + }, + /** + * @ignore + * @param {object} o + * @param {array} fltr + * @return {boolean} + */ + _filter = function(o, fltr) { + var le = fltr.length, i, k, x, not, v; + for (i = 0; i < le; i++) { + for (k in fltr[i]) { + v = null; // Clear reference (loop). + if (fltr[i].hasOwnProperty(k)) { + x = k; + if ((not = x.charAt(0) === '!')) { + x = x.substr(1); + } + if (o.hasOwnProperty(x)) { + if ((v = fltr[i][k]) && v instanceof RegExp) { + if (typeof o[x] === 'string') { + if (v.test(o[x])) { + if (not) { + return false; + } + } + else if (!not) { + return false; + } + } + } + else if (o[x] === v) { + if (not) { + return false; + } + } + else if (!not) { + return false; + } + } + } + } + } + return true; + }, + /** + * ajaxcomplete.off() helper. + * + * @ignore + * @param {string} u + * @param {string} s + * @param {string} [nm] + * @param {function} [h] + * @return {void} + */ + _acOff = function(u, s, nm, h) { + var le, i, rm = [], n, sbtrt; + if (_acLstnrs[u] && _acLstnrs.hasOwnProperty(u)) { + le = _acLstnrs[u].length; + for (i = 0; i < le; i++) { + if ((_acLstnrs[u][i][0] === s || (nm && _acLstnrs[u][i][1] === nm)) && + (!h || _acLstnrs[u][i][2] === h) + ) { + rm.push(i); + } + } + if ((n = rm.length)) { + if (n === le) { + delete _acLstnrs[u]; + } + else { + sbtrt = 0; + for (i = 0; i < n; i++) { + _acLstnrs[u].splice(rm[i] - sbtrt, 1); + ++sbtrt; + } + } + } + } + }, + /** Convert human readable keydown_keystroke sequence to _NNNNNNN. + * ctr, meta and cmd count as a single key, because it makes sense across OSes (Windows vs. Apple), and because ctr also fires meta on Windows. + * @ignore + * @private + * @memberOf Judy + * @throws {Error} + * - (UNCAUGHT) if empty or bad sequence (missing plain key, or containing unsupported char) etc. + * - "_1001055", false on error + * @param {string} keystrokes + * - like: "ctr_shift_7" | "7" + * @return {string|false} + */ + _keyMask = function(keystrokes) { + var aK = keystrokes.toUpperCase().split(/_/), nK = aK.length, k = 0, ky, cK, i; + for(i = 0; i < nK; i++) { + switch((ky = aK[i])) { + // modifiers ------------------------------------ + case "CTR": case "CTRL": + case "CMD": case "META":k += 100000;break; + case "ALT":k += 10000;break; + case "SHIFT":k += 1000;break; + // plain key ------------------------------------ + case "ENTER": case "RETURN":k += 13;break; + case "ESC": case "ESCAPE":k += 27;break; + case "TAB":k += 9;break; + case "SPACE":k += 32;break; + case "BACKSPACE":k += 8;break; + case "INS": case "INSERT":k += 45;break; + case "DEL": case "DELETE":k += 46;break; + case "HOME":k += 36;break; + case "END":k += 35;break; + case "PGUP": case "PAGEUP":k += 33;break; + case "PGDN": case "PAGEDOWN":k += 34;break; + case "PAUSE": case "BREAK":k += 19;break; + case "STAR":k += 106;break; + case "-": case "MINUS": case "HYPHEN":k += 109;break; + case "+": case "PLUS":k += 107;break; + case "LEFT":k += 37;break; + case "UP":k += 38;break; + case "RIGHT":k += 39;break; + case "DOWN":k += 40;break; + case "F1":k += 112;break; + case "F2":k += 113;break; + case "F3":k += 114;break; + case "F4":k += 115;break; + case "F5":k += 116;break; + case "F6":k += 117;break; + case "F7":k += 118;break; + case "F8":k += 119;break; + case "F9":k += 120;break; + case "F10":k += 121;break; + case "F11":k += 122;break; + case "F12":k += 123;break; + default: + cK = ky.charCodeAt(0); + if(cK >= 96 && cK <= 105) { // numpad numbers ~> numbers + k += (cK - 48); + } + else if((cK >= 65 && cK <= 90) || (cK >= 48 && cK <= 57)) { + k += cK; + } + else { // skip anything else + throw new Error("unsupported char["+ky+"] in keystrokes["+keystrokes+"]"); + } + } + } + if(k && k % 1000 > 0) { + return "_" + k; + } + throw new Error("keystrokes["+keystrokes+"] " + (!k ? "evaluates to nothing" : "all modifiers, no plain keys")); + }, + /** Convert keystrokes of an event to key mask. + * @ignore + * @private + * @memberOf Judy + * @throws {Error} + * - (UNCAUGHT) if empty or bad sequence (missing plain key, or containing unsupported char) etc. + * @param {event} e + * @return {integer} + */ + _keystrokes = function(e) { + var k = 0, kC; + // all key events are executed, no matter what keystrokes, so here we have to check if the keystrokes + // this method got as argument are the same as the ones pressed by the user + if(e.ctrlKey || e.metaKey) { // command key, not IE + k += 100000; + } + if(e.altKey) { + k += 10000; + } + if(e.shiftKey) { + k += 1000; + } + if((kC = e.keyCode)) { + switch(kC) { // when more keys evaluates to same, they have to be translated to common + case 61: // hyphen ~> numpad minus + k += 107; + break; + case 189: // plus ~> numpad plus + k += 109; + break; + default: + if(kC >= 96 && kC <= 105) { // numpad numbers ~> numbers + k += (kC - 48); + } + else { + k += kC; + } + } + } + return k; + }, + /* Un-format keystroke string, for human readable output. + * No error checking, do or die. + * @ignore + * @private + * @memberOf Judy + * @param {string} keyMask + * - like "_1001055" + * @return {string} like "ctr_shift_7" + * + this.keystrokes = function(keyMask) { + if(keyMask.charAt(0) !== "_") { // if not starting with underscore it is not formatted + return keyMask; + } + var k = parseInt(keyMask.substr(1), 10), ks = ""; + if(k > 100000) { + ks += "ctr_"; + k -= 100000; + } + if(k > 10000) { + ks += "alt_"; + k -= 10000; + } + if(k > 1000) { + ks += "shift_"; + k -= 1000; + } + switch(k) { + case 13:ks += "enter";break; + case 27:ks += "escape";break; + case 9:ks += "tab";break; + case 32:ks += "space";break; + case 8:ks += "backspace";break; + case 45:ks += "insert";break; + case 46:ks += "delete";break; + case 36:ks += "home";break; + case 35:ks += "end";break; + case 33:ks += "pageup";break; + case 34:ks += "pagedown";break; + case 19:ks += "pause";break; + case 106:ks += "star";break; + case 109:ks += "minus";break; + case 107:ks += "plus";break; + case 37:ks += "left";break; + case 38:ks += "up";break; + case 39:ks += "right";break; + case 40:ks += "down";break; + default: + if(k >= 112 && k <= 123) { + ks += "f" + (k - 111); + } // f keys + else { + ks += String.fromCharCode(k).toLowerCase(); + } + } + return ks; + },*/ + /** + * @ignore + * @param {string} et + * - keydown|keyup + * @param {array} as + * - caller arguments + * @return {boolean} + */ + _bindKeys = function(et, as) { + var jq = $(as[0]), jqMthd = typeof jq.on === "function" ? "on" : "bind", + nAs = as.length, qualifiers = "", nQs, iQ, q, nm, kms = {}, km, + rs = jq.get(), nRs = jq.length, r, + hndlr, dat, pdef = false, i, jq1, d, e, j, le, kyHndlrs, f; + if(nAs < 3) { + throw new Error("requires at least 3 args"); + } + if(!nRs) { + throw new Error("No element like selector[" + as[0] + "], type[" + self.typeOf(as[0]) + "]"); + } + // Find handler + data (if any) + preventDefault (if any). + for(i = 1; i < 5; i++) { + switch(typeof as[i]) { + case "string": + qualifiers = as[1]; + break; + case "function": + hndlr = as[i]; + break; + case "object": + dat = as[i]; + break; + case "boolean": + pdef = as[i]; + break; + } + } + if(!hndlr) { + throw new Error("No handler function arg found"); + } + // For every qualifier. + nQs = (qualifiers = qualifiers.split(" ")).length; + for(iQ = 0; iQ < nQs; iQ++) { + // Remove keydown_|keyup_, if given qualifiers arg "keydown_qualifiers" instead of just "qualifiers". + if((q = qualifiers[iQ]).indexOf("key") === 0) { + q = q.replace(/^key[^_]+_(.+)$/, "$1"); + } + // If event type not qualified; let normal jQuery.on|bind() do all work. + if(!q || q === "*") { + jq[jqMthd].apply(jq, !dat ? [et, hndlr] : [et, dat, hndlr]); + return true; + } + // Extract namespace. + nm = ""; + if(q.indexOf(".") > -1) { + nm = q.replace(/^[^\.]+\.(.+)$/, "$1"); + q = q.replace(/^([^\.]+)\..+$/, "$1"); + } + // Translate to keymask. + km = _keyMask( // _keymask() throws error upon failure. + q.replace(/[_\+]\+/, "_plus").replace(/\+/g, "_") // Support plus spacers as well as underscore spacers. + ); + // Skip if keymask evaluates to already listed keymask (ctr_7 ~ cmd_7 ~ meta_7). + if(iQ && kms[km] && kms.hasOwnProperty(km)) { + continue; + } + kms[km] = { + handler: hndlr, + data: dat, + namespace: nm, + type: q, + preventDefault: pdef + } + } + // For every element of the jQuery object. + for(i = 0; i < nRs; i++) { + // check that key event isnt set on unsupported element type + if((r = rs[i]) !== document.documentElement) { // propably the most usual key event element + if(r === window) { + if(_uaIe) { // ie + throw new Error("IE key event on window illegal, do set it on document.documentElement"); + } + } + else if(!_uaIe) { // gecko and webkit; the element must be focusable. + switch(r.tagName.toLowerCase()) { + case "textarea": case "input": + break; + default: + if(!r.hasAttribute("tabindex")) { + throw new Error("non-IE key event on tag-type["+r.tagName+"] without tabindex not possible"); + } + } + } + } + // Find common keydown/keyup handler, if exists. + kyHndlrs = null; + if((d = (jq1 = $(r)).data("events")) && (e = d[et]) && d.hasOwnProperty(et)) { + le = e.length; + // For every listener to keydown|keyup. + for(j = 0; j < le; j++) { + if(e[j].namespace === _dataName) { + kyHndlrs = e[j].handler.judy_keyMask_handlers; + break; + } + } + } + // No common keydown/keyup handler; create that. + if(!kyHndlrs) { + f = function(evt) { + var o, k, a, pd, le, i, lstnr, e; + if((a = (o = f.judy_keyMask_handlers)[ k = "_" + _keystrokes(evt) ]) && o.hasOwnProperty(k) && (le = a.length)) { + for(i = 0; i < le; i++) { + lstnr = a[i]; + if(!pd && lstnr.preventDefault) { + pd = true; + evt.preventDefault(); + } + evt.data = lstnr.data; + evt.keystrokes = lstnr.type; + lstnr.handler.apply(this, [evt]); + } + } + }; + kyHndlrs = f.judy_keyMask_handlers = {}; + jq1[jqMthd](et + "." + _dataName, f); + } + // For every keymask. + for(km in kms) { + if(kms.hasOwnProperty(km)) { + if(kyHndlrs[km] && kyHndlrs.hasOwnProperty(km)) { + kyHndlrs[km].push( kms[km] ); + } + else { + kyHndlrs[km] = [ + kms[km] + ]; + } + } + } + } + return undefined; // For IDE. + }, + /** + * Timezone offset, in positive milliseconds, or as a (hour) string. + * Native method getTimezoneOffset() returns negative (sic!) value, in minutes - alltogether fairly useless. + * @ignore + * @param {Date} dt + * @param {boolean} [asHourStr] + * @return {integer|str} milliseconds | "+/-NN" hours + */ + _dateTz = function(dt, asHourStr) { + var z = dt.getTimezoneOffset(), zu; + return !asHourStr ? (-(z * 60 * 1000)) : + (z ? (((zu = z > 0) ? "-" : "+") + ((zu = ((zu ? z : z * -1) / 60)) < 10 ? "0" : "") + + Math.floor(zu)) : "+00"); + }, + /** + * Helper for iso-8601 formats + * @ignore + * @param {Date} dt + * @param {boolean} d - truthy: YYYY-MM-DD + * @param {boolean} t - truthy: HH:ii:ss + * @param {boolean} m - truthy: mmm + * @param {boolean} UTC - truthy: get in Universal Time + * @param {boolean} iso - use T and Z markers + * @return {string} + */ + _dateFrmt = function(dt, d, t, m, UTC, iso) { + var u, f = UTC ? "getUTC" : "get"; + return (d ? ( + dt[f+"FullYear"]() + "-" + + ((u = dt[f+"Month"]() + 1) < 10 ? ("0" + u) : u) + "-" + + ((u = dt[f+"Date"]()) < 10 ? ("0" + u) : u) + ) : "" + ) + + (d && t ? (iso ? "T" : " ") : "") + + (t ? ( + ( + ( (u = dt[f+"Hours"]()) < 10 ? ("0" + u) : u) + ":" + + ( (u = dt[f+"Minutes"]()) < 10 ? ("0" + u) : u) + ":" + + ( (u = dt[f+"Seconds"]()) < 10 ? ("0" + u) : u) + ) + + (m ? ( + (iso ? "." : " ") + + ( (u = dt[f+"Milliseconds"]()) < 10 ? ("00" + u) : (u < 100 ? ("0" + u) : u) ) + ) : "") + ) : "" + ) + + (!iso ? "" : (UTC ? "Z" : (_dateTz(dt, 1) + ":00"))); + }, + /** + * Measures inner width or height of an element, padding subtracted (unlike jQuery's innerWidth()). + * + * Also usable as alternative to jQuery(window).width/height(), which may give wrong result for mobile browsers. + * + * @ignore + * @param {string} d + * - Width|Height + * @param {string|element|array|jquery} slctr + * - if window, document.documentElement or document.body: the method disregards other args + * @param {boolean} [ignorePadding] + * - default: false (~ subtract padding, unlike jQuery) + * @return {integer|undefined} + */ + _dimInner = function(d, slctr, ignorePadding) { + var u = slctr, r, dE = document.documentElement, jq, v, p; + if(u === window) { + return dE[ "client" + d ]; // clientWidth/clientHeight + } + if(u === dE || u === document.body) { + return dE[ "scroll" + d ]; // scrollWidth/scrollHeight + } + if((r = _elm(0, u, 0, "inner" + d))) { + v = r[ "client" + d ]; // clientWidth/clientHeight + if(!ignorePadding) { + if((p = (jq = $(r)).css( "padding-" + (d === "Width" ? "left" : "top") )).indexOf("px") > -1) { + v -= parseFloat(p); + } + if((p = jq.css( "padding-" + (d === "Width" ? "right" : "bottom") )).indexOf("px") > -1) { + v -= parseFloat(p); + } + v = Math.round(v); + } + return v; + } + return undefined; + }, + /** + * Measures or sets effective outer width or height of an element, including padding, border and optionally margin. + * + * The width/height will be set on the element itself, in pixels. + * + * If selector is window, then window scrollbar is included. + * + * @ignore + * @param {string} d + * - Width|Height + * @param {string|element|array|jquery} slctr + * - if window, document.documentElement or document.body: the method disregards other args and simply measures + * @param {boolean} [includeMargin] + * - default: false (~ dont check margin) + * @param {integer|falsy} [set] + * - set outer width/height (including padding, and optionally also margin) to that number of pixels + * @param {boolean|integer|falsy} [max] + * - default: false (~ set width) + * - true|one: set max-width/height, not width/height + * - two: set both + * @return {integer|undefined} + */ + _dimOuter = function(d, slctr, includeMargin, set, max) { + var u = slctr, r, dE = document.documentElement, jq, v; + if(u === window) { + return dE[ "inner" + d ] || dE[ "client" + d ]; // innerWidth/innerHeight includes scrollbar + } + if(u === dE || u === document.body) { + return dE[ "scroll" + d ]; + } + if((r = _elm(0, u, 0, "outer" + d))) { + v = (jq = $(r))[ "outer" + d ](includeMargin); // Let jQuery do the clientWidth + border (+ margin) + if(!set || // if only measuring + set === v) { // or dimension correct + return v; + } + v = _dimInner(d, u) + (set - v); + if(!max || max === 2) { + jq.css(d.toLowerCase(), v + "px"); + } + if(max) { + jq.css("max-" + d.toLowerCase(), v + "px"); + } + return set; + } + return undefined; + }, + /** + * Resizes the overlay to fill whole window/document; handler for window resize event. + * + * @ignore + * @return {void} + */ + _ovrlyRsz = function() { + var w = window, d = document.documentElement, dW, dD; + _jqOvrly.css({ + width: ((dD = self.innerWidth(d)) > (dW = self.innerWidth(w)) ? dD : dW) + "px", + height: ((dD = self.innerHeight(d)) > (dW = self.innerHeight(w)) ? dD : dW) + "px" + }); + }; + + /** + * Use for checking if that window.Judy is actually the one we are looking for (see example). + * @example +if(typeof window.Judy === "object" && Judy.yduj) { + ... +} + * @name Judy.yduj + * @type boolean + */ + this.yduj = true; + /** + * Use for checking if that window.Judy is actually the one we are looking for (see example). + * @example +if(typeof window.Judy === "object" && Judy.yduJ) { + ... +} + * @name Judy.yduJ + * @type boolean + */ + this.yduJ = true; + /** + * @name Judy.version + * @type float + */ + this.version = 2.1; + /** + * Is the browser Internet Explorer, and if so, the version as float. + * + * @name Judy.browserIE + * @type integer|float + * - zero if not IE + */ + this.browserIE = _uaIe = (function() { + var u; + if ((u = window.navigator) && (u = u.userAgent)) { + if (/; MSIE \d{1,2}\.\d/.test(u)) { + return (u = parseFloat(u.replace(/^.+; MSIE (\d{1,2}\.\d).+/, '$1'))) ? u : 0; + } + if (/; Trident\/\d+\.\d+;/.test(u) && /; rv:\d+\.\d+[;\)]/.test(u)) { + return (u = parseFloat(u.replace(/^.+; rv:(\d+\.\d+)[;\)].+$/, '$1'))) ? u : 0; + } + } + return 0; + }()); + /** + * @ignore + * @return {void} + */ + this.setup = function() { + /** @ignore */ + self.setup = function() {}; // Prevent second call. + _dataName = "judy_" + self.randName(); + }; + // Type. + /** + * All native types are reported in lowercase (like native typeof does). + * + * If given no arguments: returns "Judy". + * Types are: + * - native, typeof: object string number + * - native, corrected: function array date regexp image + * - window, document, document.documentElement (not lowercase) + * - element, checked via .getAttributeNode + * - text node: textNode + * - attribute node: attributeNode + * - event: event (native and prototyped W3C Event and native IE event) + * - jquery + * - emptyish and bad: undefined, null, NaN, infinite + * - custom or prototyped native: all classes having a typeOf() method. + * + * RegExp is an object of type regexp (not a function - gecko/webkit/chromium). + * Does not check if Date object is NaN. + * + * Is same as Inspect.typeOf(). + * @function + * @name Judy.typeOf + * @param {mixed} u + * @return {string} + */ + this.typeOf = function(u) { + var t = typeof u; + if(!arguments.length) { + return "Judy"; + } + switch(t) { + case "boolean": + case "string": + return t; + case "number": + return isFinite(u) ? t : (isNaN(u) ? "NaN" : "infinite"); + case "object": + if(u === null) { + return "null"; + } + // Accessing properties of object may err for various reasons, like missing permission (Gecko). + try { + if(u.typeOf && typeof u.typeOf === "function") { + return u.typeOf(); + } + else if(typeof u.length === "number" && !(u.propertyIsEnumerable("length")) && typeof u.splice === "function") { + return "array"; + } + else if(u === window) { + return "window"; + } + else if(u === document) { + return "document"; + } + else if(u === document.documentElement) { + return "document.documentElement"; + } + else if(u.getAttributeNode) { // element + // document has getElementsByTagName, but not getAttributeNode - document.documentElement has both + return u.tagName.toLowerCase === "img" ? "image" : "element"; + } + else if(u.nodeType) { + switch(u.nodeType) { + case 3:return "textNode"; + case 2:return "attributeNode"; + } + return "otherNode"; + } + else if(typeof u.stopPropagation === "function" || + (u.cancelBubble !== undefined && typeof u.cancelBubble !== "function" && + typeof u.boundElements === "object")) { + return "event"; + } + else if(typeof u.getUTCMilliseconds === "function") { + return "date"; + } + else if(typeof u.exec === "function" && typeof u.test === "function") { + return "regexp"; + } + else if(u.hspace && typeof u.hspace !== "function") { + return "image"; + } + else if(u.jquery && typeof u.jquery === "string" && !u.hasOwnProperty("jquery")) { + return "jquery"; + } + } + catch(er) { + } + return t; + case "function": + // gecko and webkit reports RegExp as function instead of object + return (u.constructor === RegExp || (typeof u.exec === "function" && typeof u.test === "function")) ? + "regexp" : t; + } + return t; + }; + /** + * Is container Object or Array (if arg orArray), and not a built-in type or jquery. + * + * Non-containers; built-in types and jquery: + * - window, document, document.documentElement, element + * - textNode, attributeNode, otherNode + * - image + * - event + * - date + * - regexp + * - jquery + * + * @function + * @name Judy.isContainer + * @param {mixed} u + * @param {boolean} [orArray] + * - allow array + * @return {string|boolean} + * - string: 'object' (any kind of non-array container) or 'array' + * - false: not a container + */ + this.isContainer = function(u, orArray) { + var t; + return u && typeof u === "object" && + ( + (t = self.typeOf(u)) === "object" || (orArray && t === "array") || ( + t !== "array" && + self.arrayIndexOf(_nonObj, t) === -1 ) + ) ? (!orArray || t !== "array" ? "object" : t) : false; + }; + /** + * @function + * @name Judy.isArray + * @param {mixed} u + * @return {boolean} + */ + this.isArray = function(u) { + // Douglas Crockford's expression: + return (u && typeof u === "object" && + typeof u.length === "number" && !(u.propertyIsEnumerable("length")) && typeof u.splice === "function"); + }; + /** + * A "number" is not a number, use jQuery.isNumeric() for more lenient check. + * @function + * @name Judy.isNumber + * @param {mixed} u + * @return {boolean} + */ + this.isNumber = function(u) { + return typeof u === "number" && isFinite(u); + }; + /** + * @function + * @name Judy.isInt + * @param {mixed} u + * @param {boolean} [nonNegative] + * - default: false (~ allow negative integer) + * @return {boolean} + */ + this.isInt = function(u, nonNegative) { + return typeof u === "number" && isFinite(u) && (u % 1 === 0) && (!nonNegative || u > -1); + }; + + // Containers. + /** + * Alternative to clone, when arg u is a simple Object container or array. + * + * Optionally copies child objects|arrays instead of referring them. + * Checks self-references in depth 1. + * + * No support for arguments collection in old browsers; see {@link Judy.toArray}(). + * @function + * @name Judy.containerCopy + * @see Judy.toArray() + * @param {object|arr} oa + * @param {boolean} [shallow] + * - default: false (~ recursive, also child objects will be copies) + * - truthy: child objects are references + * @return {mixed} + */ + this.containerCopy = function(oa, shallow) { + var t, c = {}, p, v; + if(!oa || !(t = self.isContainer(oa, true))) { + return oa; + } + if(t === "array") { + if(shallow) { + return oa.concat(); + } + c = []; + } + for(p in oa) { + if(oa.hasOwnProperty(p)) { + c[p] = ((v = oa[p]) && typeof v === "object") ? + (v === oa ? c : (!shallow ? self.containerCopy(v, false) : v)) : + v; + } + } + return c; + }; + /** + * Get property of simple or multidimensional object/array. + * + * Doesnt check for bad number key args; infinite, NaN. + * @example // Get value of o.some.deep[3].bucket, if exists: +Judy.objectGet(o, some, deep, 3, bucket); + * @function + * @name Judy.objectGet + * @throws Error + * - (caught) if bad arg(s): only one arg | first arg not object | a later arg not integer or non-empty string + * @param {object} o + * @param {string|integer} anyNumberOfKeys + * @return {mixed|undefined} + */ + this.objectGet = function(o, anyNumberOfKeys) { + var a = arguments, le = a.length, u = o, p, i; + try { + if(!u || typeof u !== "object") { + throw new Error("arg o isnt object"); + } + if(le < 2) { + throw new Error("no key arg"); + } + for(i = 1; i < le; i++) { + if(i > 1 && (!u || typeof u !== "object")) { + return undefined; + } + if((!(p = a[i]) && p !== 0) || !(p = "" + p)) { // try stringing it, to make it err at right place + throw new Error("arg #"+i+"["+p+"] type[" + self.typeOf(p) + "] isnt integer or non-empty string"); + } + if(u.hasOwnProperty(p)) { + u = u[p]; + } + else { + return undefined; + } + } + return u; + } + catch(er) { + _errorHandler(er, null, _name + ".objectGet()"); + } + return undefined; + }; + /** + * Like Object.keys(), which may not be implemented by current browser (ECMAScript 5). + * @function + * @name Judy.objectKeys + * @param {object} o + * @return {array|null} + * - null if not object + */ + this.objectKeys = function(o) { + var a, k; + if(!o || typeof o !== "object") { + return null; + } + if(typeof Object.keys === "function") { + return Object.keys(o); + } + a = []; + for(k in o) { + if(o.hasOwnProperty(k)) { + a.push(k); + } + } + return a; + }; + /** + * Value-to-key mapper - String.indexOf() for objects. + * @function + * @name Judy.objectKeyOf + * @param {object} o + * @param {mixed} v + * @return {mixed} + * - undefined if arg v is undefined, or arg o isnt object, or arg o doesnt contain arg v value + */ + this.objectKeyOf = function(o, v) { + var k; + if(v !== undefined && o || typeof o === "object") { + for(k in o) { + if(o.hasOwnProperty(k) && o[k] === v) { + return k; + } + } + } + return undefined; + } + /** + * Get copy of object, sorted by value. + * + * If two or more buckets have the same value, the last bucket will overwrite the previous. + * + * Will not sort right if a bucket is a string whose first char is DEL (ascii 127). + * + * @function + * @name Judy.objectSort + * @param {object} o + * @return {object} + */ + this.objectSort = function(o) { + var a = [], oByVal = {}, os = {}, k, v, cNum = String.fromCharCode(127), le, i = 0; + if(!o || typeof o !== "object") { + return o; + } + // make object mapping value to key, and array of values + for(k in o) { + if(o.hasOwnProperty(k)) { + ++i; + // prefix DEL if number + oByVal[ (typeof (v = o[k]) !== "number" ? "" : cNum) + v ] = k; + a.push(v); + } + } + if(!i) { + return o; + } + le = i; + a.sort(); + for(i = 0; i < le; i++) { + os[ oByVal[ (typeof (v = a[i]) !== "number" ? "" : cNum) + v ] ] = v; + } + return os; + }; + /** + * Get copy of object, sorted by key. + * @function + * @name Judy.objectKeySort + * @param {object} o + * @return {o|null} + */ + this.objectKeySort = function(o) { + var a, os = {}, le, i; + if(!(a = self.objectKeys(o)) || (le = a.length) < 2) { + return a ? o : null; + } + a.sort(); + for(i = 0; i < le; i++) { + os[ a[i] ] = o[ a[i] ]; + } + return os; + }; + /** + * Copy object's public properties to an array. + * + * Particularly handy for function arguments. + * Arguments is a collection, not an array, and in older browsers (IE<9) it may not even have .hasOwnProperty(). + * @function + * @name Judy.toArray + * @param {object} o + * @return {array|null} + * - null if arg o isnt an object + */ + this.toArray = function(o) { + var a, le, i; + if(o && typeof o === "object") { + if(typeof o.hasOwnProperty === "function") { // Should catch rubbish IE<9 arguments collection. + return Array.prototype.slice.call(o); + } + a = []; + le = o.length; + for(i = 0; i < le; i++) { + a.push(o[i]); + } + return a; + } + return null; + // When IE<9 is history: + // return o && typeof o === "object" ? Array.prototype.slice.call(o) : null; + }; + /** + * String.indexOf for Array. + * + * Values are === checked; i.e. type sensitive ("0" is not 0). + * And for objects and arrays - as value - requiring identity; one {} does not === equal another {} in Javascript. + * + * No argument error checking; this method has to be as fast as possible. + * + * @example // Looking for an 'inArray' method? +if (Judy.arrayIndexOf(arr, val) > -1) { ... + * @function + * @name Judy.arrayIndexOf + * @param {array} a + * @param {mixed} v + * @return {integer} + * - minus 1 if not found + */ + this.arrayIndexOf = function(a, v) { + var le = a.length, i; + for(i = 0; i < le; i++) { + if(a[i] === v) { + return i; + } + } + return -1; + }; + /** + * Merge two objects or two arrays recursive, let second object|array's attributes overwrite first object|array's attributes. + * + * The first arg object/array will be changed (return value is boolean), but sub objects/arrays are mostly copies (not references). + * + * Skips overriding when: + * - overwriter bucket is undefined (but exists anyways) + * - overwriter bucket is null, and original bucket isnt undefined (a concession to PHP; which has no undefined, only null) + * + * Which object types arent considered 'object': see {@link Judy.isContainer}(). + * + * Max recursion depth: 10. + * @function + * @name Judy.merge + * @throws {TypeError} + * - (caught) if oa and overrider arent both object or both array + * @throws {Error} + * - (caught) if recursing deeper than 10 + * @param {object|arr} oa + * @param {object|arr} oa1 + * @param {integer|undefined} [isContainer] + * - falsy: dont know + * - 1: args oa and overrider are both know to be objects (and not built-in types {@link Judy.isContainer} or jQuery) + * - 2: args oa and overrider are both know to be arrays + * @return {boolean} + * - success/error; doesnt return object/array, changes arg oa + */ + /* + this.merge = function(oa, oa1, isContainer, _depth) { + var tc = isContainer !== true ? isContainer : 0, // fix fairly obvious arg error + t = tc || self.isContainer(oa), t1 = tc || self.isContainer(oa1), + d = arguments[3] || 0, // depth + p, le, le1, v, v1, tSub; + try { + if(d < 10) { + if(t === 1) { + if(t1 === 1) { + for(p in oa1) { + if(oa1.hasOwnProperty(p) && + (v1 = oa1[p]) !== undefined) { // undefined must never overwrite anything + // if original doesnt have any (or it is undefined, sic), its simple + if((v = oa[p]) === undefined || !oa.hasOwnProperty(p)) { + oa[p] = v1; // null might overwrite undefined + } + else if(v1 !== null) { // null must never overwrite anything but undefined + if(!(tSub = self.isContainer(v)) || self.isContainer(v1) !== tSub) { + oa[p] = v1; + } + else { + self.merge(v, v1, tSub, d + 1); + } + } + } + } + return true; + } + throw new TypeError("Second arg object/array isnt object, but " + self.typeOf(oa1)); + } + else if(t === 2) { + if(t1 === 2) { + if((le1 = oa1.length)) { // does overwriter contain anything at all? + if(!(le = oa.length)) { + oa = oa1.concat(); // copy + } + else { + for(p = 0; p < le1; p++) { + if((v1 = oa1[p]) !== undefined) { // undefined must never overwrite anything + if(p >= le) { // if original isnt that long, append + oa.push(v1); + } + else if((v = oa[p]) === undefined) { // if original's is undefined, overwrite + oa[p] = v1; + } + else if(v1 !== null) { // null must never overwrite anything but undefined + if(!(tSub = self.isContainer(v)) || self.isContainer(v1) !== tSub) { + oa[p] = v1; + } + else { + self.merge(v, v1, tSub, d + 1); + } + } + } + } + } + } + return true; + } + throw new TypeError("Second arg object/array isnt array, but " + self.typeOf(oa1)); + } + throw new TypeError("First arg object/array is " + self.typeOf(oa1)); + } + throw new Error("Cant recurse > 10, circular ref?"); + } + catch(er) { + _errorHandler(er, null, _name + ".merge()"); + } + return false; + }; + */ + this.merge = function(oa, oa1, isContainer, _depth) { + var tBoth = isContainer !== true ? isContainer : 0, // fix fairly obvious arg error + t = tBoth || self.isContainer(oa, true), t1 = tBoth || self.isContainer(oa1, true), + d = _depth || 0, + p, le, le1, v, v1; + try { + if(d < 10) { + if(t && t1) { + if(t === "object") { + if(t1 === "object") { // Both object. + for(p in oa1) { + if(oa1.hasOwnProperty(p) && + (v1 = oa1[p]) !== undefined) { // undefined must never overwrite anything + // if original doesnt have any (or it is undefined, sic), its simple + if((v = oa[p]) === undefined || !oa.hasOwnProperty(p)) { + oa[p] = v1; // null might overwrite undefined + } + else if(v1 !== null) { // null must never overwrite anything but undefined + if(!(t = self.isContainer(v, true)) || self.isContainer(v1, true) !== t) { + oa[p] = v1; + } + else { + self.merge(v, v1, t, d + 1); + } + } + } + } + return true; + } + throw new TypeError("Type mismatch, first is object type[" + self.typeOf(oa) + "], second is array"); + } + else if(t1 === "array") { // Both array. + if((le1 = oa1.length)) { // does overwriter contain anything at all? + if(!(le = oa.length)) { + oa = oa1.concat(); // copy + } + else { + for(p = 0; p < le1; p++) { + if((v1 = oa1[p]) !== undefined) { // undefined must never overwrite anything + if(p >= le) { // if original isnt that long, append + oa.push(v1); + } + else if((v = oa[p]) === undefined) { // if original's is undefined, overwrite + oa[p] = v1; + } + else if(v1 !== null) { // null must never overwrite anything but undefined + if(!(t = self.isContainer(v, true)) || self.isContainer(v1, true) !== t) { + oa[p] = v1; + } + else { + self.merge(v, v1, t, d + 1); + } + } + } + } + } + } + return true; + } + throw new TypeError("Type mismatch, first is array, second is type[" + self.typeOf(oa1) + "]"); + } + throw new TypeError("First arg is type[" + self.typeOf(oa) + "], second is type[" + self.typeOf(oa1) + "]"); + } + throw new Error("Cant recurse > 10, circular ref?"); + } + catch(er) { + _errorHandler(er, null, _name + ".merge()"); + } + return false; + }; + + // DOM. + /** + * Get an ancestor element, of a particular type and/or having id and/or having css class(es). + * + * No support for selector name attribute. + * + * Dont look for body element as ancestor; returns when reaching body (or 100th ancestor) and doesnt check whether body matches arg selector. + * + * @function + * @name Judy.ancestor + * @param {string|element|array|jquery} selector + * - jQuery/css selector or element (not window or document.documentElement) + * @param {string} [parentSelector] + * - if falsy: returns immediate parent (except if arg element is window) + * - like jQuery() selector arg: tagName and/or id and/or css class(es), name name attribute not supported, and class(es) cant go before #id + * @param {integer} [max] + * - default: no maximum + * - positive number: dont look any further, 1 ~ parent | 2 ~ grand parent | etc. + * @return {element|undefined|false} + * - false if arg element isnt an element or window + * - undefined if no such parent, or arg element is window + * - undefined if reaches the body element, and selector doesnt suggest the the body element + */ + this.ancestor = function(selector, parentSelector, max) { + var u, r = _elm(0, selector, null, "ancestor"), tt = parentSelector, lim = max && max > 0 ? (max + 1) : 101, id, aCls, tn, cls, le, i; + if(!r || r === window || r === document.documentElement) { + return undefined; + } + if(!tt || !(tt = $.trim(""+tt))) { + return r.parentNode; + } + if(tt.indexOf("#") > -1) { + u = tt.replace(/^([^\#]+)?\#([^\.]+)(\..+)?$/, "$2,$1$3").split(","); + id = u[0]; + tt = u[1] || ""; + } + if(tt.indexOf(".") > -1) { + aCls = tt.split("."); + tt = aCls[0]; + aCls.splice(0, 1); + le = aCls.length; + } + tt = tt.toLowerCase(); + while((--lim) && (r = r.parentNode)) { + if(r.nodeType !== 1 || + tn === "body") { // check from last level (first time tn is falsy) + return undefined; + } + tn = r.tagName.toLowerCase(); + if( (tt && tn !== tt) || + (id && r.id !== id) ) { + continue; + } + if(le) { + if(!(cls = r.className).length) { + continue; + } + cls = " " + cls + " "; + u = 0; + for(i = 0; i < le; i++) { + if(cls.indexOf(aCls[i]) === -1) { + continue; + } + ++u; + } + if(u < le) { + continue; + } + } + return r; + } + return undefined; + }; + + // Event. + + /** + * Establishes a single CSS/jQuery selector string. + * + * (string) selector: + * - doesnt check existance of such element(s), because must be usable for future elements as well + * - doesnt check validity of the CSS expression + * + * window, document, document.documentElement translate to _win_, _doc_, _docElm_. + * + * @function + * @name Judy.selector + * @param {string|element} selector + * @param {boolean} [findName] + * - look for name attribute, and return array + * @return {string|Array|null} + * - array: if findName; [ selector ] or [ selector, name ] + * - null on error + */ + this.selector = function(selector, findName) { + var s = selector, f = findName, t = typeof s, x, v, tg; + try { + if (!s) { + throw new Error('Falsy selector, type[' + t + ']'); + } + if (t === 'string') { + // Test name attribute. + return !f ? s : (s.indexOf('[name=') === -1 ? [s] : [s, s.replace(/^.*\[name=['\"]([^'\"]+)['\"]\].*$/, '$1') ]); + } + else if (t === 'object') { + if ($.isWindow(s)) { + x = '_win_'; + } + else if (s === document) { + x = '_doc_'; + } + else if (s === document.documentElement) { + x = '_docElm_'; + } + if (x) { + return !f ? x : [x]; + } + if (typeof s.getAttributeNode !== 'function' || typeof s.getAttribute !== 'function') { + throw new Error('Selector, type[' + t + '], isnt non-empty string|element'); + } + tg = s.tagName.toLowerCase(); + if ((v = s.getAttribute('name'))) { + x = tg + '[name="' + v + '"]'; + return !f ? x : [ x, v ]; + } + if ((v = s.id)) { + x = '#' + v; + } + else if ((v = s.className)) { + x = tg + '.' + v.replace(/ +/g, '.'); + } + else if ((v = s.getAttribute('type'))) { + x = tg + '[type="' + v + '"]'; + } + else { + x = tg; + } + return !f ? x : [x]; + } + else { + throw new Error('Selector, type[' + t + '], isnt non-empty string|element'); + } + } + catch (er) { + _errorHandler(er, null, _name + '.selector()') + } + return null; + }; + /** + * Like jQuery().delegate and .on() the listener will apply now and in the future, no matter if such element(s) exist when calling this method. + * + * @example +Judy.ajaxcomplete(slctr, '/some/url', oData, fHandler, oFilter); +Judy.ajaxcomplete(slctr, '/some/url', oData, fHandler); +Judy.ajaxcomplete(slctr, '/some/url', fHandler, oFilter); +Judy.ajaxcomplete(slctr, '/some/url', fHandler); + * @function + * @name Judy.ajaxcomplete + * @param {string|element|array|jquery} selector + * @param {string} url + * - '*' means all responses + * - use '/system/ajax' for Drupal Form API AJAX + * - protocol and domain gets stripped off, and full path isnt necessary (is being matched against start of any AJAX url) + * @param {object} [data] + * - or (function) handler + * @param {function} [handler] + * - or (object) filter + * @param {object|array} [filter] + * - object keying properties of ajax settings object ('!key's mean exclude), values may be simple variables and regexes + * - or an array of such + * @return {void} + */ + this.ajaxcomplete = function(selector, url, data, handler, filter) { + var s = selector, t = typeof s, nm, u = url, d = data, h = handler, f = filter, a, le, i, v; + try { + if (!s) { + throw new Error('Falsy selector, type[' + t + ']'); + } + if (t === 'object') { + if (s instanceof $) { + s = s.selector || s.get(); + } + if ($.isArray(s)) { + if (!(le = s.length)) { + throw new Error('Empty selector, type array or jquery'); + } + for (i = 0; i < le; i++) { + self.ajaxcomplete(s[i], u, d, h, f); + return; + } + } + } + if (!(a = self.selector(s, true))) { + throw new Error('Bad selector, see previous error'); + } + nm = a[1]; // name attribute (if any), for matching against Drupal Form API ajax.settings._triggering_element_name. + s = a[0]; + // Resolve other arguments. + if (!u || typeof u !== 'string') { + throw new Error('Url type[' + self.typeOf(v) + '] isnt non-empty string'); + } + if (u !== '*') { + if (u.indexOf('http') === 0) { + u = u.replace(/^https?:\/\/[^\/]+(\/.+)$/, '$1'); + } + else if (u.charAt(0) !== '/') { + u = '/' + u; + } + } + if (h) { + if (typeof h === 'object') { + f = h; + h = null; + } + } + if (d && typeof d === 'function') { + h = d; + d = null; + } + if (!h) { + throw new Error('Cant resolve a handler'); + } + // Initialise jQuery ajaxComplete listening. + if (!_acInit) { + $(document).ajaxComplete(function(event, xhr, settings) { + var url = self.objectGet(settings, 'url'), all = [], nm, val, le, i, n, j, k, $jq, nElms, fElms, elms, elm, lstnr, h, d, evt; + if (url) { + if (url.indexOf('http') === 0) { // Non-Form API urls apparently include protocol and domain. + url = url.replace(/^https?:\/\/[^\/]+(\/.+)$/, '$1'); + } + for (k in _acLstnrs) { + if (_acLstnrs.hasOwnProperty(k) && url.indexOf(k) === 0) { + all.push(_acLstnrs[k]); + } + } + if (_acLstnrs['*'] && _acLstnrs.hasOwnProperty('*')) { + all.push(_acLstnrs['*']); + } + if ((le = all.length)) { + // If Drupal Form API _triggering_element_name we will only go for that particular selector. + if ((nm = self.objectGet(settings, 'extraData', '_triggering_element_name'))) { // Drupal Form API property. + if (!($jq = $('[name="' + nm + '"]')).length) { + return; + } + if ((val = self.objectGet(settings, 'extraData', '_triggering_element_value')) !== undefined) { // Drupal Form API property. + if (!($jq = $jq.filter('[value="' + val + '"]')).length) { + return; + } + } + nElms = (fElms = $jq.get()).length; + } + for (i = 0; i < le; i++) { + n = all[i].length; + for (j = 0; j < n; j++) { + lstnr = $jq = elms = h = d = evt = null; // Clear references (loop). + lstnr = all[i][j]; + if (nm) { + if (lstnr[1] !== nm || (lstnr[4] && !_filter(settings, lstnr[4]))) { + continue; + } + elms = fElms; + } + else { + nElms = 1; + switch (lstnr[0]) { + case '_win_': + elms = [window]; + break; + case '_doc_': + elms = [document]; + break; + case '_docElm_': + elms = [document.documentElement]; + break; + default: + nElms = (elms = $(lstnr[0]).get()).length; + } + if (!nElms || (lstnr[4] && !_filter(settings, lstnr[4]))) { + continue; + } + } + h = lstnr[2]; + d = lstnr[3]; + evt = !d ? { + type: 'ajaxcomplete' + } : { + type: 'ajaxcomplete', + data: d + }; + evt.ajax = settings; + for (k = 0; k < nElms; k++) { + elm = null; // Clear references (loop); + elm = elms[k]; + h.apply( + elm, + [evt] + ); + } + } + } + } + } + }); + _acInit = true; + } + // Resolve filter. + if (f) { + if (!$.isArray(f)) { + f = [f]; + } + if (u === '*') { // Add safe filters if responding to wildcard url, to prevent risk of perpetual logging etc. + f = f.concat(_acFltrs); + } + } + else if (u === '*') { // Add safe filters if responding to wildcard url, to prevent risk of perpetual logging etc. + f = _acFltrs; + } + // Add listeners, keyed by url. + if (!_acLstnrs[u]) { + _acLstnrs[u] = [ + [s, nm, h, d, f] + ]; + } + else { + _acLstnrs[u].push( + [s, nm, h, d, f] + ); + } + } + catch (er) { + _errorHandler(er, null, _name + '.ajaxcomplete()') + } + }; + /** + * NB: .ajaxcomplete.off (not .ajaxcomplete_off); jsDoc failure. + * + * @example +Judy.ajaxcomplete.off(slctr, sUrl, fHandler); +Judy.ajaxcomplete.off(slctr, sUrl); +Judy.ajaxcomplete.off(slctr, fHandler); +Judy.ajaxcomplete.off(slctr); + * @function + * @name Judy.ajaxcomplete_off + * @param {string|element|array|jquery} selector + * @param {string|falsy} [url] + * @param {function|falsy} [handler] + * @return {void} + */ + this.ajaxcomplete.off = function(selector, url, handler) { + var s = selector, t = typeof s, u = url, h = handler, nm, lstnrs, a, le, i, rm = [], sbtrt; + try { + if (!_acInit) { + return; + } + if (!s) { + throw new Error('Falsy selector, type[' + t + ']'); + } + if (t === 'object') { + if (s instanceof $) { + s = s.selector || s.get(); + } + if ($.isArray(s)) { + if (!(le = s.length)) { + throw new Error('Empty selector, type array or jquery'); + } + for (i = 0; i < le; i++) { + self.ajaxcomplete.off(s[i], u, h); + return; + } + } + } + if (!(a = self.selector(s, true))) { + throw new Error('Bad selector, see previous error'); + } + nm = a[1]; // name attribute (if any), for matching against Drupal Form API ajax.settings._triggering_element_name. + s = a[0]; + // Resolve other arguments. + if (u) { + if ((t = typeof u) === 'function') { + h = u; + u = null; + } + else { + if (t !== 'string') { + throw new Error('Url type[' + self.typeOf(v) + '] isnt non-empty string'); + } + if (u.indexOf('http') === 0) { + u = u.replace(/^https?:\/\/[^\/]+(\/.+)$/, '$1'); + } + else if (u.charAt(0) !== '/') { + u = '/' + u; + } + } + } + // Remove. + if (u) { + _acOff(u, s, nm, h); + } + else { + for (u in _acLstnrs) { + _acOff(u, s, nm, h); + } + } + } + catch (er) { + _errorHandler(er, null, _name + '.ajaxcomplete.off()') + } + }; + + /** + * Add keystrokes qualified keydown event handler to one or more elements. + * + * The preventDefault arg is ignored for unqualifed event types. + * Any order of parameters data, handler and preventDefault will do (finds args via type check; object vs. function vs. boolean). + * Uses jQuery().on() if exists, otherwise .bind(). + * + * @function + * @name Judy.keydown + * @example +// Qualified event type, e.g. specific keystroke combination: +Judy.keydown(selector, "ctr_shift_7"|"keydown_ctr_shift_7"|"ctr_shift_7 ctr_s", handler); +Judy.keydown(selector, "ctr_shift_7"|"keydown_ctr_shift_7", data, handler); +Judy.keydown(selector, "ctr_shift_7"|"keydown_ctr_shift_7", data, handler, preventDefault); +Judy.keydown(selector, "ctr_shift_7"|"keydown_ctr_shift_7", handler, preventDefault); +// Unqualified event type (no specific keystrokes) is handled by jQuery(selector).keydown(...) directly: +Judy.keydown(selector, handler); +Judy.keydown(selector, data, handler); +Judy.keydown(selector, ""|"*"|"keydown", handler); +Judy.keydown(selector, ""|"*"|"keydown", data, handler); + * @param {string|element|array|jquery} selector + * - works on multiple elements + * @param {string} [events] + * - see example + * - default: * (~ any keystroke) + * @param {object} [data] + * @param {func} handler + * @param {boolean} [preventDefault] + * @return {boolean} + */ + this.keydown = function() { + try { + _bindKeys("keydown", arguments); + return true; + } + catch(er) { + _errorHandler(er, null, _name + ".keydown()"); + } + return false; + }; + + /** + * Add keystrokes qualified keyup event handler to one or more elements. + * + * @see Judy.keydown() + * @function + * @name Judy.keyup + * @param {string|element|array|jquery} selector + * - works on multiple elements + * @param {string} [events] + * - see .keydown() example + * - default: * (~ any keystroke) + * @param {object} [data] + * @param {func} handler + * @param {boolean} [preventDefault] + * @return {boolean} + */ + this.keyup = function() { + try { + _bindKeys("keyup", arguments); + return true; + } + catch(er) { + _errorHandler(er, null, _name + ".keyup()"); + } + return false; + }; + /** + * List event handlers added via jQuery. + * + * @function + * @name Judy.eventList + * @throws {Error} + * - (caught) if bad arg, or jQuery .data("Judy") isnt object or undefined + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * @param {string} [type] + * @return {object|array|null|undefined} + * - object: all event types + * - arr: single event type + * - null: no events/no events of that type + * - undefined: selector matches no element + */ + this.eventList = function(selector, type) { + var r = _elm(0, selector, null, "eventList"), jq, o, k; + if(!r) { + return undefined; + } + jq = $(r); + if((o = jq.data())) { + // Sometimes jQuery's data, like events, arent residing in the object root, but in a sub-object keyed jquery[lots hex chars]??? + if(!o.hasOwnProperty("events")) { + for(k in o) { + if(k.length > 7 && o.hasOwnProperty(k) && k.indexOf("jQuery") === 0) { + if(!(o = o[k]) || !o.events || !o.hasOwnProperty("events")) { + return null; + } + } + } + } + } + if(!o) { + return null; + } + if(!type) { + return o.events; + } + o = o.events; + for(k in o) { + if(k === type && o.hasOwnProperty(k)) { + return o[k]; + } + } + return null; + }; + + // Fields. + /** + * Check if element is a form field. + * + * Usable when setting key event on document.documentElement or another container, and action on a form field isnt desired. + * + * object and button elements arent supported, but input button/submit/reset is. + * + * @function + * @name Judy.isField + * @param {element} elm + * - element, not css-selector + * @param {boolean} [button] + * - allow button (input type:button|submit|reset) + * @return {boolean|undefined} + * - undefined: arg element isnt an element + */ + this.isField = function(elm, button) { + return typeof elm === "object" && elm.tagName ? (_fieldType(elm, button) ? true : false) : undefined; + }; + /** + * Get type of a field or input button element. + * + * object and button elements arent supported, but input button/submit/reset is. + * + * @function + * @name Judy.fieldType + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * @param {string|element|jquery} [context] + * - default: document is context + * @param {boolean} [button] + * - allow button (input type:button|submit|reset) + * @return {string|undefined} + * - undefined: no such element + */ + this.fieldType = function(selector, context, button) { + var r = _elm(0, selector, context, "fieldType"); + return r ? _fieldType(r, button) : undefined; + }; + + /** + * Get/set value of any kind of field or button, even radios and Drupal checkbox list. + * + * Do not use "" as empty option for select or check list ('checkboxes'); use "_none" instead. + * + * If arg type, then the method trusts that; doesnt check if it's correct. + * + * object and button elements arent supported, but input button/submit/reset is. + * + * @function + * @name Judy.fieldValue + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * @param {element|string|falsy} [context] + * - default: document is context + * @param {string|number|array|undefined} [val] + * - default: undefined (~ get value, dont set) + * @param {string|undefined} [type] + * - optional field type hint (text|textarea|checkbox|checkboxes|radios|select|other input type) + * @return {string|array|boolean|undefined} + * - empty string (getting only) if empty value or none checked|selected + * - array (getting only) if check list or multiple select, and some option(s) checked/selected + * - true if setting succeeded + * - false if setting failed + * - undefined if no such field exist, or this method doesnt support the field type + */ + this.fieldValue = function(selector, context, val, type) { + var r = _elm(0, selector, context, "fieldValue"), t; + if(r && (t = type || _fieldType(r, true))) { + switch(t) { + case "select": + return _valSelect(r, val); + case "checkbox": + return _valCheckbox(r, val); + case "checkboxes": + case "checklist": + return _valChecklist(r, val); + case "radio": + case "radios": + return _valRadio(r, context, val); + case "image": + t = "src"; + default: + t = ""; + } + if(val === undefined) { + return !t ? r.value : r.getAttribute(t); + } + if(!t) { + r.value = "" + val; + } + else { + r.setAttribute(t, "" + val); + } + return true; + } + return undefined; + }; + /** + * Handles all field types (also checkbox, checkboxes/check list, and radios), and adds css class 'form-button-disabled' to button. + * + * @function + * @name Judy.disable + * @param {string|element|array|jquery} selector + * - works on multiple elements + * @param {element|string|falsy} [context] + * - default: document is context + * @param {string} [hoverTitle] + * - update the element's (hover) title attribute + * @return {void} + */ + this.disable = function(selector, context, hoverTitle) { + _disable(0, selector, context, hoverTitle); + }; + /** + * Handles all field types (also checkbox, checkboxes/check list, and radios), and removes css class 'form-button-disabled' to button. + * + * @function + * @name Judy.enable + * @param {string|element|array|jquery} selector + * - works on multiple elements + * @param {element|string|falsy} [context] + * - default: document is context + * @param {string} [hoverTitle] + * - update the element's (hover) title attribute + * @return {void} + */ + this.enable = function(selector, context, hoverTitle) { + _disable(1, selector, context, hoverTitle); + }; + + /** + * Confine vertical scrolling of a container to that container; prevent from escalating to enclosing elements. + * + * Wraps child elements in div, unless there's only a single child element. + * Adds css class 'scroll-trapped' to the container. + * + * Does nothing if the container is empty, or if the container already has the 'scroll-trapped' css class. + * + * @function + * @name Judy.scrollTrap + * @param {string|element|array|jquery} selector + * - works on multiple elements + * @param {element|string|falsy} [context] + * - default: document is context + * @param {string} [eventName] + * - default: 'Judy.scrollTrap' + * @return {void} + */ + this.scrollTrap = function(selector, context, eventName) { + var a = _elm(true, selector, context, "scrollTrap"), nm = eventName || (_name + ".scrollTrap"); + if(a) { + $(a).each(function () { + var preventZone = 100, halfZone, s = this.scrollTop, $self = $(this), $chlds, le, $chld, h; + if (!$self.hasClass("scroll-trapped")) { + // If contains a single element, set scroll-back zone on that element. + if ((le = ($chlds = $self.children()).get().length) === 1) { + $chld = $($chlds.get(0)); + } + else if (le) { // Contains more elements, wrap and set scroll-back zone on the wrapper. + $chld = $chlds.wrapAll("
").parent(); + } + else { // No children at all, cannot do anything, has to called again (upon insertion of something into the .scrollable). + return; + } + // Dont do this again. + $self.addClass("scroll-trapped"); + // Add scroll-back zone to top and bottom. + if ((h = this.clientHeight) < 1.5 * preventZone) { // The scroll-back zone shan"t be more than 2/3 of .scrollable"s height. + preventZone = Math.floor(h / 1.5); + } + halfZone = Math.floor(preventZone / 2); + $chld.css({ + "margin-top": preventZone + "px", + "margin-bottom": preventZone + "px" + }); + // Reset current scroll. + this.scrollTop = s + preventZone; + // Add scroll-back handler. + $self.bind("scroll." + nm, function() { + var that = this, s = that.scrollTop, h; + // if (s < preventZone) { + // this.scrollTop = preventZone; + // } + // else if (s > (h = that.scrollHeight - that.clientHeight - preventZone)) { + // this.scrollTop = h; + // } + if (s < halfZone) { // Top. + that.scrollTop = halfZone; // Scroll half way now. + setTimeout(function() { // Scroll all the way later. + that.scrollTop = preventZone; + }, 100); + } + else if (s > (h = that.scrollHeight - that.clientHeight) - halfZone) { // Bottom. + that.scrollTop = h - halfZone; + setTimeout(function() { + that.scrollTop = h - preventZone; + }, 100); + } + }); + } + }); + } + }; + /** + * Make a scrollable element scroll vertically to a numeric offset or the offset of one of it's child elements. + * + * @function + * @name Judy.scrollTo + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * @param {element|string|falsy} [context] + * - default: document is context + * @param {number|string|element|array|jquery} offset + * - default: zero (~ scroll to top) + * - number: scroll to that offset + * - string|element|array|jquery: scroll to first matching child element + * @param {number|undefined} [pad] + * - default: zero (~ scroll to exact offset) + * @return {void} + */ + this.scrollTo = function(selector, context, offset, pad) { + var u, par, r, to = offset, p = pad || 0, num, $par, chld, prvntZn = 0, max = -1; + if((par = _elm(0, selector, context, "scrollTo"))) { + // Number or no such child element. + if (!to || typeof to === "number" || !(r = _elm(0, to, par, "", true))) { + num = true; + to = !to || !isFinite(to) || to < 0 ? 0 : to; + } + // Find scroll-back zone, if confined scroll. + if(($par = $(par)).hasClass("scroll-trapped") && (chld = $par.children().get(0))) { + prvntZn = parseInt($(chld).css("margin-top").replace(/px/, ""), 10); + max = par.scrollHeight - par.clientHeight - Math.floor(prvntZn * 0.75); // Stop at a quarter instead half of scroll-back zone. + } + // Numeric; simple. + if(num) { + to += prvntZn; + } + // Offset of child element. + else { + par.scrollTop = prvntZn; // Scroll to enable measuring position of parent and child relative to document. + to = (r.offsetTop - par.offsetTop); + } + // Add padding, but prevent negative padding from being larger than a quarter of the scroll-back zone. + if(p && prvntZn && p < 0 && (p * -1) > (u = Math.floor(prvntZn / 4))) { + p = -u; + } + to += p; + // Make sure we dont scroll to far for scroll-trapped parent; scrolling to half-zone (or more) would provoke scroll-back. + if(max > 0 && to > max) { + to = max; + } + par.scrollTop = to; + } + }; + + /** + * Try setting focus on an element, slightly delayed. + * + * Attempting to set focus on element may prove fatal, and it is often desirable to postpone focusing until some current procedure has run to its end. + * This method handles both issues. + * + * @function + * @name Judy.focus + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * @param {element|string|falsy} [context] + * - default: document is context + * @param {integer|undefined} [delay] + * - default: 20 milliseconds + * @return {boolean|undefined} + * - undefined if no such field exists + */ + this.focus = function(selector, context, delay) { + var d = delay || 0, to; + if(selector) { + to = setTimeout(function(){ // jslint doesnt like instantiation without a reference to hold the instance. + var r; + if((r = _elm(0, selector, context, "", true))) { // No error. + try { + r.focus(); + } + catch(er) {} + } + }, d >= 0 ? d : 20); + } + }; + + // Style. + /** + * Measures inner width of an element, padding subtracted (unlike jQuery's innerWidth()). + * + * Also usable as alternative to jQuery(window).width(), which may give wrong result for mobile browsers. + * + * @function + * @name Judy.innerWidth + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * - if window, document.documentElement or document.body: the method disregards other args + * @param {boolean} [ignorePadding] + * - default: false (~ subtract padding, unlike jQuery) + * @return {integer|undefined} + */ + this.innerWidth = function(selector, ignorePadding) { + return _dimInner("Width", selector, ignorePadding); + }; + /** + * Measures inner height of an element, padding subtracted (unlike jQuery's innerHeight()). + * + * Also usable as alternative to jQuery(window).height(), which may give wrong result for mobile browsers. + * + * @function + * @name Judy.innerHeight + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * - if window, document.documentElement or document.body: the method disregards other args + * @param {boolean} [ignorePadding] + * - default: false (~ exclude padding, unlike jQuery) + * - ignored if element is window + * @return {integer|undefined} + */ + this.innerHeight = function(selector, ignorePadding) { + return _dimInner("Height", selector, ignorePadding); + }; + /** + * Measures or sets effective outer width of an element, including padding, border and optionally margin. + * + * The width will be set on the element itself, in pixels. + * + * If selector is window, then window scrollbar is included. + * + * @function + * @name Judy.outerWidth + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * - if window, document.documentElement or document.body: the method disregards other args and simply measures + * @param {boolean} [includeMargin] + * - default: false (~ dont check margin) + * @param {integer|falsy} [set] + * - set outer width (including padding, and optionally also margin) to that number of pixels + * @param {boolean|integer|falsy} [max] + * - default: false (~ set width) + * - true|one: set max-width, not width + * - two: set both + * @return {integer|undefined} + */ + this.outerWidth = function(selector, includeMargin, set, max) { + return _dimOuter("Width", selector, includeMargin, set, max); + }; + /** + * Measures or sets effective outer height of an element, including padding, border and optionally margin. + * + * The height will be set on the element itself, in pixels. + * + * If selector is window, then window scrollbar is included. + * + * @function + * @name Judy.outerHeight + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * - if window, document.documentElement or document.body: the method disregards other args and simply measures + * @param {boolean} [includeMargin] + * - default: false (~ dont check margin) + * @param {integer|falsy} [set] + * - set outer width (including padding, and optionally also margin) to that number of pixels + * @param {boolean|integer|falsy} [max] + * - default: false (~ set height) + * - true|one: set max-height, not height + * - two: set both + * @return {integer|undefined} + */ + this.outerHeight = function(selector, includeMargin, set, max) { + return _dimOuter("Height", selector, includeMargin, set, max); + }; + + // String. + /** + * Strip tags, reduce consecutive spaces, and trim spaces. + * + * @function + * @name Judy.stripTags + * @param {mixed} u + * - will be stringed + * @return {string} + */ + this.stripTags = function(u) { + return $.trim(("" + u).replace(/<[^<>]+>/g, " ").replace(/[ ]+/g, " ")); + }; + /** + * Prepends zero(s) to arg length. + * + * @example // converting a newline to \uNNNN format +var s = "\\"+"u" + Judy.toLeading("\n".charCodeAt(0).toString(16), 4); // -> "\u000a" + * @function + * @name Judy.toLeading + * @param {mixed} u - will be stringed + * @param {integer} [length] default: one + * @return {string} + */ + this.toLeading = function(u, length) { + var le = length || 1; + return (new Array(le).join("0") + u).substr(-le, le); + }; + /** + * @function + * @name Judy.toUpperCaseFirst + * @param {mixed} u + * - anything stringable + * @return {string} + */ + this.toUpperCaseFirst = function(u) { + var s = ""+u, le = s.length; + return !le ? "" : (s.charAt(0).toUpperCase() + (le < 2 ? "" : s.substr(1))); + }; + + // Date. + /** + * @function + * @name Judy.isLeapYear + * @param {Date|integer|str} u + * @return {boolean|null} + * - null if bad arg + */ + this.isLeapYear = function(u) { + var y; + switch(self.typeOf(u)) { + case "date": + y = u.getFullYear(); + break; + case "number": + y = u; + break; + case "string": + y = parseInt(u, 10); + break; + default: + return null; + } + if(isFinite(y) && u > -1 && u % 1 === 0) { + return (!(y % 4) && (y % 100)) || !(y % 400); + } + return null; + }; + /** + * Get Date as iso-8601 string, including milliseconds. + * + * @function + * @name Judy.dateISO + * @param {Date|falsy} [date] + * - default: now + * @param {boolean} [UTC] + * - default: false (~ local time, 1970-01-01T01:00:00.001+01:00) + * - truthy: 1970-01-01T00:00:00.001Z + * @return {string} + */ + this.dateISO = function(date, UTC) { + var d = date || new Date(); + return UTC && Date.prototype.toISOString ? d.toISOString() : _dateFrmt(d, 1, 1, 1, UTC, 1); + }; + /** + * Get Date as iso-8601 string without milliseconds, T and timezone. + * + * @function + * @name Judy.dateTime + * @param {Date|falsy} [date] + * - default: now + * @param {boolean} [UTC] + * - default: false (~ local time, 1970-01-01 01:00:00) + * - truthy: 1970-01-01 00:00:00 + * @return {string} + */ + this.dateTime = function(date, UTC) { + var d = date || new Date(); + return UTC && Date.prototype.toISOString ? d.toISOString().replace(/T/, " ").replace(/\.\d{3}Z$/, "") : _dateFrmt(d, 1, 1, 0, UTC); + }; + /** + * Translate a Date into a string - like the value of a text field. + * + * Supported formats, dot means any (non-YMD) character: + * - YYYY.MM.DD [HH][:II][:SS][ mmm] + * - MM.DD.YYYY [HH][:II][:SS][ mmm] + * - DD.MM.YYYY [HH][:II][:SS][ mmm] + * + * @function + * @name Judy.dateToFormat + * @param {Date} date + * - no default, because empty/wrong arg must be detectable + * @param {string} [sFormat] + * - default: YYYY-MM-DD, omitting hours etc. + * @return {string} + * - empty if arg dt isnt Date object, or unsupported format + */ + this.dateToFormat = function(date, sFormat) { + var u = date, fmt = sFormat || "YYYY-MM-DD", le, y, m, d, s, a, b; + if(u && typeof u === "object" && u.getFullYear) { + y = u.getFullYear(); + m = self.toLeading(u.getMonth() + 1, 2); + d = self.toLeading(u.getDate(), 2); + if((a = (s = fmt.substr(0, 10)).replace(/[MDY]/g, "")).length < 2) { + return ""; + } + b = a.charAt(1); + a = a.charAt(0); + switch(s.replace(/[^MDY]/g, "")) { + case "YYYYMMDD": + s = y + a + m + b + d; + break; + case "MMDDYYYY": + s = m + a + d + b + y; + break; + case "DDMMYYYY": + s = d + a + m + b + y; + break; + default: + return ""; + } + if((le = fmt.length) > 11) { + s += " " + self.toLeading(u.getHours(), 2); + if(le > 14) { + s += ":" + self.toLeading(u.getMinutes(), 2); + if(le > 17) { + s += ":" + self.toLeading(u.getSeconds(), 2); + if(le > 20) { + s += " " + self.toLeading(u.getMilliseconds(), 3); + } + } + } + } + return s; + } + else { + try { + throw new Error("date[" + u + "] type[" + self.typeOf(u) + "] is not a non-empty Date"); + } + catch(er) { + _errorHandler(er, null, _name + ".dateToFormat()"); + } + return ""; + } + }; + /** + * Translate string - like the value of a text field - to Date. + * + * Supported formats, dot means any (non-YMD) character: + * - YYYY.MM.DD + * - MM.DD.YYYY + * - DD.MM.YYYY + * + * No support for hours etc. + * @function + * @name Judy.dateFromFormat + * @param {string} s + * @param {string} [sFormat] + * - default: YYYY-MM-DD + * - delimiters are ignored, only looks for the position of YYYY, MM and DD in the format string + * @return {Date|null} + * - null if arg str isnt non-empty string, or impossible month or day, or unsupported format + */ + this.dateFromFormat = function(sDate, sFormat) { + var s = sDate, dt = new Date(), fmt = sFormat || "YYYY-MM-DD", y, m, d; + if(s && typeof s === "string") { + if(/^YYYY.MM.DD$/.test(fmt)) { // iso + y = s.substr(0, 4); + m = s.substr(5, 2); + d = s.substr(8, 2); + } + else if(/^MM.DD.YYYY$/.test(fmt)) { // English + y = s.substr(6, 4); + m = s.substr(0, 2); + d = s.substr(3, 2); + } + else if(/^DD.MM.YYYY$/.test(fmt)) { // continental + y = s.substr(6, 4); + m = s.substr(3, 2); + d = s.substr(0, 2); + } + else { + return null; + } + y = parseInt(y, 10); + d = parseInt(d, 10); + switch((m = parseInt(m, 10))) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + if(d > 31) { + return null; + } + break; + case 4: + case 6: + case 9: + case 11: + if(d > 30) { + return null; + } + break; + case 2: + if(d > 29 || (d === 29 && !self.isLeapYear(y))) { + return null; + } + break; + default: + return null; + } + dt.setFullYear(y, m - 1, d ); + dt.setHours(0, 0, 0); + dt.setMilliseconds(0); + return dt; + } + else { + try { + throw new Error("date[" + s + "] type[" + self.typeOf(s) + "] is not non-empty string"); + } + catch(er) { + _errorHandler(er, null, _name + ".dateFromFormat()"); + } + return null; + } + }; + /** + * Modifies a date with evaluated value of a time string, or creates time string based upon the date. + * + * If hours evaluate to 24: + * - if minutes and seconds are zero, then converts to 23:59:59; because 00:00:00 is today, whereas 24:00:00 is tomorrow + * - otherwise sets hours as zero + * + * @example +// Get time of a date: +Judy.timeFormat(date); +// Modify time of a date: +Judy.timeFormat(date, "17:30"); + * @function + * @name Judy.timeFormat + * @param {Date} date + * - by reference + * - now default, logs error if falsy + * @param {string|falsy} [sTime] + * - empty: creates time string according to arg date + * - non-empty: sets time of arg date + * - any kinds of delimiters are supported; only looks for integers + * - N, NN, NNNN and NNNNNN are also supported + * @return {string} + * - time NN:NN:NN + */ + this.timeFormat = function(date, sTime) { + var d = date, t = sTime ? $.trim(sTime) : 0, h = 0, i = 0, s = 0, le, v; + if(d && typeof d === "object" && d.getFullYear) { + // Modify date. + if(t) { + if(/^\d+$/.test(t)) { + h = t.substr(0, 2); + if((le = t.length) > 3) { + i = t.substr(2, 2); + if(le > 5) { + s = t.substr(4, 2); + } + } + } + else if( (le = (t = t.split(/[^\d]/)).length) ) { + h = t[0]; + if(le > 1) { + i = t[1]; + if(le > 2) { + s = t[2]; + } + } + } + if(h) { + h = isFinite(v = parseInt(h, 10)) && v < 25 ? v : 0; + if(i) { + i = isFinite(v = parseInt(i, 10)) && v < 60 ? v : 0; + } + if(s) { + s = isFinite(v = parseInt(s, 10)) && v < 60 ? v : 0; + } + if(h === 24) { + if(!i && !s) { + h = 23; + i = s = 59; + } + else { + h = 0; + } + } + } + d.setHours(h, i, s); + } + // Create time string from date. + else { + h = d.getHours(); + i = d.getMinutes(); + s = d.getSeconds(); + } + return "" + (h < 10 ? "0" : "") + h + ":" + (i < 10 ? "0" : "") + i + ":" + (s < 10 ? "0" : "") + s; + } + else { + try { + throw new Error("date[" + d + "] type[" + self.typeOf(d) + "] is not a non-empty Date"); + } + catch(er) { + _errorHandler(er, null, _name + ".timeFormat()"); + } + return "00:00:00"; + } + }; + /** + * Converts a number to formatted string. + * + * oFormat: + * - (str) type, default integer; values integer|float|decimal + * - (str) thousand_separator, default space + * - (str) decimal_separator, default dot + * - (int) scale, default 2 + * + * @function + * @name Judy.numberToFormat + * @param {number} num + * @param {object} [oFormat] + * @return {number} + */ + this.numberToFormat = function(num, oFormat) { + var n = num || 0, s, sgn = "", o, isInt, kSep, scale, u, le, d, i; + if(!n) { + return "0"; + } + if(n < 0) { + n *= -1; + sgn = "-"; + } + isInt = !(u = (o = oFormat || {}).type) || u === "integer"; + kSep = (u = o.thousand_separator) || u === "" ? u : " "; + // Extract decimals. + if((d = n % 1)) { + n = Math.round(n); + } + s = "" + n; + // Thousand separation. + if(kSep && (le = s.length) > 3) { + n = s; + s = n.substr(0, i = le % 3); + while(i < le) { + s += (i ? kSep : "") + n.substr(i, 3); + i += 3; + } + } + scale = o.scale || 2; + return sgn + s + + (isInt ? "" : ( + ((u = o.decimal_separator) || u === "" ? u : ".") + + ( (d ? ("" + Math.round(d * Math.pow(10, scale))) : "") + // Round decimals. + new Array( scale + 1 ).join("0") ).substr(0, scale) + ) ); + }; + /** + * Converts a numberish string containing thousand separators and/or decimal marker to number. + * + * Validates that the string matches the format; detects if there's a non-number somewhere after a decimal marker. + * + * Also handles currency slash dash (and equivalent) endings; like 15/- or 15,- + * + * oFormat: + * - (str) type, default integer; values integer|float|decimal + * - (str) thousand_separator, default space + * - (str) decimal_separator, default dot + * + * @function + * @name Judy.numberFromFormat + * @param {string} str + * @param {object} [oFormat] + * @return {number|boolean} + * - false: arg str doesnt match the format + */ + this.numberFromFormat = function(str, oFormat) { + var s = $.trim(str), sgn = 1, o, isInt, dSep, u, p, d, n; + if(!s || s === "0" || s === "-0") { + return 0; + } + if(s.charAt(0) === "-") { + sgn = -1; + s = s.substr(1); + } + // Remove trailing decimal marker or currency slash. Remove leading separator and leading zeros. + if((s = s.replace(/^(.*\d)\D+$/, "$1"). + replace(/^[^1-9]+([1-9].*)$/, "$1")) + ) { + // Prepare format. + isInt = !(u = (o = oFormat || {}).type) || u === "integer"; + dSep = o.decimal_separator || "."; + // Validate - check if there's a non-number somewhere after decimal marker. + if(new RegExp("\\" + dSep + "\\d*\\D").test(s)) { + return false; + } + // Extract decimals. + if((p = s.indexOf(dSep)) > -1) { + d = s.substr(p).replace(/\D/g, ""); + s = s.substr(0, p); + } + // Remove thousand separators. + n = parseInt( + s.replace(/\D/g, ""), + 10 + ); + if(d) { + n += parseInt(d, 10) / Math.pow(10, d.length); + } + return sgn * (!isInt ? n : Math.round(n)); + } + return 0; + }; + + // Miscellaneous. + /** + * Random number. + * + * @function + * @name Judy.rand + * @param {integer} [min] + * - default: zero + * @param {integer} [max] + * - default: 9e15 (~ almost 9007199254740992 aka 2^53, the largest representable integer in Javascript) + * @return {integer} + */ + this.rand = function(min, max) { + var m = min || 0; + return m + Math.floor( ( Math.random() * ( ((max || 9e15) - m) + 1 ) ) + 1 ) - 1; + }; + /** + * Random name. + * + * Default length 20 chars, starts with a letter, the rest is a base 36 string. + * + * Slight performance hit when passing lengths 12, 23, 34 etc. ~ (n*11)+1 + * - because iterates for approximately every 11 char ~ (n*11)+1 + * - the most economical lengths are probably one less (11, 21, 31) + * + * Approximate bit-size when using length: + * - 12 ~ 54-bit (53-bit plus sqrt(26)~4.5 minus 3.5 for always making large numbers (filling up all digits)) + * - 20 ~ 90-bit (estimated) + * - 23 ~ 107-bit + * - 34 ~ 160-bit + * - a-z0-9, first character is always a letter + * @function + * @name Judy.randName + * @param {integer} [length] + * - default: 20 + * @return {string} + */ + this.randName = function(length) { + var al = length || 20, l, s = String.fromCharCode(Math.floor(Math.random()*26)+97); // first char letter + while((l = s.length) < al) { + s += Math.floor(Math.random()*9e15).toString(36); // convert to base 36 for shorter string length + } + return l > al ? s.substr(0, al) : s; + }; + + /** + * NOT relevant in Drupal context, because GET parameters arent used that way in Drupal. + * + * Set url parameter. + * + * @ignore + * @function + * @name Judy.setUrlParam + * @param {string} url + * - full url, or just url query (~ window.location.search) + * @param {string|object} name + * @param {string|number|falsy} [value] + * - ignored if arg name is object + * - falsy and not zero: unsets the parameter + * @return {string} + * + this.setUrlParam = function(url, name, value) { + var u = url || "", a = u, h = "", o = name, oS = {}, p, le, i, k, v; + if(u && (p = u.indexOf("#")) > -1) { + h = u.substr(p); + u = u.substr(0, p); + } + if(u && (p = u.indexOf("?")) > -1) { + a = u.substr(p + 1); + u = u.substr(0, p); + } + else { + a = ""; + } + if(typeof o !== "object") { + o = {}; + o[name] = value; + } + if(a) { + le = (a = a.split(/&/g)).length; + for(i = 0; i < le; i++) { + if((p = a[i].indexOf("=")) > 0) { + oS[ a[i].substr(0, p) ] = a[i].substr(p + 1); + } + else if(p) { // Dont use it if starts with =. + oS[ a[i] ] = ""; + } + } + } + a = []; + for(k in oS) { + if(oS.hasOwnProperty(k)) { + if(o.hasOwnProperty(k)) { + if((v = o[k]) || v === 0) { // Falsy and not zero: unsets the parameter. + a.push(k + "=" + encodeURIComponent(v)); + } + delete o[k]; + } + else { + a.push(k + "=" + oS[k]); + } + } + } + for(k in o) { + if(o.hasOwnProperty(k) && (v = o[k]) || v === 0) { + a.push(k + "=" + v); + } + } + return u + (a.length ? ("?" + a.join("&")) : "") + h; + };*/ + + // UI. + /** + * Show/hide overlay. + * + * Adds an overlay element to DOM, if not yet done and arg show evaluates to show. + * + * @function + * @name Judy.overlay + * @param {boolean|integer|Event} [show] + * - default: falsy (~ hide) + * - Event|object: hide (because may be used as event handler) + * @param {boolean} [opaque] + * - default: false + * - truthy: add css class 'module-judy-overlay-opaque' + * @param {string|falsy} [hoverTitle] + * - default: falsy (~ no hover title) + * - truthy: set the overlay's title attribute, and add css class 'module-judy-overlay-hovertitled' + * @return {void} + */ + this.overlay = function(show, opaque, hoverTitle) { + var hide = !show || typeof show === "object", ttl = hoverTitle || "", + clsO = "module-judy-overlay-opaque", clsT = "module-judy-overlay-hovertitled"; + if(!_jqOvrly) { + if(hide) { // Dont want to build it until it's actually gonna be used. + return; + } + $(document.body).append( + "
" + ); + _jqOvrly = $("div#module_judy_overlay"); + _ovrlyRsz(); + $(window).resize(function() { + _ovrlyRsz(); + }); + } + else if(hide) { + _jqOvrly.hide(); + return; + } + else { + _jqOvrly[ opaque ? "addClass" : "removeClass" ](clsO)[ ttl ? "addClass" : "removeClass" ](clsT).get(0).setAttribute("title", ttl); + } + _jqOvrly.show(); + }; + /** + * jQuery ui dialog wrapper/factory, which makes it easier to create a dialog and maintain a reference to it. + * + * The reference is the dialog's name, which is returned on creation and usable as selector arg when calling the dialog later. + * + * Creates or re-uses existing content element, and creates or re-uses related jQuery ui dialog box. + * + * Non-standard options/methods: + * - (str) content: sets the HTML content of the selector (dialog content element) + * - (bool) fixed: css-positions the dialog to fixed relative to document body; ignored after dialog creation + * - (str) contentClass: sets that/these css class(es) on the content element + * - getContent(): get dialog content, excluding buttons + * + * Supported standard options: + * - appendTo + * - autoOpen: default true + * - buttons + * - closeOnEscape + * - closeText + * - dialogClass + * - draggable + * - height + * - hide + * - maxHeight + * - maxWidth + * - minHeight + * - minWidth + * - modal: only works on creation (make more dedicated modal/non-modal dialogs) + * - position + * - resizable + * - show + * - title + * - width + * + * Standard events: + * - beforeClose + * - create + * - open + * - focus + * - dragStart + * - drag + * - dragStop + * - resizeStart + * - resize + * - resizeStop + * - close + * + * Supported standard methods: + * - close + * - destroy + * - isOpen + * - moveToTop + * - open + * - option + * - widget + * + * Open/close (show/hide) will always be applied in a manner so as to prevent display of other changes. + * + * @example +// Add new element to the DOM and attach new dialog to it; and then modify the dialog: +var random_name = Judy.dialog("", { title: "Randomly named", content: "The content", fixed: true } ); +Judy.dialog(random_name, "content", "Changed content of existing dialog named " + random_name); +// Find existing element - or create new having that id and/or class - and attach new dialog: +var name_as_element_id = Judy.dialog("#some_element.some-class", { title: "Named by element id", content: "The content" }); +Judy.dialog(name_as_element_id, "content", "Changed content of new or existing dialog named " + name_as_element_id); +Judy.dialog("#" + name_as_element_id, "title", "Doesnt matter if using # when calling existing"); +// Get content of existing dialog: +console.log(Judy.dialog(name_as_element_id, "getContent")); + * @function + * @name Judy.dialog + * @param {string|element|array|jquery} selector + * - only works on a single (first) element + * - default, empty: new random html id + * - default, non-empty having no . or #: dialog content element's html id + * - other non-empty: like jQuery() selector arg: tagName and/or id and/or css class(es), but name no attribute, and class(es) cannot go before #id + * @param {string|object} [option] + * - string: single option or method + * - object: list of options/methods + * @param {mixed} [value] + * - value of option, if arg option is string; otherwise ignored + * @return {string|mixed|bool} + * - string: at dialog creation, element id of the dialog box (at dialog creation, and when called later with option object) + * - mixed: when called later using one of the methods; return value of that method call + * - false if no jQuery ui dialog support + */ + this.dialog = function(selector, option, value) { + var sl = selector, u = option, t, s, o, v = value, keys, a, tg = "", id = "", cls = "module-judy-dialog", cls1 = "", elm, jq, dialExists, fxd, + title, doOpen, autoOpenLater, to; + if($.ui && typeof $.ui.dialog === "function") { + if(u) { + if((t = typeof u) === "string") { + if(u !== "option") { + s = u; + } + else if(v && typeof v === "object") { // silly: option "option", value {option:value} + o = self.containerCopy(v); // because we later delete from it + } + } + else if(t === "object") { + o = self.containerCopy(u); // because we later delete from it + } + } + if(sl) { + if(typeof sl === "string") { + if(sl.indexOf("#") === -1 && sl.indexOf(".") === -1) { + if((elm = document.getElementById(id = sl)) && + self.arrayIndexOf(_dialogs, id) > -1) { + dialExists = true; + } + } + else if((elm = $(sl).get(0))) { // jQuery selector + if((id = elm.id)) { + if(self.arrayIndexOf(_dialogs, id) > -1) { + dialExists = true; + } + } + else { + id = elm.id = self.randName(); + } + } + else { // Create new element; having same element, name and class. + a = sl.replace(/^([a-z\d_\-]+)?(\#[a-z\d_\-]+)?(\.[a-z\d_\-]+)?$/, "$1,$2,$3").split(","); + tg = a[0]; + id = a[1] ? a[1].substr(1) : self.randName(); + if(a[2]) { + cls1 = " " + a[2].split(/\./).join(" ") + } + } + } + else if(typeof sl === "object" && sl.getAttributeNode) { + if((id = elm.id)) { + if(self.arrayIndexOf(_dialogs, id) > -1) { + dialExists = true; + } + } + else { + id = elm.id = self.randName(); + } + } + } + else { + id = self.randName(); + } + // existing dialog box -------------------- + if(dialExists) { + doOpen = false; // Default; dont change current open/close state. + jq = $(elm); + if(o) { + delete o.fixed; // Only usable at instantiation. + if((keys = self.objectKeys(o)).length === 1) { // Extract that single option; may be method, and then we want to return it. + v = o[ s = keys[0] ]; + } + } + if(s) { + if(s === "content") { + if(jq.dialog("isOpen")) { + doOpen = true; + } + jq.html(v); + if(doOpen) { + if(doOpen) { // give the browser a sec to re-render + to = setTimeout(function(){ + jq.dialog("open"); + }, 100); + } + } + return id; + } + if(s === "getContent") { + return jq.html(); + } + // There is no native option title (when updating), and we furthermore want to allow HTML (not textnode). + if (s === 'title') { + $('.ui-dialog-title', $(elm.parentNode)).html(v); + return id; + } + else if(self.arrayIndexOf(_dialOpts, s) > -1 || self.arrayIndexOf(_dialEvts, s) > -1) { + jq.dialog("option", s, v); + } + if(self.arrayIndexOf(_dialMthds, s) > -1) { + return jq.dialog(s); + } + jq.dialog(s, v); + return id; + } + else if(o) { + if(jq.dialog("isOpen")) { + doOpen = true; + jq.dialog("close"); // do always close before changing anything else + } + if(o.close && o.hasOwnProperty("close") && typeof o.close !== "function") { + doOpen = false; + delete o.close; + } + if(o.content !== undefined && o.hasOwnProperty("content")) { + jq.html(v); + delete o.content; + } + if(o.open && o.hasOwnProperty("open")) { + doOpen = true; + delete o.open; + } + jq.dialog(o); + if(doOpen) { // give the browser a sec to re-render + to = setTimeout(function(){ + jq.dialog("open"); + }, 100); + } + } + return id; + } + // new dialog box ------------------------- + doOpen = true; // Default for new; autoOpen default for jQuery UI Dialog is true. + if(!o) { + o = {}; + if(s) { + o[s] = v; + } + } + if(!elm) { + $(document.body).append("<" + (tg || "div") + " id=\"" + id + "\" class=\"" + cls + cls1 + + (!o.contentClass ? '' : (' ' + o.contentClass)) + "\">"); + elm = document.getElementById(id); + } + jq = $(elm); + if(o.open && o.hasOwnProperty("open")) { + delete o.open; // We want to do it ourselves, a bit later. + } + if(!o.autoOpen && o.hasOwnProperty("autoOpen")) { // autoOpen:true is the default of jQuery UI Dialog. + doOpen = false; + } + else { + autoOpenLater = true; // We want to do it ourselves, a bit later. + o.autoOpen = false; + } + if((u = self.objectGet(o, "content"))) { + jq.html(u); + delete o.content; + } + if(o.fixed && o.hasOwnProperty("fixed")) { + fxd = true; + delete o.fixed; + } + // Allow HTML title (not textnode). + if(o.title && o.hasOwnProperty("title")) { + title = o.title; + delete o.title; + } + // Instantiate jQuery UI dialog, and fix properties of that container which the jQuery UI dialog wraps around the content element. + jq.dialog(o); + u = $(elm.parentNode); + if(fxd) { + u.css("position", "fixed"); + } + if (title !== undefined) { + $('.ui-dialog-title', u).html(title); + } + u.addClass(cls + "-container"); + // Register. + _dialogs.push(id); + if(doOpen) { // give the browser a sec to re-render + to = setTimeout(function(){ + jq.dialog("open"); + if(autoOpenLater) { + jq.dialog("autoOpen", true); + } + }, 100); + } + return id; + } + try { + throw new Error("jQuery UI Dialog not included"); + } + catch(er) { + _errorHandler(er, null, _name + ".dialog()"); + } + return false; + }; + + // Timer. + /** + * setTimeout alternative - executes the function in try-catch, and supports checking if the function has been executed yet. + * + * Convenience method for new Judy.Timer(). + * @example +var doooh = function(ms) { jQuery(this).html("<h1>"+ms+"</h1>"); }; +Judy.timer(document.body, doooh, ["Doooh!"], 1000); + * @function + * @name Judy.timer + * @param {object|falsy} o + * - object to apply() arg func on, if desired + * @param {func} func + * @param {array|falsy} [args] + * - arguments to apply() on arg func, if arg o is object (truthy) + * @param {integer} [delay] + * - default: zero milliseconds + */ + this.timer = function(o, func, args, delay) { + return new self.Timer(o, func, args, delay); + }; + /** + * setTimeout alternative - executes the function in try-catch, and supports checking if the function has been executed yet. + * + * @example +var doooh = function(ms) { jQuery(this).html("<h1>"+ms+"</h1>"); }, +t = new Judy.Timer(document.body, doooh, ["Doooh!"], 1000); + * @constructor + * @namespace + * @name Judy.Timer + * @param {object|falsy} o + * - object to apply() arg func on, if desired + * @param {func} func + * @param {array|falsy} [args] + * - arguments to apply() on arg func, if arg o is object (truthy) + * @param {integer} [delay] + * - default: zero milliseconds + */ + this.Timer = function(o, func, args, delay) { + var a = args || [], fired = false, + f = o ? function() { + fired = true; + try { + func.apply(o, a); + } + catch(er) {} + } : function() { + fired = true; + try { + func(); + } + catch(er) {} + }, + t = window.setTimeout(f, delay || 0); + /** + * Check if the function has been executed yet. + * @function + * @memberOf Judy.Timer + * @name Judy.Timer#fired + * @return {boolean} + */ + this.fired = function() { + return fired; + } + /** + * Cancel execution of the function. + * @function + * @memberOf Judy.Timer + * @name Judy.Timer#cancel + * @return {void} + */ + this.cancel = function() { + window.clearTimeout(t); + }; + }; +}; + +(Drupal.Judy = window.Judy = window.judy = new Judy($)).setup(); + +})(jQuery); \ No newline at end of file diff --git a/sites/all/modules/contrib/judy/judy.min.css b/sites/all/modules/contrib/judy/judy.min.css new file mode 100644 index 00000000..595f880d --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.min.css @@ -0,0 +1 @@ +div#module_judy_overlay{position:absolute;left:0;top:0;width:0;height:0;overflow:hidden;z-index:99;padding:0;margin:0;border:0;background-color:transparent}div#module_judy_overlay.module-judy-overlay-hovertitled{cursor:wait}div#module_judy_overlay.module-judy-overlay-opaque{background-color:#BBB;opacity:.5;-ms-filter:'alpha(opacity=50)';filter:alpha(opacity=50)}div#module_judy_overlay{z-index:900}div#module_judy_overlay.module-judy-overlay-opaque{background-color:#BBB}div.module-judy-dialog-container.ui-front{z-index:1000}div.module-judy-dialog-container div.ui-dialog-titlebar{padding:.2em 1em}div.module-judy-dialog-container div.ui-dialog-titlebar span#ui-dialog-title-module_judy_info.ui-dialog-title{white-space:nowrap;font-family:Tahoma,sans-serif;font-size:1.0em}div.module-judy-dialog-container div.judy-dialog.ui-dialog-content{padding:2.0em 1.5em 1.0em;font-family:Verdana,sans-serif;font-size:.9em;line-height:1.5em}div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:link,div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:visited,div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:hover,div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:active{text-decoration:underline;color:#000}div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:hover,div.module-judy-dialog-container div.judy-dialog.ui-dialog-content a:active{color:#0071b3}div.module-judy-dialog-container div.ui-dialog-buttonpane{padding:.1em .5em .1em .1em;border-top:0}div.module-judy-dialog-container div.ui-dialog-buttonpane div.ui-dialog-buttonset button.ui-button span.ui-button-text{font-family:Tahoma,sans-serif;font-weight:bold;padding:.3em 1em .4em;font-size:1em} \ No newline at end of file diff --git a/sites/all/modules/contrib/judy/judy.min.js b/sites/all/modules/contrib/judy/judy.min.js new file mode 100644 index 00000000..996564e5 --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.min.js @@ -0,0 +1,877 @@ +(function($){var Judy=function($){var self=this,_name="Judy",_nonObj=["window","document","document.documentElement","element","image","textNode","attributeNode","otherNode","event","date","regexp","jquery"],_uaIe=0,_dateFrmt,_dateTz,_nonInputFlds=["textarea","select"],_dataName,_dialEvts=["beforeClose","create","open","focus","dragStart","drag","dragStop","resizeStart","resize","resizeStop","close"],_dialOpts=["appendTo","autoOpen","buttons","closeOnEscape","closeText","dialogClass","draggable","height","hide","maxHeight","maxWidth","minHeight","minWidth","modal","position","resizable","show","title","width"],_dialMthds=["close","destroy","isOpen","moveToTop","open","option","widget"],_dialogs=[],_acInit,_acLstnrs={},_acFltrs=[{"!url":/\/inspect\/ajax/},{"!url":/\/log_filter\/ajax/}],_checklist="checkboxes",_radio="radios",_jqOvrly,_ovrlyRsz,_errorHandler=function(error,variable,options){var u=options,o={},t; +if(typeof window.inspect==="function"&&inspect.tcepsnI){if(typeof inspect.errorHandler==="function"){if(u){if((t=typeof u)==="string"){o.message=u; +o.wrappers=1; +}else{if(t==="object"){o=u; +o.wrappers=!u.wrappers?1:(u.wrappers+1); +}}}o.category="Judy"; +inspect.errorHandler(error,variable,o); +}else{inspect.console("Please update Inspect."); +}}},_elm=function(list,u,cntxt,mthd,noError){var li=!list?0:undefined,t,s=u,jq,le,i,f; +if(u){if((t=typeof u)==="object"){if(u===window||u===document||u.getAttributeNode){return !list?u:[u]; +}if(typeof u.jquery==="string"){if(u.length){if(!cntxt){return u.get(li); +}if((jq=$(u,cntxt)).length){return jq.get(li); +}}s=u.selector; +}else{if(self.isArray(u)&&(le=u.length)){for(i=0; +i-1?t:""; +},_disable=function(nbl,slctr,cntxt,ttl){var a=_elm(true,slctr,cntxt,!nbl?"disable":"enable"),le,i,r; +if(a){le=a.length; +for(i=0; +i-1?"selected":false)){++set; +if(!multi){return 1; +}}}return set; +},_valChecklist=function(r,val){var par,rOpts,nOpts,rOpt,nVals,i,v=[],set=0; +if((par=self.ancestor(r,"div.form-checkboxes",3))){nOpts=(rOpts=$("input[type='checkbox']",par).get()).length; +if(val===undefined){for(i=0; +i-1?"checked":false)){++set; +}}return set; +}return undefined; +},_filter=function(o,fltr){var le=fltr.length,i,k,x,not,v; +for(i=0; +i=96&&cK<=105){k+=(cK-48); +}else{if((cK>=65&&cK<=90)||(cK>=48&&cK<=57)){k+=cK; +}else{throw new Error("unsupported char["+ky+"] in keystrokes["+keystrokes+"]"); +}}}}if(k&&k%1000>0){return"_"+k; +}throw new Error("keystrokes["+keystrokes+"] "+(!k?"evaluates to nothing":"all modifiers, no plain keys")); +},_keystrokes=function(e){var k=0,kC; +if(e.ctrlKey||e.metaKey){k+=100000; +}if(e.altKey){k+=10000; +}if(e.shiftKey){k+=1000; +}if((kC=e.keyCode)){switch(kC){case 61:k+=107; +break; +case 189:k+=109; +break; +default:if(kC>=96&&kC<=105){k+=(kC-48); +}else{k+=kC; +}}}return k; +},_bindKeys=function(et,as){var jq=$(as[0]),jqMthd=typeof jq.on==="function"?"on":"bind",nAs=as.length,qualifiers="",nQs,iQ,q,nm,kms={},km,rs=jq.get(),nRs=jq.length,r,hndlr,dat,pdef=false,i,jq1,d,e,j,le,kyHndlrs,f; +if(nAs<3){throw new Error("requires at least 3 args"); +}if(!nRs){throw new Error("No element like selector["+as[0]+"], type["+self.typeOf(as[0])+"]"); +}for(i=1; +i<5; +i++){switch(typeof as[i]){case"string":qualifiers=as[1]; +break; +case"function":hndlr=as[i]; +break; +case"object":dat=as[i]; +break; +case"boolean":pdef=as[i]; +break; +}}if(!hndlr){throw new Error("No handler function arg found"); +}nQs=(qualifiers=qualifiers.split(" ")).length; +for(iQ=0; +iQ-1){nm=q.replace(/^[^\.]+\.(.+)$/,"$1"); +q=q.replace(/^([^\.]+)\..+$/,"$1"); +}km=_keyMask(q.replace(/[_\+]\+/,"_plus").replace(/\+/g,"_")); +if(iQ&&kms[km]&&kms.hasOwnProperty(km)){continue; +}kms[km]={handler:hndlr,data:dat,namespace:nm,type:q,preventDefault:pdef}; +}for(i=0; +i0)?"-":"+")+((zu=((zu?z:z*-1)/60))<10?"0":"")+Math.floor(zu)):"+00"); +},_dateFrmt=function(dt,d,t,m,UTC,iso){var u,f=UTC?"getUTC":"get"; +return(d?(dt[f+"FullYear"]()+"-"+((u=dt[f+"Month"]()+1)<10?("0"+u):u)+"-"+((u=dt[f+"Date"]())<10?("0"+u):u)):"")+(d&&t?(iso?"T":" "):"")+(t?((((u=dt[f+"Hours"]())<10?("0"+u):u)+":"+((u=dt[f+"Minutes"]())<10?("0"+u):u)+":"+((u=dt[f+"Seconds"]())<10?("0"+u):u))+(m?((iso?".":" ")+((u=dt[f+"Milliseconds"]())<10?("00"+u):(u<100?("0"+u):u))):"")):"")+(!iso?"":(UTC?"Z":(_dateTz(dt,1)+":00"))); +},_dimInner=function(d,slctr,ignorePadding){var u=slctr,r,dE=document.documentElement,jq,v,p; +if(u===window){return dE["client"+d]; +}if(u===dE||u===document.body){return dE["scroll"+d]; +}if((r=_elm(0,u,0,"inner"+d))){v=r["client"+d]; +if(!ignorePadding){if((p=(jq=$(r)).css("padding-"+(d==="Width"?"left":"top"))).indexOf("px")>-1){v-=parseFloat(p); +}if((p=jq.css("padding-"+(d==="Width"?"right":"bottom"))).indexOf("px")>-1){v-=parseFloat(p); +}v=Math.round(v); +}return v; +}return undefined; +},_dimOuter=function(d,slctr,includeMargin,set,max){var u=slctr,r,dE=document.documentElement,jq,v; +if(u===window){return dE["inner"+d]||dE["client"+d]; +}if(u===dE||u===document.body){return dE["scroll"+d]; +}if((r=_elm(0,u,0,"outer"+d))){v=(jq=$(r))["outer"+d](includeMargin); +if(!set||set===v){return v; +}v=_dimInner(d,u)+(set-v); +if(!max||max===2){jq.css(d.toLowerCase(),v+"px"); +}if(max){jq.css("max-"+d.toLowerCase(),v+"px"); +}return set; +}return undefined; +},_ovrlyRsz=function(){var w=window,d=document.documentElement,dW,dD; +_jqOvrly.css({width:((dD=self.innerWidth(d))>(dW=self.innerWidth(w))?dD:dW)+"px",height:((dD=self.innerHeight(d))>(dW=self.innerHeight(w))?dD:dW)+"px"}); +}; +this.yduj=true; +this.yduJ=true; +this.version=2.1; +this.browserIE=_uaIe=(function(){var u; +if((u=window.navigator)&&(u=u.userAgent)){if(/; MSIE \d{1,2}\.\d/.test(u)){return(u=parseFloat(u.replace(/^.+; MSIE (\d{1,2}\.\d).+/,"$1")))?u:0; +}if(/; Trident\/\d+\.\d+;/.test(u)&&/; rv:\d+\.\d+[;\)]/.test(u)){return(u=parseFloat(u.replace(/^.+; rv:(\d+\.\d+)[;\)].+$/,"$1")))?u:0; +}}return 0; +}()); +this.setup=function(){self.setup=function(){}; +_dataName="judy_"+self.randName(); +}; +this.typeOf=function(u){var t=typeof u; +if(!arguments.length){return"Judy"; +}switch(t){case"boolean":case"string":return t; +case"number":return isFinite(u)?t:(isNaN(u)?"NaN":"infinite"); +case"object":if(u===null){return"null"; +}try{if(u.typeOf&&typeof u.typeOf==="function"){return u.typeOf(); +}else{if(typeof u.length==="number"&&!(u.propertyIsEnumerable("length"))&&typeof u.splice==="function"){return"array"; +}else{if(u===window){return"window"; +}else{if(u===document){return"document"; +}else{if(u===document.documentElement){return"document.documentElement"; +}else{if(u.getAttributeNode){return u.tagName.toLowerCase==="img"?"image":"element"; +}else{if(u.nodeType){switch(u.nodeType){case 3:return"textNode"; +case 2:return"attributeNode"; +}return"otherNode"; +}else{if(typeof u.stopPropagation==="function"||(u.cancelBubble!==undefined&&typeof u.cancelBubble!=="function"&&typeof u.boundElements==="object")){return"event"; +}else{if(typeof u.getUTCMilliseconds==="function"){return"date"; +}else{if(typeof u.exec==="function"&&typeof u.test==="function"){return"regexp"; +}else{if(u.hspace&&typeof u.hspace!=="function"){return"image"; +}else{if(u.jquery&&typeof u.jquery==="string"&&!u.hasOwnProperty("jquery")){return"jquery"; +}}}}}}}}}}}}}catch(er){}return t; +case"function":return(u.constructor===RegExp||(typeof u.exec==="function"&&typeof u.test==="function"))?"regexp":t; +}return t; +}; +this.isContainer=function(u,orArray){var t; +return u&&typeof u==="object"&&((t=self.typeOf(u))==="object"||(orArray&&t==="array")||(t!=="array"&&self.arrayIndexOf(_nonObj,t)===-1))?(!orArray||t!=="array"?"object":t):false; +}; +this.isArray=function(u){return(u&&typeof u==="object"&&typeof u.length==="number"&&!(u.propertyIsEnumerable("length"))&&typeof u.splice==="function"); +}; +this.isNumber=function(u){return typeof u==="number"&&isFinite(u); +}; +this.isInt=function(u,nonNegative){return typeof u==="number"&&isFinite(u)&&(u%1===0)&&(!nonNegative||u>-1); +}; +this.containerCopy=function(oa,shallow){var t,c={},p,v; +if(!oa||!(t=self.isContainer(oa,true))){return oa; +}if(t==="array"){if(shallow){return oa.concat(); +}c=[]; +}for(p in oa){if(oa.hasOwnProperty(p)){c[p]=((v=oa[p])&&typeof v==="object")?(v===oa?c:(!shallow?self.containerCopy(v,false):v)):v; +}}return c; +}; +this.objectGet=function(o,anyNumberOfKeys){var a=arguments,le=a.length,u=o,p,i; +try{if(!u||typeof u!=="object"){throw new Error("arg o isnt object"); +}if(le<2){throw new Error("no key arg"); +}for(i=1; +i1&&(!u||typeof u!=="object")){return undefined; +}if((!(p=a[i])&&p!==0)||!(p=""+p)){throw new Error("arg #"+i+"["+p+"] type["+self.typeOf(p)+"] isnt integer or non-empty string"); +}if(u.hasOwnProperty(p)){u=u[p]; +}else{return undefined; +}}return u; +}catch(er){_errorHandler(er,null,_name+".objectGet()"); +}return undefined; +}; +this.objectKeys=function(o){var a,k; +if(!o||typeof o!=="object"){return null; +}if(typeof Object.keys==="function"){return Object.keys(o); +}a=[]; +for(k in o){if(o.hasOwnProperty(k)){a.push(k); +}}return a; +}; +this.objectKeyOf=function(o,v){var k; +if(v!==undefined&&o||typeof o==="object"){for(k in o){if(o.hasOwnProperty(k)&&o[k]===v){return k; +}}}return undefined; +}; +this.objectSort=function(o){var a=[],oByVal={},os={},k,v,cNum=String.fromCharCode(127),le,i=0; +if(!o||typeof o!=="object"){return o; +}for(k in o){if(o.hasOwnProperty(k)){++i; +oByVal[(typeof(v=o[k])!=="number"?"":cNum)+v]=k; +a.push(v); +}}if(!i){return o; +}le=i; +a.sort(); +for(i=0; +i=le){oa.push(v1); +}else{if((v=oa[p])===undefined){oa[p]=v1; +}else{if(v1!==null){if(!(t=self.isContainer(v,true))||self.isContainer(v1,true)!==t){oa[p]=v1; +}else{self.merge(v,v1,t,d+1); +}}}}}}}}return true; +}}throw new TypeError("Type mismatch, first is array, second is type["+self.typeOf(oa1)+"]"); +}throw new TypeError("First arg is type["+self.typeOf(oa)+"], second is type["+self.typeOf(oa1)+"]"); +}throw new Error("Cant recurse > 10, circular ref?"); +}catch(er){_errorHandler(er,null,_name+".merge()"); +}return false; +}; +this.ancestor=function(selector,parentSelector,max){var u,r=_elm(0,selector,null,"ancestor"),tt=parentSelector,lim=max&&max>0?(max+1):101,id,aCls,tn,cls,le,i; +if(!r||r===window||r===document.documentElement){return undefined; +}if(!tt||!(tt=$.trim(""+tt))){return r.parentNode; +}if(tt.indexOf("#")>-1){u=tt.replace(/^([^\#]+)?\#([^\.]+)(\..+)?$/,"$2,$1$3").split(","); +id=u[0]; +tt=u[1]||""; +}if(tt.indexOf(".")>-1){aCls=tt.split("."); +tt=aCls[0]; +aCls.splice(0,1); +le=aCls.length; +}tt=tt.toLowerCase(); +while((--lim)&&(r=r.parentNode)){if(r.nodeType!==1||tn==="body"){return undefined; +}tn=r.tagName.toLowerCase(); +if((tt&&tn!==tt)||(id&&r.id!==id)){continue; +}if(le){if(!(cls=r.className).length){continue; +}cls=" "+cls+" "; +u=0; +for(i=0; +i7&&o.hasOwnProperty(k)&&k.indexOf("jQuery")===0){if(!(o=o[k])||!o.events||!o.hasOwnProperty("events")){return null; +}}}}}if(!o){return null; +}if(!type){return o.events; +}o=o.events; +for(k in o){if(k===type&&o.hasOwnProperty(k)){return o[k]; +}}return null; +}; +this.isField=function(elm,button){return typeof elm==="object"&&elm.tagName?(_fieldType(elm,button)?true:false):undefined; +}; +this.fieldType=function(selector,context,button){var r=_elm(0,selector,context,"fieldType"); +return r?_fieldType(r,button):undefined; +}; +this.fieldValue=function(selector,context,val,type){var r=_elm(0,selector,context,"fieldValue"),t; +if(r&&(t=type||_fieldType(r,true))){switch(t){case"select":return _valSelect(r,val); +case"checkbox":return _valCheckbox(r,val); +case"checkboxes":case"checklist":return _valChecklist(r,val); +case"radio":case"radios":return _valRadio(r,context,val); +case"image":t="src"; +default:t=""; +}if(val===undefined){return !t?r.value:r.getAttribute(t); +}if(!t){r.value=""+val; +}else{r.setAttribute(t,""+val); +}return true; +}return undefined; +}; +this.disable=function(selector,context,hoverTitle){_disable(0,selector,context,hoverTitle); +}; +this.enable=function(selector,context,hoverTitle){_disable(1,selector,context,hoverTitle); +}; +this.scrollTrap=function(selector,context,eventName){var a=_elm(true,selector,context,"scrollTrap"),nm=eventName||(_name+".scrollTrap"); +if(a){$(a).each(function(){var preventZone=100,halfZone,s=this.scrollTop,$self=$(this),$chlds,le,$chld,h; +if(!$self.hasClass("scroll-trapped")){if((le=($chlds=$self.children()).get().length)===1){$chld=$($chlds.get(0)); +}else{if(le){$chld=$chlds.wrapAll("
").parent(); +}else{return; +}}$self.addClass("scroll-trapped"); +if((h=this.clientHeight)<1.5*preventZone){preventZone=Math.floor(h/1.5); +}halfZone=Math.floor(preventZone/2); +$chld.css({"margin-top":preventZone+"px","margin-bottom":preventZone+"px"}); +this.scrollTop=s+preventZone; +$self.bind("scroll."+nm,function(){var that=this,s=that.scrollTop,h; +if(s(h=that.scrollHeight-that.clientHeight)-halfZone){that.scrollTop=h-halfZone; +setTimeout(function(){that.scrollTop=h-preventZone; +},100); +}}}); +}}); +}}; +this.scrollTo=function(selector,context,offset,pad){var u,par,r,to=offset,p=pad||0,num,$par,chld,prvntZn=0,max=-1; +if((par=_elm(0,selector,context,"scrollTo"))){if(!to||typeof to==="number"||!(r=_elm(0,to,par,"",true))){num=true; +to=!to||!isFinite(to)||to<0?0:to; +}if(($par=$(par)).hasClass("scroll-trapped")&&(chld=$par.children().get(0))){prvntZn=parseInt($(chld).css("margin-top").replace(/px/,""),10); +max=par.scrollHeight-par.clientHeight-Math.floor(prvntZn*0.75); +}if(num){to+=prvntZn; +}else{par.scrollTop=prvntZn; +to=(r.offsetTop-par.offsetTop); +}if(p&&prvntZn&&p<0&&(p*-1)>(u=Math.floor(prvntZn/4))){p=-u; +}to+=p; +if(max>0&&to>max){to=max; +}par.scrollTop=to; +}}; +this.focus=function(selector,context,delay){var d=delay||0,to; +if(selector){to=setTimeout(function(){var r; +if((r=_elm(0,selector,context,"",true))){try{r.focus(); +}catch(er){}}},d>=0?d:20); +}}; +this.innerWidth=function(selector,ignorePadding){return _dimInner("Width",selector,ignorePadding); +}; +this.innerHeight=function(selector,ignorePadding){return _dimInner("Height",selector,ignorePadding); +}; +this.outerWidth=function(selector,includeMargin,set,max){return _dimOuter("Width",selector,includeMargin,set,max); +}; +this.outerHeight=function(selector,includeMargin,set,max){return _dimOuter("Height",selector,includeMargin,set,max); +}; +this.stripTags=function(u){return $.trim((""+u).replace(/<[^<>]+>/g," ").replace(/[ ]+/g," ")); +}; +this.toLeading=function(u,length){var le=length||1; +return(new Array(le).join("0")+u).substr(-le,le); +}; +this.toUpperCaseFirst=function(u){var s=""+u,le=s.length; +return !le?"":(s.charAt(0).toUpperCase()+(le<2?"":s.substr(1))); +}; +this.isLeapYear=function(u){var y; +switch(self.typeOf(u)){case"date":y=u.getFullYear(); +break; +case"number":y=u; +break; +case"string":y=parseInt(u,10); +break; +default:return null; +}if(isFinite(y)&&u>-1&&u%1===0){return(!(y%4)&&(y%100))||!(y%400); +}return null; +}; +this.dateISO=function(date,UTC){var d=date||new Date(); +return UTC&&Date.prototype.toISOString?d.toISOString():_dateFrmt(d,1,1,1,UTC,1); +}; +this.dateTime=function(date,UTC){var d=date||new Date(); +return UTC&&Date.prototype.toISOString?d.toISOString().replace(/T/," ").replace(/\.\d{3}Z$/,""):_dateFrmt(d,1,1,0,UTC); +}; +this.dateToFormat=function(date,sFormat){var u=date,fmt=sFormat||"YYYY-MM-DD",le,y,m,d,s,a,b; +if(u&&typeof u==="object"&&u.getFullYear){y=u.getFullYear(); +m=self.toLeading(u.getMonth()+1,2); +d=self.toLeading(u.getDate(),2); +if((a=(s=fmt.substr(0,10)).replace(/[MDY]/g,"")).length<2){return""; +}b=a.charAt(1); +a=a.charAt(0); +switch(s.replace(/[^MDY]/g,"")){case"YYYYMMDD":s=y+a+m+b+d; +break; +case"MMDDYYYY":s=m+a+d+b+y; +break; +case"DDMMYYYY":s=d+a+m+b+y; +break; +default:return""; +}if((le=fmt.length)>11){s+=" "+self.toLeading(u.getHours(),2); +if(le>14){s+=":"+self.toLeading(u.getMinutes(),2); +if(le>17){s+=":"+self.toLeading(u.getSeconds(),2); +if(le>20){s+=" "+self.toLeading(u.getMilliseconds(),3); +}}}}return s; +}else{try{throw new Error("date["+u+"] type["+self.typeOf(u)+"] is not a non-empty Date"); +}catch(er){_errorHandler(er,null,_name+".dateToFormat()"); +}return""; +}}; +this.dateFromFormat=function(sDate,sFormat){var s=sDate,dt=new Date(),fmt=sFormat||"YYYY-MM-DD",y,m,d; +if(s&&typeof s==="string"){if(/^YYYY.MM.DD$/.test(fmt)){y=s.substr(0,4); +m=s.substr(5,2); +d=s.substr(8,2); +}else{if(/^MM.DD.YYYY$/.test(fmt)){y=s.substr(6,4); +m=s.substr(0,2); +d=s.substr(3,2); +}else{if(/^DD.MM.YYYY$/.test(fmt)){y=s.substr(6,4); +m=s.substr(3,2); +d=s.substr(0,2); +}else{return null; +}}}y=parseInt(y,10); +d=parseInt(d,10); +switch((m=parseInt(m,10))){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(d>31){return null; +}break; +case 4:case 6:case 9:case 11:if(d>30){return null; +}break; +case 2:if(d>29||(d===29&&!self.isLeapYear(y))){return null; +}break; +default:return null; +}dt.setFullYear(y,m-1,d); +dt.setHours(0,0,0); +dt.setMilliseconds(0); +return dt; +}else{try{throw new Error("date["+s+"] type["+self.typeOf(s)+"] is not non-empty string"); +}catch(er){_errorHandler(er,null,_name+".dateFromFormat()"); +}return null; +}}; +this.timeFormat=function(date,sTime){var d=date,t=sTime?$.trim(sTime):0,h=0,i=0,s=0,le,v; +if(d&&typeof d==="object"&&d.getFullYear){if(t){if(/^\d+$/.test(t)){h=t.substr(0,2); +if((le=t.length)>3){i=t.substr(2,2); +if(le>5){s=t.substr(4,2); +}}}else{if((le=(t=t.split(/[^\d]/)).length)){h=t[0]; +if(le>1){i=t[1]; +if(le>2){s=t[2]; +}}}}if(h){h=isFinite(v=parseInt(h,10))&&v<25?v:0; +if(i){i=isFinite(v=parseInt(i,10))&&v<60?v:0; +}if(s){s=isFinite(v=parseInt(s,10))&&v<60?v:0; +}if(h===24){if(!i&&!s){h=23; +i=s=59; +}else{h=0; +}}}d.setHours(h,i,s); +}else{h=d.getHours(); +i=d.getMinutes(); +s=d.getSeconds(); +}return""+(h<10?"0":"")+h+":"+(i<10?"0":"")+i+":"+(s<10?"0":"")+s; +}else{try{throw new Error("date["+d+"] type["+self.typeOf(d)+"] is not a non-empty Date"); +}catch(er){_errorHandler(er,null,_name+".timeFormat()"); +}return"00:00:00"; +}}; +this.numberToFormat=function(num,oFormat){var n=num||0,s,sgn="",o,isInt,kSep,scale,u,le,d,i; +if(!n){return"0"; +}if(n<0){n*=-1; +sgn="-"; +}isInt=!(u=(o=oFormat||{}).type)||u==="integer"; +kSep=(u=o.thousand_separator)||u===""?u:" "; +if((d=n%1)){n=Math.round(n); +}s=""+n; +if(kSep&&(le=s.length)>3){n=s; +s=n.substr(0,i=le%3); +while(i-1){d=s.substr(p).replace(/\D/g,""); +s=s.substr(0,p); +}n=parseInt(s.replace(/\D/g,""),10); +if(d){n+=parseInt(d,10)/Math.pow(10,d.length); +}return sgn*(!isInt?n:Math.round(n)); +}return 0; +}; +this.rand=function(min,max){var m=min||0; +return m+Math.floor((Math.random()*(((max||9000000000000000)-m)+1))+1)-1; +}; +this.randName=function(length){var al=length||20,l,s=String.fromCharCode(Math.floor(Math.random()*26)+97); +while((l=s.length)al?s.substr(0,al):s; +}; +this.overlay=function(show,opaque,hoverTitle){var hide=!show||typeof show==="object",ttl=hoverTitle||"",clsO="module-judy-overlay-opaque",clsT="module-judy-overlay-hovertitled"; +if(!_jqOvrly){if(hide){return; +}$(document.body).append('
'); +_jqOvrly=$("div#module_judy_overlay"); +_ovrlyRsz(); +$(window).resize(function(){_ovrlyRsz(); +}); +}else{if(hide){_jqOvrly.hide(); +return; +}else{_jqOvrly[opaque?"addClass":"removeClass"](clsO)[ttl?"addClass":"removeClass"](clsT).get(0).setAttribute("title",ttl); +}}_jqOvrly.show(); +}; +this.dialog=function(selector,option,value){var sl=selector,u=option,t,s,o,v=value,keys,a,tg="",id="",cls="module-judy-dialog",cls1="",elm,jq,dialExists,fxd,title,doOpen,autoOpenLater,to; +if($.ui&&typeof $.ui.dialog==="function"){if(u){if((t=typeof u)==="string"){if(u!=="option"){s=u; +}else{if(v&&typeof v==="object"){o=self.containerCopy(v); +}}}else{if(t==="object"){o=self.containerCopy(u); +}}}if(sl){if(typeof sl==="string"){if(sl.indexOf("#")===-1&&sl.indexOf(".")===-1){if((elm=document.getElementById(id=sl))&&self.arrayIndexOf(_dialogs,id)>-1){dialExists=true; +}}else{if((elm=$(sl).get(0))){if((id=elm.id)){if(self.arrayIndexOf(_dialogs,id)>-1){dialExists=true; +}}else{id=elm.id=self.randName(); +}}else{a=sl.replace(/^([a-z\d_\-]+)?(\#[a-z\d_\-]+)?(\.[a-z\d_\-]+)?$/,"$1,$2,$3").split(","); +tg=a[0]; +id=a[1]?a[1].substr(1):self.randName(); +if(a[2]){cls1=" "+a[2].split(/\./).join(" "); +}}}}else{if(typeof sl==="object"&&sl.getAttributeNode){if((id=elm.id)){if(self.arrayIndexOf(_dialogs,id)>-1){dialExists=true; +}}else{id=elm.id=self.randName(); +}}}}else{id=self.randName(); +}if(dialExists){doOpen=false; +jq=$(elm); +if(o){delete o.fixed; +if((keys=self.objectKeys(o)).length===1){v=o[s=keys[0]]; +}}if(s){if(s==="content"){if(jq.dialog("isOpen")){doOpen=true; +}jq.html(v); +if(doOpen){if(doOpen){to=setTimeout(function(){jq.dialog("open"); +},100); +}}return id; +}if(s==="getContent"){return jq.html(); +}if(s==="title"){$(".ui-dialog-title",$(elm.parentNode)).html(v); +return id; +}else{if(self.arrayIndexOf(_dialOpts,s)>-1||self.arrayIndexOf(_dialEvts,s)>-1){jq.dialog("option",s,v); +}}if(self.arrayIndexOf(_dialMthds,s)>-1){return jq.dialog(s); +}jq.dialog(s,v); +return id; +}else{if(o){if(jq.dialog("isOpen")){doOpen=true; +jq.dialog("close"); +}if(o.close&&o.hasOwnProperty("close")&&typeof o.close!=="function"){doOpen=false; +delete o.close; +}if(o.content!==undefined&&o.hasOwnProperty("content")){jq.html(v); +delete o.content; +}if(o.open&&o.hasOwnProperty("open")){doOpen=true; +delete o.open; +}jq.dialog(o); +if(doOpen){to=setTimeout(function(){jq.dialog("open"); +},100); +}}}return id; +}doOpen=true; +if(!o){o={}; +if(s){o[s]=v; +}}if(!elm){$(document.body).append("<"+(tg||"div")+' id="'+id+'" class="'+cls+cls1+(!o.contentClass?"":(" "+o.contentClass))+'">"); +elm=document.getElementById(id); +}jq=$(elm); +if(o.open&&o.hasOwnProperty("open")){delete o.open; +}if(!o.autoOpen&&o.hasOwnProperty("autoOpen")){doOpen=false; +}else{autoOpenLater=true; +o.autoOpen=false; +}if((u=self.objectGet(o,"content"))){jq.html(u); +delete o.content; +}if(o.fixed&&o.hasOwnProperty("fixed")){fxd=true; +delete o.fixed; +}if(o.title&&o.hasOwnProperty("title")){title=o.title; +delete o.title; +}jq.dialog(o); +u=$(elm.parentNode); +if(fxd){u.css("position","fixed"); +}if(title!==undefined){$(".ui-dialog-title",u).html(title); +}u.addClass(cls+"-container"); +_dialogs.push(id); +if(doOpen){to=setTimeout(function(){jq.dialog("open"); +if(autoOpenLater){jq.dialog("autoOpen",true); +}},100); +}return id; +}try{throw new Error("jQuery UI Dialog not included"); +}catch(er){_errorHandler(er,null,_name+".dialog()"); +}return false; +}; +this.timer=function(o,func,args,delay){return new self.Timer(o,func,args,delay); +}; +this.Timer=function(o,func,args,delay){var a=args||[],fired=false,f=o?function(){fired=true; +try{func.apply(o,a); +}catch(er){}}:function(){fired=true; +try{func(); +}catch(er){}},t=window.setTimeout(f,delay||0); +this.fired=function(){return fired; +}; +this.cancel=function(){window.clearTimeout(t); +}; +}; +}; +(Drupal.Judy=window.Judy=window.judy=new Judy($)).setup(); +})(jQuery); diff --git a/sites/all/modules/contrib/judy/judy.module b/sites/all/modules/contrib/judy/judy.module new file mode 100644 index 00000000..fd93657d --- /dev/null +++ b/sites/all/modules/contrib/judy/judy.module @@ -0,0 +1,55 @@ +Use' + . '

' . t('Include in form generating functions') . ':
drupal_add_library(\'judy\', \'judy\');

' + . '

Documentation

' + . '

' + . l( + t('Full jsDoc documentation of the library'), + 'http://www.simple-complex.net/docs/drupal/modules/judy/js/symbols/Judy.html' + ) + . '

'; + } +} + +/** + * Makes the modules' Javascript library available for inclusion. + * + * Implements hook_library(). + * + * @code + * drupal_add_library('judy', 'judy'); + * @endcode + * @return array + */ +function judy_library() { + $path = drupal_get_path('module', 'judy'); + return array( + 'judy' => array( + 'title' => 'Judy Javascript Utilities', + 'website' => 'http://drupal.org/project/judy', + 'version' => 2.1, + 'js' => array( + $path . '/judy' . '.min' . '.js' => array(), + ), + 'css' => array( + $path . '/judy' . '.min' . '.css' => array(), + ), + ) + ); +}